summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/AppsFilter.java68
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java5
2 files changed, 61 insertions, 12 deletions
diff --git a/services/core/java/com/android/server/pm/AppsFilter.java b/services/core/java/com/android/server/pm/AppsFilter.java
index 6d24a3bc0cd4..dac2e4ff4c62 100644
--- a/services/core/java/com/android/server/pm/AppsFilter.java
+++ b/services/core/java/com/android/server/pm/AppsFilter.java
@@ -640,24 +640,74 @@ public class AppsFilter {
}
}
- private void updateEntireShouldFilterCacheAsync() {
- mBackgroundExecutor.execute(this::updateEntireShouldFilterCache);
- }
-
private void updateEntireShouldFilterCache() {
mStateProvider.runWithState((settings, users) -> {
SparseArray<SparseBooleanArray> cache =
- new SparseArray<>(users.length * settings.size());
- for (int i = settings.size() - 1; i >= 0; i--) {
- updateShouldFilterCacheForPackage(cache,
- null /*skipPackage*/, settings.valueAt(i), settings, users, i);
- }
+ updateEntireShouldFilterCacheInner(settings, users);
synchronized (mCacheLock) {
mShouldFilterCache = cache;
}
});
}
+ private SparseArray<SparseBooleanArray> updateEntireShouldFilterCacheInner(
+ ArrayMap<String, PackageSetting> settings, UserInfo[] users) {
+ SparseArray<SparseBooleanArray> cache =
+ new SparseArray<>(users.length * settings.size());
+ for (int i = settings.size() - 1; i >= 0; i--) {
+ updateShouldFilterCacheForPackage(cache,
+ null /*skipPackage*/, settings.valueAt(i), settings, users, i);
+ }
+ return cache;
+ }
+
+ private void updateEntireShouldFilterCacheAsync() {
+ mBackgroundExecutor.execute(() -> {
+ final ArrayMap<String, PackageSetting> settingsCopy = new ArrayMap<>();
+ final ArrayMap<String, AndroidPackage> packagesCache = new ArrayMap<>();
+ final UserInfo[][] usersRef = new UserInfo[1][];
+ mStateProvider.runWithState((settings, users) -> {
+ packagesCache.ensureCapacity(settings.size());
+ settingsCopy.putAll(settings);
+ usersRef[0] = users;
+ // store away the references to the immutable packages, since settings are retained
+ // during updates.
+ for (int i = 0, max = settings.size(); i < max; i++) {
+ final AndroidPackage pkg = settings.valueAt(i).pkg;
+ packagesCache.put(settings.keyAt(i), pkg);
+ }
+ });
+ SparseArray<SparseBooleanArray> cache =
+ updateEntireShouldFilterCacheInner(settingsCopy, usersRef[0]);
+ boolean[] changed = new boolean[1];
+ // We have a cache, let's make sure the world hasn't changed out from under us.
+ mStateProvider.runWithState((settings, users) -> {
+ if (settings.size() != settingsCopy.size()) {
+ changed[0] = true;
+ return;
+ }
+ for (int i = 0, max = settings.size(); i < max; i++) {
+ final AndroidPackage pkg = settings.valueAt(i).pkg;
+ if (!Objects.equals(pkg, packagesCache.get(settings.keyAt(i)))) {
+ changed[0] = true;
+ return;
+ }
+ }
+ });
+ if (changed[0]) {
+ // Something has changed, just update the cache inline with the lock held
+ updateEntireShouldFilterCache();
+ if (DEBUG_LOGGING) {
+ Slog.i(TAG, "Rebuilding cache with lock due to package change.");
+ }
+ } else {
+ synchronized (mCacheLock) {
+ mShouldFilterCache = cache;
+ }
+ }
+ });
+ }
+
public void onUsersChanged() {
synchronized (mCacheLock) {
if (mShouldFilterCache != null) {
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index ed2c058b5c8a..dffd5b321989 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -21630,6 +21630,8 @@ public class PackageManagerService extends IPackageManager.Stub
.getUriFor(Secure.INSTANT_APPS_ENABLED), false, co, UserHandle.USER_ALL);
co.onChange(true);
+ mAppsFilter.onSystemReady();
+
// Disable any carrier apps. We do this very early in boot to prevent the apps from being
// disabled after already being started.
CarrierAppUtils.disableCarrierAppsUntilPrivileged(
@@ -21778,9 +21780,6 @@ public class PackageManagerService extends IPackageManager.Stub
mInstallerService.restoreAndApplyStagedSessionIfNeeded();
mExistingPackages = null;
-
- // We'll do this last as it builds its cache while holding mLock via callback.
- mAppsFilter.onSystemReady();
}
public void waitForAppDataPrepared() {