summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKweku Adams <kwekua@google.com>2020-06-02 14:04:27 -0700
committerKweku Adams <kwekua@google.com>2020-06-12 10:37:45 -0700
commit8604fd74ff4acb4e38fe912ca77620e10ab438c9 (patch)
tree4634123f27db7d877e5b7e42a5c5a1efd9e82980
parentae0368040f562b03b85c5a7cd119e82ff874f04f (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
-rw-r--r--apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java50
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();