Merge "Offload initial headless app query to handler thread." into rvc-dev am: bcdd5c5321
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/11708142 Change-Id: I26d938f93f3fbd91359009cf60a29735de25bc2b
This commit is contained in:
@@ -233,7 +233,7 @@ public class AppStandbyController implements AppStandbyInternal {
|
|||||||
* Set of system apps that are headless (don't have any declared activities, enabled or
|
* 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.
|
* 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 ArrayMap<String, Boolean> mHeadlessSystemApps = new ArrayMap<>();
|
||||||
|
|
||||||
private final CountDownLatch mAdminDataAvailableLatch = new CountDownLatch(1);
|
private final CountDownLatch mAdminDataAvailableLatch = new CountDownLatch(1);
|
||||||
@@ -447,7 +447,8 @@ public class AppStandbyController implements AppStandbyInternal {
|
|||||||
userFileExists = mAppIdleHistory.userFileExists(UserHandle.USER_SYSTEM);
|
userFileExists = mAppIdleHistory.userFileExists(UserHandle.USER_SYSTEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
loadHeadlessSystemAppCache();
|
// Offload to handler thread to avoid boottime impact.
|
||||||
|
mHandler.post(this::loadHeadlessSystemAppCache);
|
||||||
|
|
||||||
if (mPendingInitializeDefaults || !userFileExists) {
|
if (mPendingInitializeDefaults || !userFileExists) {
|
||||||
initializeDefaultsForSystemApps(UserHandle.USER_SYSTEM);
|
initializeDefaultsForSystemApps(UserHandle.USER_SYSTEM);
|
||||||
@@ -1121,8 +1122,10 @@ public class AppStandbyController implements AppStandbyInternal {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean isHeadlessSystemApp(String packageName) {
|
private boolean isHeadlessSystemApp(String packageName) {
|
||||||
|
synchronized (mHeadlessSystemApps) {
|
||||||
return mHeadlessSystemApps.containsKey(packageName);
|
return mHeadlessSystemApps.containsKey(packageName);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isAppIdleFiltered(String packageName, int appId, int userId,
|
public boolean isAppIdleFiltered(String packageName, int appId, int userId,
|
||||||
@@ -1697,19 +1700,24 @@ public class AppStandbyController implements AppStandbyInternal {
|
|||||||
userId);
|
userId);
|
||||||
evaluateSystemAppException(pi);
|
evaluateSystemAppException(pi);
|
||||||
} catch (PackageManager.NameNotFoundException e) {
|
} catch (PackageManager.NameNotFoundException e) {
|
||||||
|
synchronized (mHeadlessSystemApps) {
|
||||||
mHeadlessSystemApps.remove(packageName);
|
mHeadlessSystemApps.remove(packageName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void evaluateSystemAppException(@Nullable PackageInfo pkgInfo) {
|
/** Returns true if the exception status changed. */
|
||||||
if (pkgInfo.applicationInfo != null && pkgInfo.applicationInfo.isSystemApp()) {
|
private boolean evaluateSystemAppException(@Nullable PackageInfo pkgInfo) {
|
||||||
synchronized (mAppIdleLock) {
|
if (pkgInfo == null || pkgInfo.applicationInfo == null
|
||||||
|
|| !pkgInfo.applicationInfo.isSystemApp()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
synchronized (mHeadlessSystemApps) {
|
||||||
if (pkgInfo.activities == null || pkgInfo.activities.length == 0) {
|
if (pkgInfo.activities == null || pkgInfo.activities.length == 0) {
|
||||||
// Headless system app.
|
// Headless system app.
|
||||||
mHeadlessSystemApps.put(pkgInfo.packageName, true);
|
return mHeadlessSystemApps.put(pkgInfo.packageName, true) == null;
|
||||||
} else {
|
} else {
|
||||||
mHeadlessSystemApps.remove(pkgInfo.packageName);
|
return mHeadlessSystemApps.remove(pkgInfo.packageName) != null;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1754,7 +1762,12 @@ public class AppStandbyController implements AppStandbyInternal {
|
|||||||
UserHandle.USER_SYSTEM);
|
UserHandle.USER_SYSTEM);
|
||||||
final int packageCount = packages.size();
|
final int packageCount = packages.size();
|
||||||
for (int i = 0; i < packageCount; i++) {
|
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,10 +1865,13 @@ public class AppStandbyController implements AppStandbyInternal {
|
|||||||
pw.println();
|
pw.println();
|
||||||
|
|
||||||
pw.println("mHeadlessSystemApps=[");
|
pw.println("mHeadlessSystemApps=[");
|
||||||
|
synchronized (mHeadlessSystemApps) {
|
||||||
for (int i = mHeadlessSystemApps.size() - 1; i >= 0; --i) {
|
for (int i = mHeadlessSystemApps.size() - 1; i >= 0; --i) {
|
||||||
|
pw.print(" ");
|
||||||
pw.print(mHeadlessSystemApps.keyAt(i));
|
pw.print(mHeadlessSystemApps.keyAt(i));
|
||||||
pw.println(",");
|
pw.println(",");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
pw.println("]");
|
pw.println("]");
|
||||||
pw.println();
|
pw.println();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user