Move the init of trackers in the app restriction controller to bg.
Also postpone the initialization of the permission tracker as it doesn't need to be done before system ready. Bug: 219140433 Test: BootTimeTest Change-Id: I2c13252ec6ded1f51f3a13832c8c0a55da359b95
This commit is contained in:
@@ -64,6 +64,8 @@ final class AppPermissionTracker extends BaseAppStateTracker<AppPermissionPolicy
|
||||
@GuardedBy("mLock")
|
||||
private SparseArray<ArraySet<String>> mUidGrantedPermissionsInMonitor = new SparseArray<>();
|
||||
|
||||
private volatile boolean mLockedBootCompleted = false;
|
||||
|
||||
AppPermissionTracker(Context context, AppRestrictionController controller) {
|
||||
this(context, controller, null, null);
|
||||
}
|
||||
@@ -85,20 +87,20 @@ final class AppPermissionTracker extends BaseAppStateTracker<AppPermissionPolicy
|
||||
final PackageManagerInternal pmi = mInjector.getPackageManagerInternal();
|
||||
final PermissionManagerServiceInternal pm = mInjector.getPermissionManagerServiceInternal();
|
||||
final String[] permissions = mInjector.getPolicy().getBgPermissionsInMonitor();
|
||||
final SparseArray<ArraySet<String>> uidPerms = mUidGrantedPermissionsInMonitor;
|
||||
for (int userId : allUsers) {
|
||||
final List<ApplicationInfo> apps = pmi.getInstalledApplications(0, userId, SYSTEM_UID);
|
||||
if (apps == null) {
|
||||
continue;
|
||||
}
|
||||
synchronized (mLock) {
|
||||
final SparseArray<ArraySet<String>> uidPerms = mUidGrantedPermissionsInMonitor;
|
||||
final long now = SystemClock.elapsedRealtime();
|
||||
for (int i = 0, size = apps.size(); i < size; i++) {
|
||||
final ApplicationInfo ai = apps.get(i);
|
||||
for (String permission : permissions) {
|
||||
if (pm.checkUidPermission(ai.uid, permission) != PERMISSION_GRANTED) {
|
||||
continue;
|
||||
}
|
||||
final long now = SystemClock.elapsedRealtime();
|
||||
for (int i = 0, size = apps.size(); i < size; i++) {
|
||||
final ApplicationInfo ai = apps.get(i);
|
||||
for (String permission : permissions) {
|
||||
if (pm.checkUidPermission(ai.uid, permission) != PERMISSION_GRANTED) {
|
||||
continue;
|
||||
}
|
||||
synchronized (mLock) {
|
||||
ArraySet<String> grantedPermissions = uidPerms.get(ai.uid);
|
||||
if (grantedPermissions == null) {
|
||||
grantedPermissions = new ArraySet<String>();
|
||||
@@ -132,25 +134,30 @@ final class AppPermissionTracker extends BaseAppStateTracker<AppPermissionPolicy
|
||||
private void handlePermissionsChanged(int uid) {
|
||||
final String[] permissions = mInjector.getPolicy().getBgPermissionsInMonitor();
|
||||
if (permissions != null && permissions.length > 0) {
|
||||
final PermissionManagerServiceInternal pm =
|
||||
mInjector.getPermissionManagerServiceInternal();
|
||||
final boolean[] states = new boolean[permissions.length];
|
||||
for (int i = 0; i < permissions.length; i++) {
|
||||
states[i] = pm.checkUidPermission(uid, permissions[i]) == PERMISSION_GRANTED;
|
||||
if (DEBUG_PERMISSION_TRACKER) {
|
||||
Slog.i(TAG, UserHandle.formatUid(uid) + " " + permissions[i] + "=" + states[i]);
|
||||
}
|
||||
}
|
||||
synchronized (mLock) {
|
||||
handlePermissionsChangedLocked(uid);
|
||||
handlePermissionsChangedLocked(uid, permissions, states);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@GuardedBy("mLock")
|
||||
private void handlePermissionsChangedLocked(int uid) {
|
||||
final PermissionManagerServiceInternal pm = mInjector.getPermissionManagerServiceInternal();
|
||||
private void handlePermissionsChangedLocked(int uid, String[] permissions, boolean[] states) {
|
||||
final int index = mUidGrantedPermissionsInMonitor.indexOfKey(uid);
|
||||
ArraySet<String> grantedPermissions = index >= 0
|
||||
? mUidGrantedPermissionsInMonitor.valueAt(index) : null;
|
||||
final String[] permissions = mInjector.getPolicy().getBgPermissionsInMonitor();
|
||||
final long now = SystemClock.elapsedRealtime();
|
||||
for (String permission: permissions) {
|
||||
boolean granted = pm.checkUidPermission(uid, permission) == PERMISSION_GRANTED;
|
||||
if (DEBUG_PERMISSION_TRACKER) {
|
||||
Slog.i(TAG, UserHandle.formatUid(uid) + " " + permission + "=" + granted);
|
||||
}
|
||||
for (int i = 0; i < permissions.length; i++) {
|
||||
final String permission = permissions[i];
|
||||
final boolean granted = states[i];
|
||||
boolean changed = false;
|
||||
if (granted) {
|
||||
if (grantedPermissions == null) {
|
||||
@@ -200,6 +207,10 @@ final class AppPermissionTracker extends BaseAppStateTracker<AppPermissionPolicy
|
||||
}
|
||||
|
||||
private void onPermissionTrackerEnabled(boolean enabled) {
|
||||
if (!mLockedBootCompleted) {
|
||||
// Not ready, bail out.
|
||||
return;
|
||||
}
|
||||
final PermissionManager pm = mInjector.getPermissionManager();
|
||||
if (enabled) {
|
||||
pm.addOnPermissionsChangeListener(this);
|
||||
@@ -210,6 +221,12 @@ final class AppPermissionTracker extends BaseAppStateTracker<AppPermissionPolicy
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
void onLockedBootCompleted() {
|
||||
mLockedBootCompleted = true;
|
||||
onPermissionTrackerEnabled(mInjector.getPolicy().isEnabled());
|
||||
}
|
||||
|
||||
@Override
|
||||
void dump(PrintWriter pw, String prefix) {
|
||||
pw.print(prefix);
|
||||
|
||||
@@ -71,6 +71,7 @@ import static android.os.PowerExemptionManager.REASON_SYSTEM_MODULE;
|
||||
import static android.os.PowerExemptionManager.REASON_SYSTEM_UID;
|
||||
import static android.os.PowerExemptionManager.reasonCodeToString;
|
||||
import static android.os.Process.SYSTEM_UID;
|
||||
import static android.os.Process.THREAD_PRIORITY_BACKGROUND;
|
||||
|
||||
import static com.android.internal.notification.SystemNotificationChannels.ABUSIVE_BACKGROUND_APPS;
|
||||
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
|
||||
@@ -792,7 +793,7 @@ public final class AppRestrictionController {
|
||||
mInjector = injector;
|
||||
mContext = injector.getContext();
|
||||
mActivityManagerService = service;
|
||||
mBgHandlerThread = new HandlerThread("bgres-controller");
|
||||
mBgHandlerThread = new HandlerThread("bgres-controller", THREAD_PRIORITY_BACKGROUND);
|
||||
mBgHandlerThread.start();
|
||||
mBgHandler = new BgHandler(mBgHandlerThread.getLooper(), injector);
|
||||
mBgExecutor = new HandlerExecutor(mBgHandler);
|
||||
@@ -816,9 +817,11 @@ public final class AppRestrictionController {
|
||||
mInjector.getAppStandbyInternal().addListener(mAppIdleStateChangeListener);
|
||||
mInjector.getRoleManager().addOnRoleHoldersChangedListenerAsUser(mBgExecutor,
|
||||
mRoleHolderChangedListener, UserHandle.ALL);
|
||||
for (int i = 0, size = mAppStateTrackers.size(); i < size; i++) {
|
||||
mAppStateTrackers.get(i).onSystemReady();
|
||||
}
|
||||
mInjector.scheduleInitTrackers(mBgHandler, () -> {
|
||||
for (int i = 0, size = mAppStateTrackers.size(); i < size; i++) {
|
||||
mAppStateTrackers.get(i).onSystemReady();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
@@ -2137,6 +2140,10 @@ public final class AppRestrictionController {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
void scheduleInitTrackers(Handler handler, Runnable initializers) {
|
||||
handler.post(initializers);
|
||||
}
|
||||
}
|
||||
|
||||
private void registerForSystemBroadcasts() {
|
||||
@@ -2221,6 +2228,21 @@ public final class AppRestrictionController {
|
||||
userFilter.addAction(Intent.ACTION_USER_REMOVED);
|
||||
userFilter.addAction(Intent.ACTION_UID_REMOVED);
|
||||
mContext.registerReceiverForAllUsers(broadcastReceiver, userFilter, null, mBgHandler);
|
||||
final BroadcastReceiver bootReceiver = new BroadcastReceiver() {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
final String action = intent.getAction();
|
||||
switch (intent.getAction()) {
|
||||
case Intent.ACTION_LOCKED_BOOT_COMPLETED: {
|
||||
onLockedBootCompleted();
|
||||
} break;
|
||||
}
|
||||
}
|
||||
};
|
||||
final IntentFilter bootFilter = new IntentFilter();
|
||||
bootFilter.addAction(Intent.ACTION_LOCKED_BOOT_COMPLETED);
|
||||
mContext.registerReceiverAsUser(bootReceiver, UserHandle.SYSTEM,
|
||||
bootFilter, null, mBgHandler);
|
||||
}
|
||||
|
||||
void forEachTracker(Consumer<BaseAppStateTracker> sink) {
|
||||
@@ -2275,6 +2297,12 @@ public final class AppRestrictionController {
|
||||
mRestrictionSettings.removeUid(uid);
|
||||
}
|
||||
|
||||
private void onLockedBootCompleted() {
|
||||
for (int i = 0, size = mAppStateTrackers.size(); i < size; i++) {
|
||||
mAppStateTrackers.get(i).onLockedBootCompleted();
|
||||
}
|
||||
}
|
||||
|
||||
boolean isBgAutoRestrictedBucketFeatureFlagEnabled() {
|
||||
return mConstantsObserver.mBgAutoRestrictedBucket;
|
||||
}
|
||||
|
||||
@@ -203,6 +203,12 @@ public abstract class BaseAppStateTracker<T extends BaseAppStatePolicy> {
|
||||
void onUserRemoved(final @UserIdInt int userId) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the system sends LOCKED_BOOT_COMPLETED.
|
||||
*/
|
||||
void onLockedBootCompleted() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when a device config property in the activity manager namespace
|
||||
* has changed.
|
||||
|
||||
@@ -2648,6 +2648,11 @@ public final class BackgroundRestrictionTest {
|
||||
AppPermissionTracker getAppPermissionTracker() {
|
||||
return mAppPermissionTracker;
|
||||
}
|
||||
|
||||
@Override
|
||||
void scheduleInitTrackers(Handler handler, Runnable initializers) {
|
||||
initializers.run();
|
||||
}
|
||||
}
|
||||
|
||||
private class TestBaseTrackerInjector<T extends BaseAppStatePolicy>
|
||||
|
||||
Reference in New Issue
Block a user