Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3fa28af4 authored by Nikolas Havrikov's avatar Nikolas Havrikov
Browse files

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
parent bcae5b28
Loading
Loading
Loading
Loading
+14 −11
Original line number Diff line number Diff line
@@ -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());
                }