From 3fa28af449d2dab6abcff9049ef4c29d30367db3 Mon Sep 17 00:00:00 2001 From: Nikolas Havrikov Date: Tue, 25 Oct 2022 09:45:42 +0200 Subject: 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 --- .../java/com/android/server/pm/AppsFilterImpl.java | 25 ++++++++++++---------- 1 file 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> mPermissionToUids; + private final ArrayMap> 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> mUsesPermissionToUids; + private final ArrayMap> 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(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 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 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()); } -- cgit v1.2.3-59-g8ed1b