Merge "Move the init of trackers in the app restriction controller to bg."

This commit is contained in:
Jing Ji
2022-02-16 17:29:51 +00:00
committed by Android (Google) Code Review
4 changed files with 78 additions and 22 deletions

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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.

View File

@@ -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>