diff options
| author | 2022-10-25 09:45:42 +0200 | |
|---|---|---|
| committer | 2022-10-28 12:38:16 +0000 | |
| commit | 3fa28af449d2dab6abcff9049ef4c29d30367db3 (patch) | |
| tree | 493ea4b71f54893f29696b5cbc55e19229cb7711 | |
| parent | bcae5b2822bd24494c94d1d78febf47bbda841f0 (diff) | |
Replace HashMap with ArrayMap in AppsFilterImpl
This saves memory in the system_server.
Additionally, this CL replaces iterators with for loops using
valueAt() to save further memory.
Test: adb shell am dumpheap `adb shell pidof system_server`
Test: then use ahat to manually inspect: http://screen/3dVis7RNst2SJp8
Bug: 254230758
Change-Id: Iada8859e7c04f6dde2d7d1fbc0ab730d6e035770
| -rw-r--r-- | services/core/java/com/android/server/pm/AppsFilterImpl.java | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/services/core/java/com/android/server/pm/AppsFilterImpl.java b/services/core/java/com/android/server/pm/AppsFilterImpl.java index 4c21195e2890..e5b8372ea7b3 100644 --- a/services/core/java/com/android/server/pm/AppsFilterImpl.java +++ b/services/core/java/com/android/server/pm/AppsFilterImpl.java @@ -71,11 +71,8 @@ import com.android.server.utils.Watcher; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Objects; -import java.util.Set; /** * Implementation of the methods that update the internal structures of AppsFilter. Because of the @@ -103,7 +100,7 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable, */ @GuardedBy("mQueryableViaUsesPermissionLock") @NonNull - private HashMap<String, Set<Integer>> mPermissionToUids; + private final ArrayMap<String, ArraySet<Integer>> mPermissionToUids; /** * A cache that maps parsed {@link android.R.styleable#AndroidManifestUsesPermission @@ -113,7 +110,7 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable, */ @GuardedBy("mQueryableViaUsesPermissionLock") @NonNull - private HashMap<String, Set<Integer>> mUsesPermissionToUids; + private final ArrayMap<String, ArraySet<Integer>> mUsesPermissionToUids; /** * Ensures an observer is in the list, exactly once. The observer cannot be null. The @@ -215,8 +212,8 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable, mProtectedBroadcasts = new WatchedArrayList<>(); mProtectedBroadcastsSnapshot = new SnapshotCache.Auto<>( mProtectedBroadcasts, mProtectedBroadcasts, "AppsFilter.mProtectedBroadcasts"); - mPermissionToUids = new HashMap<>(); - mUsesPermissionToUids = new HashMap<>(); + mPermissionToUids = new ArrayMap<>(); + mUsesPermissionToUids = new ArrayMap<>(); mSnapshot = new SnapshotCache<AppsFilterSnapshot>(this, this) { @Override @@ -578,7 +575,10 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable, // Lookup in the mPermissionToUids cache if installed packages have // defined this permission. if (mPermissionToUids.containsKey(usesPermissionName)) { - for (int targetAppId : mPermissionToUids.get(usesPermissionName)) { + final ArraySet<Integer> permissionDefiners = + mPermissionToUids.get(usesPermissionName); + for (int j = 0; j < permissionDefiners.size(); j++) { + final int targetAppId = permissionDefiners.valueAt(j); if (targetAppId != newPkgSetting.getAppId()) { mQueryableViaUsesPermission.add(newPkgSetting.getAppId(), targetAppId); @@ -588,7 +588,7 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable, // Record in mUsesPermissionToUids that a permission was requested // by a new package if (!mUsesPermissionToUids.containsKey(usesPermissionName)) { - mUsesPermissionToUids.put(usesPermissionName, new HashSet<>()); + mUsesPermissionToUids.put(usesPermissionName, new ArraySet<>()); } mUsesPermissionToUids.get(usesPermissionName).add(newPkgSetting.getAppId()); } @@ -602,7 +602,10 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable, // Lookup in the mUsesPermissionToUids cache if installed packages have // requested this permission. if (mUsesPermissionToUids.containsKey(permissionName)) { - for (int queryingAppId : mUsesPermissionToUids.get(permissionName)) { + final ArraySet<Integer> permissionUsers = mUsesPermissionToUids.get( + permissionName); + for (int j = 0; j < permissionUsers.size(); j++) { + final int queryingAppId = permissionUsers.valueAt(j); if (queryingAppId != newPkgSetting.getAppId()) { mQueryableViaUsesPermission.add(queryingAppId, newPkgSetting.getAppId()); @@ -611,7 +614,7 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable, } // Record in mPermissionToUids that a permission was defined by a new package if (!mPermissionToUids.containsKey(permissionName)) { - mPermissionToUids.put(permissionName, new HashSet<>()); + mPermissionToUids.put(permissionName, new ArraySet<>()); } mPermissionToUids.get(permissionName).add(newPkgSetting.getAppId()); } |