From 81c030ffc6c7852e36267aca6dfde9e88918e14a Mon Sep 17 00:00:00 2001 From: Varun Shah Date: Mon, 11 Apr 2022 21:52:43 -0700 Subject: [PATCH] Update condition to elevate a sync adapter to ACTIVE. In addition to forcing a sync adapter to the ACTIVE bucket if it's a system package and the provider is not in the same package, now also promote it to the active bucket if it has a shared uid with a system package. Bug: 196890576 Test: atest AppStandbyControllerTests Test: atest ContentProviderTest [all] Change-Id: I2d069939e7a4f10cc31e3987fb0a41e2f75c3fd4 --- .../server/usage/AppStandbyController.java | 73 ++++++++++++++----- 1 file changed, 53 insertions(+), 20 deletions(-) diff --git a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java index c69e9013fee66..c3d6b738fc1e7 100644 --- a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java +++ b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java @@ -385,6 +385,22 @@ public class AppStandbyController */ private final Map mAppStandbyProperties = new ArrayMap<>(); + /** + * List of app-ids of system packages, populated on boot, when system services are ready. + */ + private final ArrayList mSystemPackagesAppIds = new ArrayList<>(); + + /** + * PackageManager flags to query for all system packages, including those that are disabled + * and hidden. + */ + private static final int SYSTEM_PACKAGE_FLAGS = PackageManager.MATCH_UNINSTALLED_PACKAGES + | PackageManager.MATCH_SYSTEM_ONLY + | PackageManager.MATCH_ANY_USER + | PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS + | PackageManager.MATCH_DIRECT_BOOT_AWARE + | PackageManager.MATCH_DIRECT_BOOT_UNAWARE; + /** * Whether we should allow apps into the * {@link android.app.usage.UsageStatsManager#STANDBY_BUCKET_RESTRICTED} bucket or not. @@ -585,6 +601,14 @@ public class AppStandbyController if (mPendingOneTimeCheckIdleStates) { postOneTimeCheckIdleStates(); } + + // Populate list of system packages and their app-ids. + final List systemApps = mPackageManager.getInstalledApplications( + SYSTEM_PACKAGE_FLAGS); + for (int i = 0, size = systemApps.size(); i < size; i++) { + final ApplicationInfo appInfo = systemApps.get(i); + mSystemPackagesAppIds.add(UserHandle.getAppId(appInfo.uid)); + } } else if (phase == PHASE_BOOT_COMPLETED) { setChargingState(mInjector.isCharging()); @@ -602,27 +626,25 @@ public class AppStandbyController // Get sync adapters for the authority String[] packages = ContentResolver.getSyncAdapterPackagesForAuthorityAsUser( authority, userId); + final PackageManagerInternal pmi = mInjector.getPackageManagerInternal(); final long elapsedRealtime = mInjector.elapsedRealtime(); - for (String packageName: packages) { - // Only force the sync adapters to active if the provider is not in the same package and - // the sync adapter is a system package. - try { - PackageInfo pi = mPackageManager.getPackageInfoAsUser( - packageName, PackageManager.MATCH_SYSTEM_ONLY, userId); - if (pi == null || pi.applicationInfo == null) { - continue; + for (String packageName : packages) { + // Don't force the sync adapter to active if the provider is in the same APK. + if (packageName.equals(providerPkgName)) { + continue; + } + + final int appId = UserHandle.getAppId(pmi.getPackageUid(packageName, 0, userId)); + // Elevate the sync adapter to active if it's a system app or + // is a non-system app and shares its app id with a system app. + if (mSystemPackagesAppIds.contains(appId)) { + final List linkedProfiles = getCrossProfileTargets(packageName, + userId); + synchronized (mAppIdleLock) { + reportNoninteractiveUsageCrossUserLocked(packageName, userId, + STANDBY_BUCKET_ACTIVE, REASON_SUB_USAGE_SYNC_ADAPTER, + elapsedRealtime, mSyncAdapterTimeoutMillis, linkedProfiles); } - if (!packageName.equals(providerPkgName)) { - final List linkedProfiles = getCrossProfileTargets(packageName, - userId); - synchronized (mAppIdleLock) { - reportNoninteractiveUsageCrossUserLocked(packageName, userId, - STANDBY_BUCKET_ACTIVE, REASON_SUB_USAGE_SYNC_ADAPTER, - elapsedRealtime, mSyncAdapterTimeoutMillis, linkedProfiles); - } - } - } catch (PackageManager.NameNotFoundException e) { - // Shouldn't happen } } } @@ -2190,7 +2212,18 @@ public class AppStandbyController for (int i = mHeadlessSystemApps.size() - 1; i >= 0; --i) { pw.print(" "); pw.print(mHeadlessSystemApps.valueAt(i)); - pw.println(","); + if (i != 0) pw.println(","); + } + } + pw.println("]"); + pw.println(); + + pw.println("mSystemPackagesAppIds=["); + synchronized (mSystemPackagesAppIds) { + for (int i = mSystemPackagesAppIds.size() - 1; i >= 0; --i) { + pw.print(" "); + pw.print(mSystemPackagesAppIds.get(i)); + if (i != 0) pw.println(","); } } pw.println("]");