From 9f837a99d48c5bb8ad7fbc133943e5bf622ce065 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Fri, 24 Oct 2014 12:07:24 -0700 Subject: 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 --- core/java/android/content/pm/PackageParser.java | 5 +- core/java/android/content/pm/PackageUserState.java | 12 +- core/java/android/util/ArraySet.java | 9 +- .../java/com/android/server/IntentResolver.java | 4 +- .../core/java/com/android/server/SystemConfig.java | 14 +-- .../android/server/pm/BackgroundDexOptService.java | 4 +- .../com/android/server/pm/GrantedPermissions.java | 7 +- .../com/android/server/pm/PackageKeySetData.java | 9 +- .../android/server/pm/PackageManagerService.java | 128 ++++++++++----------- .../com/android/server/pm/PackageSettingBase.java | 26 ++--- .../core/java/com/android/server/pm/Settings.java | 54 ++++----- .../com/android/server/pm/SharedUserSetting.java | 4 +- 12 files changed, 138 insertions(+), 138 deletions(-) diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index ca4ff6a..8515520 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -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 grantedPermissions, PackageUserState state) { + ArraySet 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 grantedPermissions, PackageUserState state, int userId) { + ArraySet grantedPermissions, PackageUserState state, int userId) { if (!checkUseInstalledOrHidden(flags, state)) { return null; diff --git a/core/java/android/content/pm/PackageUserState.java b/core/java/android/content/pm/PackageUserState.java index 4dcad6f..a9c7be3 100644 --- a/core/java/android/content/pm/PackageUserState.java +++ b/core/java/android/content/pm/PackageUserState.java @@ -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 disabledComponents; - public HashSet enabledComponents; + public ArraySet disabledComponents; + public ArraySet enabledComponents; public PackageUserState() { installed = true; @@ -51,9 +51,9 @@ public class PackageUserState { hidden = o.hidden; lastDisableAppCaller = o.lastDisableAppCaller; disabledComponents = o.disabledComponents != null - ? new HashSet(o.disabledComponents) : null; + ? new ArraySet(o.disabledComponents) : null; enabledComponents = o.enabledComponents != null - ? new HashSet(o.enabledComponents) : null; + ? new ArraySet(o.enabledComponents) : null; blockUninstall = o.blockUninstall; } -} \ No newline at end of file +} diff --git a/core/java/android/util/ArraySet.java b/core/java/android/util/ArraySet.java index 423e48b..68f725e 100644 --- a/core/java/android/util/ArraySet.java +++ b/core/java/android/util/ArraySet.java @@ -245,13 +245,20 @@ public final class ArraySet implements Collection, Set { /** * Create a new ArraySet with the mappings from the given ArraySet. */ - public ArraySet(ArraySet set) { + public ArraySet(ArraySet set) { this(); if (set != null) { addAll(set); } } + /** {@hide} */ + public ArraySet(Collection set) { + this(); + if (set != null) { + addAll(set); + } + } /** * Make the array map empty. All storage is released. diff --git a/services/core/java/com/android/server/IntentResolver.java b/services/core/java/com/android/server/IntentResolver.java index 07cc864..387eabc 100644 --- a/services/core/java/com/android/server/IntentResolver.java +++ b/services/core/java/com/android/server/IntentResolver.java @@ -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 { /** * All filters that have been registered. */ - private final HashSet mFilters = new HashSet(); + private final ArraySet mFilters = new ArraySet(); /** * All of the MIME types that have been registered, such as "image/jpeg", diff --git a/services/core/java/com/android/server/SystemConfig.java b/services/core/java/com/android/server/SystemConfig.java index cf2a49f..f4fb519 100644 --- a/services/core/java/com/android/server/SystemConfig.java +++ b/services/core/java/com/android/server/SystemConfig.java @@ -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> mSystemPermissions = new SparseArray<>(); + final SparseArray> 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 mAvailableFeatures = new HashMap<>(); + final ArrayMap mAvailableFeatures = new ArrayMap<>(); public static final class PermissionEntry { public final String name; @@ -94,7 +92,7 @@ public class SystemConfig { return mGlobalGids; } - public SparseArray> getSystemPermissions() { + public SparseArray> getSystemPermissions() { return mSystemPermissions; } @@ -102,7 +100,7 @@ public class SystemConfig { return mSharedLibraries; } - public HashMap getAvailableFeatures() { + public ArrayMap getAvailableFeatures() { return mAvailableFeatures; } @@ -252,9 +250,9 @@ public class SystemConfig { continue; } perm = perm.intern(); - HashSet perms = mSystemPermissions.get(uid); + ArraySet perms = mSystemPermissions.get(uid); if (perms == null) { - perms = new HashSet(); + perms = new ArraySet(); mSystemPermissions.put(uid, perms); } perms.add(perm); diff --git a/services/core/java/com/android/server/pm/BackgroundDexOptService.java b/services/core/java/com/android/server/pm/BackgroundDexOptService.java index a7eebf8..cb9a45e 100644 --- a/services/core/java/com/android/server/pm/BackgroundDexOptService.java +++ b/services/core/java/com/android/server/pm/BackgroundDexOptService.java @@ -23,9 +23,9 @@ import android.app.job.JobService; import android.content.ComponentName; import android.content.Context; import android.os.ServiceManager; +import android.util.ArraySet; import android.util.Log; -import java.util.HashSet; import java.util.concurrent.atomic.AtomicBoolean; /** @@ -59,7 +59,7 @@ public class BackgroundDexOptService extends JobService { if (pm.isStorageLow()) { return false; } - final HashSet pkgs = pm.getPackagesThatNeedDexOpt(); + final ArraySet pkgs = pm.getPackagesThatNeedDexOpt(); if (pkgs == null) { return false; } diff --git a/services/core/java/com/android/server/pm/GrantedPermissions.java b/services/core/java/com/android/server/pm/GrantedPermissions.java index 14258a4..8f0f935 100644 --- a/services/core/java/com/android/server/pm/GrantedPermissions.java +++ b/services/core/java/com/android/server/pm/GrantedPermissions.java @@ -17,13 +17,12 @@ package com.android.server.pm; import android.content.pm.ApplicationInfo; - -import java.util.HashSet; +import android.util.ArraySet; class GrantedPermissions { int pkgFlags; - HashSet grantedPermissions = new HashSet(); + ArraySet grantedPermissions = new ArraySet(); int[] gids; @@ -34,7 +33,7 @@ class GrantedPermissions { @SuppressWarnings("unchecked") GrantedPermissions(GrantedPermissions base) { pkgFlags = base.pkgFlags; - grantedPermissions = (HashSet) base.grantedPermissions.clone(); + grantedPermissions = new ArraySet<>(base.grantedPermissions); if (base.gids != null) { gids = base.gids.clone(); diff --git a/services/core/java/com/android/server/pm/PackageKeySetData.java b/services/core/java/com/android/server/pm/PackageKeySetData.java index 9f9bafd..8f12c03 100644 --- a/services/core/java/com/android/server/pm/PackageKeySetData.java +++ b/services/core/java/com/android/server/pm/PackageKeySetData.java @@ -16,10 +16,9 @@ package com.android.server.pm; -import com.android.internal.util.ArrayUtils; +import android.util.ArrayMap; -import java.util.HashMap; -import java.util.Map; +import com.android.internal.util.ArrayUtils; public class PackageKeySetData { @@ -34,7 +33,7 @@ public class PackageKeySetData { private long[] mDefinedKeySets; - private final Map mKeySetAliases = new HashMap(); + private final ArrayMap mKeySetAliases = new ArrayMap(); PackageKeySetData() { mProperSigningKeySet = KEYSET_UNASSIGNED; @@ -132,7 +131,7 @@ public class PackageKeySetData { return mDefinedKeySets; } - protected Map getAliases() { + protected ArrayMap getAliases() { return mKeySetAliases; } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index b79e157..056c2e6 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -199,8 +199,6 @@ import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -371,20 +369,20 @@ public class PackageManagerService extends IPackageManager.Stub { // Keys are String (package name), values are Package. This also serves // as the lock for the global state. Methods that must be called with // this lock held have the prefix "LP". - final HashMap mPackages = - new HashMap(); + final ArrayMap mPackages = + new ArrayMap(); // Tracks available target package names -> overlay package paths. - final HashMap> mOverlays = - new HashMap>(); + final ArrayMap> mOverlays = + new ArrayMap>(); final Settings mSettings; boolean mRestoredSettings; // System configuration read by SystemConfig. final int[] mGlobalGids; - final SparseArray> mSystemPermissions; - final HashMap mAvailableFeatures; + final SparseArray> mSystemPermissions; + final ArrayMap mAvailableFeatures; // If mac_permissions.xml was found for seinfo labeling. boolean mFoundPolicyFile; @@ -403,8 +401,8 @@ public class PackageManagerService extends IPackageManager.Stub { } // Currently known shared libraries. - final HashMap mSharedLibraries = - new HashMap(); + final ArrayMap mSharedLibraries = + new ArrayMap(); // All available activities, for your resolving pleasure. final ActivityIntentResolver mActivities = @@ -422,23 +420,23 @@ public class PackageManagerService extends IPackageManager.Stub { // Mapping from provider base names (first directory in content URI codePath) // to the provider information. - final HashMap mProvidersByAuthority = - new HashMap(); + final ArrayMap mProvidersByAuthority = + new ArrayMap(); // Mapping from instrumentation class names to info about them. - final HashMap mInstrumentation = - new HashMap(); + final ArrayMap mInstrumentation = + new ArrayMap(); // Mapping from permission names to info about them. - final HashMap mPermissionGroups = - new HashMap(); + final ArrayMap mPermissionGroups = + new ArrayMap(); // Packages whose data we have transfered into another package, thus // should no longer exist. - final HashSet mTransferedPackages = new HashSet(); + final ArraySet mTransferedPackages = new ArraySet(); // Broadcast actions that are only available to the system. - final HashSet mProtectedBroadcasts = new HashSet(); + final ArraySet mProtectedBroadcasts = new ArraySet(); /** List of packages waiting for verification. */ final SparseArray mPendingVerification @@ -449,7 +447,7 @@ public class PackageManagerService extends IPackageManager.Stub { final PackageInstallerService mInstallerService; - HashSet mDeferredDexOpt = null; + ArraySet mDeferredDexOpt = null; // Cache of users who need badging. SparseBooleanArray mUserNeedsBadging = new SparseBooleanArray(); @@ -473,24 +471,24 @@ public class PackageManagerService extends IPackageManager.Stub { // Set of pending broadcasts for aggregating enable/disable of components. static class PendingPackageBroadcasts { // for each user id, a map of components within that package> - final SparseArray>> mUidMap; + final SparseArray>> mUidMap; public PendingPackageBroadcasts() { - mUidMap = new SparseArray>>(2); + mUidMap = new SparseArray>>(2); } public ArrayList get(int userId, String packageName) { - HashMap> packages = getOrAllocate(userId); + ArrayMap> packages = getOrAllocate(userId); return packages.get(packageName); } public void put(int userId, String packageName, ArrayList components) { - HashMap> packages = getOrAllocate(userId); + ArrayMap> packages = getOrAllocate(userId); packages.put(packageName, components); } public void remove(int userId, String packageName) { - HashMap> packages = mUidMap.get(userId); + ArrayMap> packages = mUidMap.get(userId); if (packages != null) { packages.remove(packageName); } @@ -508,7 +506,7 @@ public class PackageManagerService extends IPackageManager.Stub { return mUidMap.keyAt(n); } - public HashMap> packagesForUserId(int userId) { + public ArrayMap> packagesForUserId(int userId) { return mUidMap.get(userId); } @@ -525,10 +523,10 @@ public class PackageManagerService extends IPackageManager.Stub { mUidMap.clear(); } - private HashMap> getOrAllocate(int userId) { - HashMap> map = mUidMap.get(userId); + private ArrayMap> getOrAllocate(int userId) { + ArrayMap> map = mUidMap.get(userId); if (map == null) { - map = new HashMap>(); + map = new ArrayMap>(); mUidMap.put(userId, map); } return map; @@ -565,7 +563,7 @@ public class PackageManagerService extends IPackageManager.Stub { static UserManagerService sUserManager; // Stores a list of users whose package restrictions file needs to be updated - private HashSet mDirtyUsers = new HashSet(); + private ArraySet mDirtyUsers = new ArraySet(); final private DefaultContainerConnection mDefContainerConn = new DefaultContainerConnection(); @@ -1384,7 +1382,7 @@ public class PackageManagerService extends IPackageManager.Stub { // scanning install directories. final int scanFlags = SCAN_NO_PATHS | SCAN_DEFER_DEX | SCAN_BOOTING; - final HashSet alreadyDexOpted = new HashSet(); + final ArraySet alreadyDexOpted = new ArraySet(); /** * Add everything in the in the boot class path to the @@ -2369,7 +2367,7 @@ public class PackageManagerService extends IPackageManager.Stub { return PackageManager.PERMISSION_GRANTED; } } else { - HashSet perms = mSystemPermissions.get(uid); + ArraySet perms = mSystemPermissions.get(uid); if (perms != null && perms.contains(permName)) { return PackageManager.PERMISSION_GRANTED; } @@ -2790,11 +2788,11 @@ public class PackageManagerService extends IPackageManager.Stub { PackageManager.SIGNATURE_NO_MATCH; } - HashSet set1 = new HashSet(); + ArraySet set1 = new ArraySet(); for (Signature sig : s1) { set1.add(sig); } - HashSet set2 = new HashSet(); + ArraySet set2 = new ArraySet(); for (Signature sig : s2) { set2.add(sig); } @@ -2829,11 +2827,11 @@ public class PackageManagerService extends IPackageManager.Stub { return PackageManager.SIGNATURE_NO_MATCH; } - HashSet existingSet = new HashSet(); + ArraySet existingSet = new ArraySet(); for (Signature sig : existingSigs.mSignatures) { existingSet.add(sig); } - HashSet scannedCompatSet = new HashSet(); + ArraySet scannedCompatSet = new ArraySet(); for (Signature sig : scannedPkg.mSignatures) { try { Signature[] chainSignatures = sig.getChainSignatures(); @@ -4023,7 +4021,7 @@ public class PackageManagerService extends IPackageManager.Stub { } private void createIdmapsForPackageLI(PackageParser.Package pkg) { - HashMap overlays = mOverlays.get(pkg.packageName); + ArrayMap overlays = mOverlays.get(pkg.packageName); if (overlays == null) { Slog.w(TAG, "Unable to create idmap for " + pkg.packageName + ": no overlay packages"); return; @@ -4044,7 +4042,7 @@ public class PackageManagerService extends IPackageManager.Stub { opkg.baseCodePath + ": overlay not trusted"); return false; } - HashMap overlaySet = mOverlays.get(pkg.packageName); + ArrayMap overlaySet = mOverlays.get(pkg.packageName); if (overlaySet == null) { Slog.e(TAG, "was about to create idmap for " + pkg.baseCodePath + " and " + opkg.baseCodePath + " but target package has no known overlays"); @@ -4465,7 +4463,7 @@ public class PackageManagerService extends IPackageManager.Stub { public void performBootDexOpt() { enforceSystemOrRoot("Only the system can request dexopt be performed"); - final HashSet pkgs; + final ArraySet pkgs; synchronized (mPackages) { pkgs = mDeferredDexOpt; mDeferredDexOpt = null; @@ -4488,7 +4486,7 @@ public class PackageManagerService extends IPackageManager.Stub { } // Give priority to system apps that listen for pre boot complete. Intent intent = new Intent(Intent.ACTION_PRE_BOOT_COMPLETED); - HashSet pkgNames = getPackageNamesForIntent(intent); + ArraySet pkgNames = getPackageNamesForIntent(intent); for (Iterator it = pkgs.iterator(); it.hasNext();) { PackageParser.Package pkg = it.next(); if (pkgNames.contains(pkg.packageName)) { @@ -4562,7 +4560,7 @@ public class PackageManagerService extends IPackageManager.Stub { } } - private void filterRecentlyUsedApps(HashSet pkgs) { + private void filterRecentlyUsedApps(ArraySet pkgs) { // Filter out packages that aren't recently used. // // The exception is first boot of a non-eng device (aka !mLazyDexOpt), which @@ -4598,14 +4596,14 @@ public class PackageManagerService extends IPackageManager.Stub { } } - private HashSet getPackageNamesForIntent(Intent intent) { + private ArraySet getPackageNamesForIntent(Intent intent) { List ris = null; try { ris = AppGlobals.getPackageManager().queryIntentReceivers( intent, null, 0, UserHandle.USER_OWNER); } catch (RemoteException e) { } - HashSet pkgNames = new HashSet(); + ArraySet pkgNames = new ArraySet(); if (ris != null) { for (ResolveInfo ri : ris) { pkgNames.add(ri.activityInfo.packageName); @@ -4683,8 +4681,8 @@ public class PackageManagerService extends IPackageManager.Stub { } } - public HashSet getPackagesThatNeedDexOpt() { - HashSet pkgs = null; + public ArraySet getPackagesThatNeedDexOpt() { + ArraySet pkgs = null; synchronized (mPackages) { for (PackageParser.Package p : mPackages.values()) { if (DEBUG_DEXOPT) { @@ -4694,7 +4692,7 @@ public class PackageManagerService extends IPackageManager.Stub { continue; } if (pkgs == null) { - pkgs = new HashSet(); + pkgs = new ArraySet(); } pkgs.add(p.packageName); } @@ -4707,7 +4705,7 @@ public class PackageManagerService extends IPackageManager.Stub { } private void performDexOptLibsLI(ArrayList libs, String[] instructionSets, - boolean forceDex, boolean defer, HashSet done) { + boolean forceDex, boolean defer, ArraySet done) { for (int i=0; i done) { + boolean forceDex, boolean defer, ArraySet done) { final String[] instructionSets = targetInstructionSets != null ? targetInstructionSets : getAppDexInstructionSets(pkg.applicationInfo); @@ -4810,7 +4808,7 @@ public class PackageManagerService extends IPackageManager.Stub { // our list of deferred dexopts. if (defer && isDexOptNeeded != DexFile.UP_TO_DATE) { if (mDeferredDexOpt == null) { - mDeferredDexOpt = new HashSet(); + mDeferredDexOpt = new ArraySet(); } mDeferredDexOpt.add(pkg); return DEX_OPT_DEFERRED; @@ -4907,7 +4905,7 @@ public class PackageManagerService extends IPackageManager.Stub { } private static String[] getDexCodeInstructionSets(String[] instructionSets) { - HashSet dexCodeInstructionSets = new HashSet(instructionSets.length); + ArraySet dexCodeInstructionSets = new ArraySet(instructionSets.length); for (String instructionSet : instructionSets) { dexCodeInstructionSets.add(getDexCodeInstructionSet(instructionSet)); } @@ -4950,9 +4948,9 @@ public class PackageManagerService extends IPackageManager.Stub { private int performDexOptLI(PackageParser.Package pkg, String[] instructionSets, boolean forceDex, boolean defer, boolean inclDependencies) { - HashSet done; + ArraySet done; if (inclDependencies && (pkg.usesLibraries != null || pkg.usesOptionalLibraries != null)) { - done = new HashSet(); + done = new ArraySet(); done.add(pkg.packageName); } else { done = null; @@ -6137,7 +6135,7 @@ public class PackageManagerService extends IPackageManager.Stub { r = null; for (i=0; i permissionMap = + ArrayMap permissionMap = p.tree ? mSettings.mPermissionTrees : mSettings.mPermissions; p.group = mPermissionGroups.get(p.info.group); @@ -6265,9 +6263,9 @@ public class PackageManagerService extends IPackageManager.Stub { if (pkg.mOverlayTarget != null && !pkg.mOverlayTarget.equals("android")) { if (!mOverlays.containsKey(pkg.mOverlayTarget)) { mOverlays.put(pkg.mOverlayTarget, - new HashMap()); + new ArrayMap()); } - HashMap map = mOverlays.get(pkg.mOverlayTarget); + ArrayMap map = mOverlays.get(pkg.mOverlayTarget); map.put(pkg.packageName, pkg); PackageParser.Package orig = mPackages.get(pkg.mOverlayTarget); if (orig != null && !createIdmapForPackagePairLI(orig, pkg)) { @@ -6928,13 +6926,13 @@ public class PackageManagerService extends IPackageManager.Stub { return; } final GrantedPermissions gp = ps.sharedUser != null ? ps.sharedUser : ps; - HashSet origPermissions = gp.grantedPermissions; + ArraySet origPermissions = gp.grantedPermissions; boolean changedPermission = false; if (replace) { ps.permissionsFixed = false; if (gp == ps) { - origPermissions = new HashSet(gp.grantedPermissions); + origPermissions = new ArraySet(gp.grantedPermissions); gp.grantedPermissions.clear(); gp.gids = mGlobalGids; } @@ -7081,7 +7079,7 @@ public class PackageManagerService extends IPackageManager.Stub { } private boolean grantSignaturePermission(String perm, PackageParser.Package pkg, - BasePermission bp, HashSet origPermissions) { + BasePermission bp, ArraySet origPermissions) { boolean allowed; allowed = (compareSignatures( bp.packageSetting.signatures.mSignatures, pkg.mSignatures) @@ -7339,8 +7337,8 @@ public class PackageManagerService extends IPackageManager.Stub { // } // Keys are String (activity class name), values are Activity. - private final HashMap mActivities - = new HashMap(); + private final ArrayMap mActivities + = new ArrayMap(); private int mFlags; } @@ -7538,8 +7536,8 @@ public class PackageManagerService extends IPackageManager.Stub { // } // Keys are String (activity class name), values are Activity. - private final HashMap mServices - = new HashMap(); + private final ArrayMap mServices + = new ArrayMap(); private int mFlags; }; @@ -7732,8 +7730,8 @@ public class PackageManagerService extends IPackageManager.Stub { out.println(Integer.toHexString(System.identityHashCode(filter))); } - private final HashMap mProviders - = new HashMap(); + private final ArrayMap mProviders + = new ArrayMap(); private int mFlags; }; @@ -11835,8 +11833,8 @@ public class PackageManagerService extends IPackageManager.Stub { synchronized (mPackages) { CrossProfileIntentResolver resolver = mSettings.editCrossProfileIntentResolverLPw(sourceUserId); - HashSet set = - new HashSet(resolver.filterSet()); + ArraySet set = + new ArraySet(resolver.filterSet()); for (CrossProfileIntentFilter filter : set) { if (filter.getOwnerPackage().equals(ownerPackage) && filter.getOwnerUserId() == callingUserId) { diff --git a/services/core/java/com/android/server/pm/PackageSettingBase.java b/services/core/java/com/android/server/pm/PackageSettingBase.java index bf13fd9..1dcadb4 100644 --- a/services/core/java/com/android/server/pm/PackageSettingBase.java +++ b/services/core/java/com/android/server/pm/PackageSettingBase.java @@ -21,10 +21,10 @@ import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED; import android.content.pm.PackageUserState; +import android.util.ArraySet; import android.util.SparseArray; import java.io.File; -import java.util.HashSet; /** * Settings base class for pending and resolved classes. @@ -321,8 +321,8 @@ class PackageSettingBase extends GrantedPermissions { void setUserState(int userId, int enabled, boolean installed, boolean stopped, boolean notLaunched, boolean hidden, - String lastDisableAppCaller, HashSet enabledComponents, - HashSet disabledComponents, boolean blockUninstall) { + String lastDisableAppCaller, ArraySet enabledComponents, + ArraySet disabledComponents, boolean blockUninstall) { PackageUserState state = modifyUserState(userId); state.enabled = enabled; state.installed = installed; @@ -335,39 +335,39 @@ class PackageSettingBase extends GrantedPermissions { state.blockUninstall = blockUninstall; } - HashSet getEnabledComponents(int userId) { + ArraySet getEnabledComponents(int userId) { return readUserState(userId).enabledComponents; } - HashSet getDisabledComponents(int userId) { + ArraySet getDisabledComponents(int userId) { return readUserState(userId).disabledComponents; } - void setEnabledComponents(HashSet components, int userId) { + void setEnabledComponents(ArraySet components, int userId) { modifyUserState(userId).enabledComponents = components; } - void setDisabledComponents(HashSet components, int userId) { + void setDisabledComponents(ArraySet components, int userId) { modifyUserState(userId).disabledComponents = components; } - void setEnabledComponentsCopy(HashSet components, int userId) { + void setEnabledComponentsCopy(ArraySet components, int userId) { modifyUserState(userId).enabledComponents = components != null - ? new HashSet(components) : null; + ? new ArraySet(components) : null; } - void setDisabledComponentsCopy(HashSet components, int userId) { + void setDisabledComponentsCopy(ArraySet components, int userId) { modifyUserState(userId).disabledComponents = components != null - ? new HashSet(components) : null; + ? new ArraySet(components) : null; } PackageUserState modifyUserStateComponents(int userId, boolean disabled, boolean enabled) { PackageUserState state = modifyUserState(userId); if (disabled && state.disabledComponents == null) { - state.disabledComponents = new HashSet(1); + state.disabledComponents = new ArraySet(1); } if (enabled && state.enabledComponents == null) { - state.enabledComponents = new HashSet(1); + state.enabledComponents = new ArraySet(1); } return state; } diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 7de56c8..200eb5f 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -63,6 +63,8 @@ import android.content.pm.Signature; import android.content.pm.UserInfo; import android.content.pm.PackageUserState; import android.content.pm.VerifierDeviceIdentity; +import android.util.ArrayMap; +import android.util.ArraySet; import android.util.Log; import android.util.Slog; import android.util.SparseArray; @@ -78,8 +80,6 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -159,11 +159,11 @@ final class Settings { private final File mStoppedPackagesFilename; private final File mBackupStoppedPackagesFilename; - final HashMap mPackages = - new HashMap(); + final ArrayMap mPackages = + new ArrayMap(); // List of replaced system applications - private final HashMap mDisabledSysPackages = - new HashMap(); + private final ArrayMap mDisabledSysPackages = + new ArrayMap(); private static int mFirstAvailableUid = 0; @@ -206,8 +206,8 @@ final class Settings { final SparseArray mCrossProfileIntentResolvers = new SparseArray(); - final HashMap mSharedUsers = - new HashMap(); + final ArrayMap mSharedUsers = + new ArrayMap(); private final ArrayList mUserIds = new ArrayList(); private final SparseArray mOtherUserIds = new SparseArray(); @@ -217,12 +217,12 @@ final class Settings { new ArrayList(); // Mapping from permission names to info about them. - final HashMap mPermissions = - new HashMap(); + final ArrayMap mPermissions = + new ArrayMap(); // Mapping from permission tree names to info about them. - final HashMap mPermissionTrees = - new HashMap(); + final ArrayMap mPermissionTrees = + new ArrayMap(); // Packages that have been uninstalled and still need their external // storage data deleted. @@ -232,7 +232,7 @@ final class Settings { // Keys are the new names of the packages, values are the original // names. The packages appear everwhere else under their original // names. - final HashMap mRenamedPackages = new HashMap(); + final ArrayMap mRenamedPackages = new ArrayMap(); final StringBuilder mReadMessages = new StringBuilder(); @@ -437,7 +437,7 @@ final class Settings { void transferPermissionsLPw(String origPkg, String newPkg) { // Transfer ownership of permissions to the new package. for (int i=0; i<2; i++) { - HashMap permissions = + ArrayMap permissions = i == 0 ? mPermissionTrees : mPermissions; for (BasePermission bp : permissions.values()) { if (origPkg.equals(bp.sourcePackage)) { @@ -582,7 +582,7 @@ final class Settings { } p.appId = dis.appId; // Clone permissions - p.grantedPermissions = new HashSet(dis.grantedPermissions); + p.grantedPermissions = new ArraySet(dis.grantedPermissions); // Clone component info List users = getAllUsers(); if (users != null) { @@ -1138,8 +1138,8 @@ final class Settings { final boolean blockUninstall = blockUninstallStr == null ? false : Boolean.parseBoolean(blockUninstallStr); - HashSet enabledComponents = null; - HashSet disabledComponents = null; + ArraySet enabledComponents = null; + ArraySet disabledComponents = null; int packageDepth = parser.getDepth(); while ((type=parser.next()) != XmlPullParser.END_DOCUMENT @@ -1189,9 +1189,9 @@ final class Settings { } } - private HashSet readComponentsLPr(XmlPullParser parser) + private ArraySet readComponentsLPr(XmlPullParser parser) throws IOException, XmlPullParserException { - HashSet components = null; + ArraySet components = null; int type; int outerDepth = parser.getDepth(); String tagName; @@ -1207,7 +1207,7 @@ final class Settings { String componentName = parser.getAttributeValue(null, ATTR_NAME); if (componentName != null) { if (components == null) { - components = new HashSet(); + components = new ArraySet(); } components.add(componentName); } @@ -1921,7 +1921,7 @@ final class Settings { } ArrayList getListOfIncompleteInstallPackagesLPr() { - final HashSet kList = new HashSet(mPackages.keySet()); + final ArraySet kList = new ArraySet(mPackages.keySet()); final Iterator its = kList.iterator(); final ArrayList ret = new ArrayList(); while (its.hasNext()) { @@ -2511,7 +2511,7 @@ final class Settings { return defValue; } - private void readPermissionsLPw(HashMap out, XmlPullParser parser) + private void readPermissionsLPw(ArrayMap out, XmlPullParser parser) throws IOException, XmlPullParserException { int outerDepth = parser.getDepth(); int type; @@ -3016,7 +3016,7 @@ final class Settings { } } - private void readGrantedPermissionsLPw(XmlPullParser parser, HashSet outPerms) + private void readGrantedPermissionsLPw(XmlPullParser parser, ArraySet outPerms) throws IOException, XmlPullParserException { int outerDepth = parser.getDepth(); int type; @@ -3090,8 +3090,8 @@ final class Settings { int sourceUserId = mCrossProfileIntentResolvers.keyAt(i); CrossProfileIntentResolver cpir = mCrossProfileIntentResolvers.get(sourceUserId); boolean needsWriting = false; - HashSet cpifs = - new HashSet(cpir.filterSet()); + ArraySet cpifs = + new ArraySet(cpir.filterSet()); for (CrossProfileIntentFilter cpif : cpifs) { if (cpif.getTargetUserId() == userId) { needsWriting = true; @@ -3147,7 +3147,7 @@ final class Settings { return ps; } - private String compToString(HashSet cmp) { + private String compToString(ArraySet cmp) { return cmp != null ? Arrays.toString(cmp.toArray()) : "[]"; } @@ -3477,7 +3477,7 @@ final class Settings { pw.print(prefix); pw.print(" lastDisabledCaller: "); pw.println(lastDisabledAppCaller); } - HashSet cmp = ps.getDisabledComponents(user.id); + ArraySet cmp = ps.getDisabledComponents(user.id); if (cmp != null && cmp.size() > 0) { pw.print(prefix); pw.println(" disabledComponents:"); for (String s : cmp) { diff --git a/services/core/java/com/android/server/pm/SharedUserSetting.java b/services/core/java/com/android/server/pm/SharedUserSetting.java index ca1eeea..2b406f7 100644 --- a/services/core/java/com/android/server/pm/SharedUserSetting.java +++ b/services/core/java/com/android/server/pm/SharedUserSetting.java @@ -16,7 +16,7 @@ package com.android.server.pm; -import java.util.HashSet; +import android.util.ArraySet; /** * Settings data for a particular shared user ID we know about. @@ -29,7 +29,7 @@ final class SharedUserSetting extends GrantedPermissions { // flags that are associated with this uid, regardless of any package flags int uidFlags; - final HashSet packages = new HashSet(); + final ArraySet packages = new ArraySet(); final PackageSignatures signatures = new PackageSignatures(); -- cgit v1.1