diff options
author | Kweku Adams <kwekua@google.com> | 2020-06-02 14:04:27 -0700 |
---|---|---|
committer | Kweku Adams <kwekua@google.com> | 2020-06-12 10:37:45 -0700 |
commit | 8604fd74ff4acb4e38fe912ca77620e10ab438c9 (patch) | |
tree | 4634123f27db7d877e5b7e42a5c5a1efd9e82980 /apex/jobscheduler | |
parent | ae0368040f562b03b85c5a7cd119e82ff874f04f (diff) |
Offload initial headless app query to handler thread.
Query package manager for the headless system app check on the handler
thread to avoid impacting boot time.
Bug: 157941190
Test: verify cache is still populated
Change-Id: Idb446e68c0ad4e1e693b45297d5297be855849bf
Diffstat (limited to 'apex/jobscheduler')
-rw-r--r-- | apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java | 50 |
1 files changed, 33 insertions, 17 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 280a6870a5e1..062108757349 100644 --- a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java +++ b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java @@ -233,7 +233,7 @@ public class AppStandbyController implements AppStandbyInternal { * Set of system apps that are headless (don't have any declared activities, enabled or * disabled). Presence in this map indicates that the app is a headless system app. */ - @GuardedBy("mAppIdleLock") + @GuardedBy("mHeadlessSystemApps") private final ArrayMap<String, Boolean> mHeadlessSystemApps = new ArrayMap<>(); private final CountDownLatch mAdminDataAvailableLatch = new CountDownLatch(1); @@ -447,7 +447,8 @@ public class AppStandbyController implements AppStandbyInternal { userFileExists = mAppIdleHistory.userFileExists(UserHandle.USER_SYSTEM); } - loadHeadlessSystemAppCache(); + // Offload to handler thread to avoid boottime impact. + mHandler.post(this::loadHeadlessSystemAppCache); if (mPendingInitializeDefaults || !userFileExists) { initializeDefaultsForSystemApps(UserHandle.USER_SYSTEM); @@ -1121,7 +1122,9 @@ public class AppStandbyController implements AppStandbyInternal { } private boolean isHeadlessSystemApp(String packageName) { - return mHeadlessSystemApps.containsKey(packageName); + synchronized (mHeadlessSystemApps) { + return mHeadlessSystemApps.containsKey(packageName); + } } @Override @@ -1697,19 +1700,24 @@ public class AppStandbyController implements AppStandbyInternal { userId); evaluateSystemAppException(pi); } catch (PackageManager.NameNotFoundException e) { - mHeadlessSystemApps.remove(packageName); + synchronized (mHeadlessSystemApps) { + mHeadlessSystemApps.remove(packageName); + } } } - private void evaluateSystemAppException(@Nullable PackageInfo pkgInfo) { - if (pkgInfo.applicationInfo != null && pkgInfo.applicationInfo.isSystemApp()) { - synchronized (mAppIdleLock) { - if (pkgInfo.activities == null || pkgInfo.activities.length == 0) { - // Headless system app. - mHeadlessSystemApps.put(pkgInfo.packageName, true); - } else { - mHeadlessSystemApps.remove(pkgInfo.packageName); - } + /** Returns true if the exception status changed. */ + private boolean evaluateSystemAppException(@Nullable PackageInfo pkgInfo) { + if (pkgInfo == null || pkgInfo.applicationInfo == null + || !pkgInfo.applicationInfo.isSystemApp()) { + return false; + } + synchronized (mHeadlessSystemApps) { + if (pkgInfo.activities == null || pkgInfo.activities.length == 0) { + // Headless system app. + return mHeadlessSystemApps.put(pkgInfo.packageName, true) == null; + } else { + return mHeadlessSystemApps.remove(pkgInfo.packageName) != null; } } } @@ -1754,7 +1762,12 @@ public class AppStandbyController implements AppStandbyInternal { UserHandle.USER_SYSTEM); final int packageCount = packages.size(); for (int i = 0; i < packageCount; i++) { - evaluateSystemAppException(packages.get(i)); + PackageInfo pkgInfo = packages.get(i); + if (pkgInfo != null && evaluateSystemAppException(pkgInfo)) { + mHandler.obtainMessage(MSG_CHECK_PACKAGE_IDLE_STATE, + UserHandle.USER_SYSTEM, -1, pkgInfo.packageName) + .sendToTarget(); + } } } @@ -1852,9 +1865,12 @@ public class AppStandbyController implements AppStandbyInternal { pw.println(); pw.println("mHeadlessSystemApps=["); - for (int i = mHeadlessSystemApps.size() - 1; i >= 0; --i) { - pw.print(mHeadlessSystemApps.keyAt(i)); - pw.println(","); + synchronized (mHeadlessSystemApps) { + for (int i = mHeadlessSystemApps.size() - 1; i >= 0; --i) { + pw.print(" "); + pw.print(mHeadlessSystemApps.keyAt(i)); + pw.println(","); + } } pw.println("]"); pw.println(); |