Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 487cd5b1 authored by Hai Zhang's avatar Hai Zhang
Browse files

Revert "Introduce a new thread in system_server for the PermisisonController"

This reverts commit a256d31e.

Reason for revert: b/195145506#comment13

Fixes: 195145506
Test: presubmit
Change-Id: Ib56f2588a08d4d86e313b1e840f1081321b4ccdc
parent a256d31e
Loading
Loading
Loading
Loading
+0 −84
Original line number Diff line number Diff line
/*
 * Copyright (C) 2021 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.server;

import android.os.Handler;
import android.os.HandlerExecutor;
import android.os.Looper;
import android.os.Trace;

import com.android.internal.annotations.GuardedBy;
import com.android.server.ServiceThread;

import java.util.concurrent.Executor;

/**
 * Shared singleton thread for the system. This is a thread for handling
 * calls to and from the PermissionController and handling synchronization
 * between permissions and appops states.
 */
public final class PermissionThread extends ServiceThread {
    private static final long SLOW_DISPATCH_THRESHOLD_MS = 100;
    private static final long SLOW_DELIVERY_THRESHOLD_MS = 200;

    private static final Object sLock = new Object();

    @GuardedBy("sLock")
    private static PermissionThread sInstance;
    private static Handler sHandler;
    private static HandlerExecutor sHandlerExecutor;

    private PermissionThread() {
        super("android.perm", android.os.Process.THREAD_PRIORITY_DEFAULT, /* allowIo= */ true);
    }

    private static void ensureThreadLocked() {
        if (sInstance != null) {
            return;
        }

        sInstance = new PermissionThread();
        sInstance.start();
        final Looper looper = sInstance.getLooper();
        looper.setTraceTag(Trace.TRACE_TAG_SYSTEM_SERVER);
        looper.setSlowLogThresholdMs(
                SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHOLD_MS);
        sHandler = new Handler(sInstance.getLooper());
        sHandlerExecutor = new HandlerExecutor(sHandler);
    }

    public static PermissionThread get() {
        synchronized (sLock) {
            ensureThreadLocked();
            return sInstance;
        }
    }

    public static Handler getHandler() {
        synchronized (sLock) {
            ensureThreadLocked();
            return sHandler;
        }
    }

    public static Executor getExecutor() {
        synchronized (sLock) {
            ensureThreadLocked();
            return sHandlerExecutor;
        }
    }
}
 No newline at end of file
+1 −3
Original line number Diff line number Diff line
@@ -33,7 +33,6 @@ import android.util.Log;
import android.util.SparseArray;

import com.android.internal.annotations.GuardedBy;
import com.android.server.PermissionThread;

/**
 * Class that handles one-time permissions for a user
@@ -80,8 +79,7 @@ public class OneTimePermissionUserManager {
        mContext = context;
        mActivityManager = context.getSystemService(ActivityManager.class);
        mAlarmManager = context.getSystemService(AlarmManager.class);
        mPermissionControllerManager = new PermissionControllerManager(
                mContext, PermissionThread.getHandler());
        mPermissionControllerManager = context.getSystemService(PermissionControllerManager.class);
        mHandler = context.getMainThreadHandler();
    }

+3 −5
Original line number Diff line number Diff line
@@ -145,7 +145,6 @@ import com.android.internal.util.function.TriFunction;
import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.FgThread;
import com.android.server.LocalServices;
import com.android.server.PermissionThread;
import com.android.server.ServiceThread;
import com.android.server.SystemConfig;
import com.android.server.Watchdog;
@@ -2057,7 +2056,7 @@ public class PermissionManagerService extends IPermissionManager.Stub {
    private byte[] backupRuntimePermissions(@UserIdInt int userId) {
        CompletableFuture<byte[]> backup = new CompletableFuture<>();
        mPermissionControllerManager.getRuntimePermissionBackup(UserHandle.of(userId),
                PermissionThread.getExecutor(), backup::complete);
                mContext.getMainExecutor(), backup::complete);

        try {
            return backup.get(BACKUP_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
@@ -2102,7 +2101,7 @@ public class PermissionManagerService extends IPermissionManager.Stub {
            }
        }
        mPermissionControllerManager.applyStagedRuntimePermissionBackup(packageName,
                UserHandle.of(userId), PermissionThread.getExecutor(), (hasMoreBackup) -> {
                UserHandle.of(userId), mContext.getMainExecutor(), (hasMoreBackup) -> {
                    if (hasMoreBackup) {
                        return;
                    }
@@ -4549,8 +4548,7 @@ public class PermissionManagerService extends IPermissionManager.Stub {
            }
        }

        mPermissionControllerManager = new PermissionControllerManager(
                mContext, PermissionThread.getHandler());
        mPermissionControllerManager = mContext.getSystemService(PermissionControllerManager.class);
        mPermissionPolicyInternal = LocalServices.getService(PermissionPolicyInternal.class);
    }

+8 −9
Original line number Diff line number Diff line
@@ -64,8 +64,8 @@ import com.android.internal.app.IAppOpsService;
import com.android.internal.infra.AndroidFuture;
import com.android.internal.util.IntPair;
import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.FgThread;
import com.android.server.LocalServices;
import com.android.server.PermissionThread;
import com.android.server.SystemService;
import com.android.server.pm.UserManagerInternal;
import com.android.server.pm.parsing.pkg.AndroidPackage;
@@ -279,7 +279,7 @@ public final class PermissionPolicyService extends SystemService {
                PermissionControllerManager manager = mPermControllerManagers.get(user);
                if (manager == null) {
                    manager = new PermissionControllerManager(
                            getUserContext(getContext(), user), PermissionThread.getHandler());
                            getUserContext(getContext(), user), FgThread.getHandler());
                    mPermControllerManagers.put(user, manager);
                }
                manager.updateUserSensitiveForApp(uid);
@@ -287,9 +287,8 @@ public final class PermissionPolicyService extends SystemService {
        }, UserHandle.ALL, intentFilter, null, null);

        PermissionControllerManager manager = new PermissionControllerManager(
                getUserContext(getContext(), Process.myUserHandle()),
                PermissionThread.getHandler());
        PermissionThread.getHandler().postDelayed(manager::updateUserSensitive,
                getUserContext(getContext(), Process.myUserHandle()), FgThread.getHandler());
        FgThread.getHandler().postDelayed(manager::updateUserSensitive,
                USER_SENSITIVE_UPDATE_DELAY_MS);
    }

@@ -316,7 +315,7 @@ public final class PermissionPolicyService extends SystemService {
        if (isStarted(changedUserId)) {
            synchronized (mLock) {
                if (mIsPackageSyncsScheduled.add(new Pair<>(packageName, changedUserId))) {
                    PermissionThread.getHandler().sendMessage(PooledLambda.obtainMessage(
                    FgThread.getHandler().sendMessage(PooledLambda.obtainMessage(
                            PermissionPolicyService
                                    ::synchronizePackagePermissionsAndAppOpsForUser,
                            this, packageName, changedUserId));
@@ -422,9 +421,9 @@ public final class PermissionPolicyService extends SystemService {
            final PermissionControllerManager permissionControllerManager =
                    new PermissionControllerManager(
                            getUserContext(getContext(), UserHandle.of(userId)),
                            PermissionThread.getHandler());
                            FgThread.getHandler());
            permissionControllerManager.grantOrUpgradeDefaultRuntimePermissions(
                    PermissionThread.getExecutor(), successful -> {
                    FgThread.getExecutor(), successful -> {
                        if (successful) {
                            future.complete(null);
                        } else {
@@ -528,7 +527,7 @@ public final class PermissionPolicyService extends SystemService {
            synchronized (mLock) {
                if (!mIsUidSyncScheduled.get(uid)) {
                    mIsUidSyncScheduled.put(uid, true);
                    PermissionThread.getHandler().sendMessage(PooledLambda.obtainMessage(
                    FgThread.getHandler().sendMessage(PooledLambda.obtainMessage(
                            PermissionPolicyService::resetAppOpPermissionsIfNotRequestedForUid,
                            this, uid));
                }