From 0888276a1c6cd4077770844615848674de21dab3 Mon Sep 17 00:00:00 2001 From: Andreas Gampe Date: Thu, 5 Mar 2015 13:13:55 -0800 Subject: [PATCH] Frameworks/base: Use ArraySet more explicitly In KeySetManagerService, use ArraySet more explicitly. Avoid for-each loops. Collections API methods on ArraySet are not very efficient. Iterators incur two object allocations: a helper and the actual iterator object. During boot, about 4.5K such calls are made. Using the ArraySet more explicitly like an ArrayList/array avoids the overhead. Bug: 19617481 Change-Id: I25df334fa1d4be3210667fb1404e3c43f2585049 --- .../server/pm/KeySetManagerService.java | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/services/core/java/com/android/server/pm/KeySetManagerService.java b/services/core/java/com/android/server/pm/KeySetManagerService.java index 4a8e31835dd8a..1772856d0e6e4 100644 --- a/services/core/java/com/android/server/pm/KeySetManagerService.java +++ b/services/core/java/com/android/server/pm/KeySetManagerService.java @@ -415,9 +415,9 @@ public class KeySetManagerService { // Get the package's known keys and KeySets ArraySet deletableKeySets = getOriginalKeySetsByPackageNameLPr(packageName); ArraySet deletableKeys = new ArraySet(); - ArraySet knownKeys = null; - for (Long ks : deletableKeySets) { - knownKeys = mKeySetMapping.get(ks); + final int origDksSize = deletableKeySets.size(); + for (int i = 0; i < origDksSize; i++) { + ArraySet knownKeys = mKeySetMapping.get(deletableKeySets.valueAt(i)); if (knownKeys != null) { deletableKeys.addAll(knownKeys); } @@ -430,9 +430,9 @@ public class KeySetManagerService { } ArraySet knownKeySets = getOriginalKeySetsByPackageNameLPr(pkgName); deletableKeySets.removeAll(knownKeySets); - knownKeys = new ArraySet(); - for (Long ks : knownKeySets) { - knownKeys = mKeySetMapping.get(ks); + final int kksSize = knownKeySets.size(); + for (int i = 0; i < kksSize; i++) { + ArraySet knownKeys = mKeySetMapping.get(knownKeySets.valueAt(i)); if (knownKeys != null) { deletableKeys.removeAll(knownKeys); } @@ -441,18 +441,22 @@ public class KeySetManagerService { // The remaining keys and KeySets are not relied on by any other // application and so can be safely deleted. - for (Long ks : deletableKeySets) { + final int dksSize = deletableKeySets.size(); + for (int i = 0; i < dksSize; i++) { + Long ks = deletableKeySets.valueAt(i); mKeySets.delete(ks); mKeySetMapping.delete(ks); } - for (Long keyId : deletableKeys) { - mPublicKeys.delete(keyId); + final int dkSize = deletableKeys.size(); + for (int i = 0; i < dkSize; i++) { + mPublicKeys.delete(deletableKeys.valueAt(i)); } // Now remove the deleted KeySets from each package's signingKeySets for (String pkgName : mPackages.keySet()) { PackageSetting p = mPackages.get(pkgName); - for (Long ks : deletableKeySets) { + for (int i = 0; i < dksSize; i++) { + Long ks = deletableKeySets.valueAt(i); p.keySetData.removeSigningKeySet(ks); } }