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

Commit 9f837a99 authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

Reduce PackageManager RAM usage: ArrayMap/Set.

Transition PackageManager internals away from heavier HashMap/HashSet
to use drop-in ArrayMap/ArraySet replacements.  Saves ~38% RAM and
thousands of objects on a typical device.

Bug: 18115729
Change-Id: Ie107d2fee4b7baa4e3c3923231b4be877d1a5d2f
parent e41d967c
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -74,7 +74,6 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
@@ -380,7 +379,7 @@ public class PackageParser {
     */
    public static PackageInfo generatePackageInfo(PackageParser.Package p,
            int gids[], int flags, long firstInstallTime, long lastUpdateTime,
            HashSet<String> grantedPermissions, PackageUserState state) {
            ArraySet<String> grantedPermissions, PackageUserState state) {

        return generatePackageInfo(p, gids, flags, firstInstallTime, lastUpdateTime,
                grantedPermissions, state, UserHandle.getCallingUserId());
@@ -401,7 +400,7 @@ public class PackageParser {

    public static PackageInfo generatePackageInfo(PackageParser.Package p,
            int gids[], int flags, long firstInstallTime, long lastUpdateTime,
            HashSet<String> grantedPermissions, PackageUserState state, int userId) {
            ArraySet<String> grantedPermissions, PackageUserState state, int userId) {

        if (!checkUseInstalledOrHidden(flags, state)) {
            return null;
+6 −6
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@ package android.content.pm;

import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;

import java.util.HashSet;
import android.util.ArraySet;

/**
 * Per-user state information about a package.
@@ -34,8 +34,8 @@ public class PackageUserState {

    public String lastDisableAppCaller;

    public HashSet<String> disabledComponents;
    public HashSet<String> enabledComponents;
    public ArraySet<String> disabledComponents;
    public ArraySet<String> enabledComponents;

    public PackageUserState() {
        installed = true;
@@ -51,9 +51,9 @@ public class PackageUserState {
        hidden = o.hidden;
        lastDisableAppCaller = o.lastDisableAppCaller;
        disabledComponents = o.disabledComponents != null
                ? new HashSet<String>(o.disabledComponents) : null;
                ? new ArraySet<String>(o.disabledComponents) : null;
        enabledComponents = o.enabledComponents != null
                ? new HashSet<String>(o.enabledComponents) : null;
                ? new ArraySet<String>(o.enabledComponents) : null;
        blockUninstall = o.blockUninstall;
    }
}
+8 −1
Original line number Diff line number Diff line
@@ -245,13 +245,20 @@ public final class ArraySet<E> implements Collection<E>, Set<E> {
    /**
     * Create a new ArraySet with the mappings from the given ArraySet.
     */
    public ArraySet(ArraySet set) {
    public ArraySet(ArraySet<E> set) {
        this();
        if (set != null) {
            addAll(set);
        }
    }

    /** {@hide} */
    public ArraySet(Collection<E> set) {
        this();
        if (set != null) {
            addAll(set);
        }
    }

    /**
     * Make the array map empty.  All storage is released.
+2 −2
Original line number Diff line number Diff line
@@ -21,7 +21,6 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -30,6 +29,7 @@ import java.util.Set;
import android.net.Uri;
import android.util.FastImmutableArraySet;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
import android.util.PrintWriterPrinter;
import android.util.Slog;
@@ -736,7 +736,7 @@ public abstract class IntentResolver<F extends IntentFilter, R extends Object> {
    /**
     * All filters that have been registered.
     */
    private final HashSet<F> mFilters = new HashSet<F>();
    private final ArraySet<F> mFilters = new ArraySet<F>();

    /**
     * All of the MIME types that have been registered, such as "image/jpeg",
+6 −8
Original line number Diff line number Diff line
@@ -32,8 +32,6 @@ import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;

import static com.android.internal.util.ArrayUtils.appendInt;

@@ -50,7 +48,7 @@ public class SystemConfig {

    // These are the built-in uid -> permission mappings that were read from the
    // system configuration files.
    final SparseArray<HashSet<String>> mSystemPermissions = new SparseArray<>();
    final SparseArray<ArraySet<String>> mSystemPermissions = new SparseArray<>();

    // These are the built-in shared libraries that were read from the
    // system configuration files.  Keys are the library names; strings are the
@@ -59,7 +57,7 @@ public class SystemConfig {

    // These are the features this devices supports that were read from the
    // system configuration files.
    final HashMap<String, FeatureInfo> mAvailableFeatures = new HashMap<>();
    final ArrayMap<String, FeatureInfo> mAvailableFeatures = new ArrayMap<>();

    public static final class PermissionEntry {
        public final String name;
@@ -94,7 +92,7 @@ public class SystemConfig {
        return mGlobalGids;
    }

    public SparseArray<HashSet<String>> getSystemPermissions() {
    public SparseArray<ArraySet<String>> getSystemPermissions() {
        return mSystemPermissions;
    }

@@ -102,7 +100,7 @@ public class SystemConfig {
        return mSharedLibraries;
    }

    public HashMap<String, FeatureInfo> getAvailableFeatures() {
    public ArrayMap<String, FeatureInfo> getAvailableFeatures() {
        return mAvailableFeatures;
    }

@@ -252,9 +250,9 @@ public class SystemConfig {
                        continue;
                    }
                    perm = perm.intern();
                    HashSet<String> perms = mSystemPermissions.get(uid);
                    ArraySet<String> perms = mSystemPermissions.get(uid);
                    if (perms == null) {
                        perms = new HashSet<String>();
                        perms = new ArraySet<String>();
                        mSystemPermissions.put(uid, perms);
                    }
                    perms.add(perm);
Loading