From 1b33309d4fdfcf75809cca898badec3e45640fbe Mon Sep 17 00:00:00 2001 From: Jackal Guo Date: Mon, 30 Mar 2020 11:12:56 +0800 Subject: [PATCH] Use hand-written counted loop for ArrayList With an ArrayList, a hand-written counted loop is faster than the enhanced for loop. Fix: 152471853 Test: Run atest under pm folder. Change-Id: I7e7a9a5a0ca2b1327eb9c0528c00ef5c1995a7d8 --- .../com/android/server/pm/ApexManager.java | 9 +++-- .../com/android/server/pm/StagingManager.java | 34 ++++++++++--------- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java index b9d656181b55c..f06b50a9fdb0f 100644 --- a/services/core/java/com/android/server/pm/ApexManager.java +++ b/services/core/java/com/android/server/pm/ApexManager.java @@ -522,7 +522,8 @@ public abstract class ApexManager { "APEX packages have not been scanned"); boolean matchActive = (flags & MATCH_ACTIVE_PACKAGE) != 0; boolean matchFactory = (flags & MATCH_FACTORY_PACKAGE) != 0; - for (PackageInfo packageInfo: mAllPackagesCache) { + for (int i = 0, size = mAllPackagesCache.size(); i < size; i++) { + final PackageInfo packageInfo = mAllPackagesCache.get(i); if (!packageInfo.packageName.equals(packageName)) { continue; } @@ -581,7 +582,8 @@ public abstract class ApexManager { if (!isApexSupported()) return false; Preconditions.checkState(mAllPackagesCache != null, "APEX packages have not been scanned"); - for (PackageInfo packageInfo : mAllPackagesCache) { + for (int i = 0, size = mAllPackagesCache.size(); i < size; i++) { + final PackageInfo packageInfo = mAllPackagesCache.get(i); if (packageInfo.packageName.equals(packageName)) { return true; } @@ -839,7 +841,8 @@ public abstract class ApexManager { IndentingPrintWriter ipw) { ipw.println(); ipw.increaseIndent(); - for (PackageInfo pi : packagesCache) { + for (int i = 0, size = packagesCache.size(); i < size; i++) { + final PackageInfo pi = packagesCache.get(i); if (packageName != null && !packageName.equals(pi.packageName)) { continue; } diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java index 60292b45c0eeb..0b1b71a086609 100644 --- a/services/core/java/com/android/server/pm/StagingManager.java +++ b/services/core/java/com/android/server/pm/StagingManager.java @@ -254,8 +254,9 @@ public class StagingManager { private int retrieveRollbackIdForCommitSession(int sessionId) throws PackageManagerException { RollbackManager rm = mContext.getSystemService(RollbackManager.class); - List rollbacks = rm.getRecentlyCommittedRollbacks(); - for (RollbackInfo rollback : rollbacks) { + final List rollbacks = rm.getRecentlyCommittedRollbacks(); + for (int i = 0, size = rollbacks.size(); i < size; i++) { + final RollbackInfo rollback = rollbacks.get(i); if (rollback.getCommittedSessionId() == sessionId) { return rollback.getRollbackId(); } @@ -388,7 +389,8 @@ public class StagingManager { } } } - for (PackageInstallerSession childSession : childrenSessions) { + for (int i = 0, size = childrenSessions.size(); i < size; i++) { + final PackageInstallerSession childSession = childrenSessions.get(i); if (sessionContainsApex(childSession)) { apexSessions.add(childSession); } @@ -402,15 +404,15 @@ public class StagingManager { IRollbackManager rm = IRollbackManager.Stub.asInterface( ServiceManager.getService(Context.ROLLBACK_SERVICE)); - for (PackageInstallerSession apexSession : apexSessions) { - String packageName = apexSession.getPackageName(); + for (int i = 0, sessionsSize = apexSessions.size(); i < sessionsSize; i++) { + final String packageName = apexSessions.get(i).getPackageName(); // Perform any snapshots or restores for the APEX itself snapshotAndRestoreApexUserData(packageName, allUsers, rm); // Process the apks inside the APEX - List apksInApex = mApexManager.getApksInApex(packageName); - for (String apk: apksInApex) { - snapshotAndRestoreApkInApexUserData(apk, allUsers, rm); + final List apksInApex = mApexManager.getApksInApex(packageName); + for (int j = 0, apksSize = apksInApex.size(); j < apksSize; j++) { + snapshotAndRestoreApkInApexUserData(apksInApex.get(j), allUsers, rm); } } } @@ -637,7 +639,8 @@ public class StagingManager { 0 /* UserHandle.SYSTEM */); PackageInstallerSession apkSession = mPi.getSession(apkSessionId); apkSession.open(); - for (String apkFilePath : apkFilePaths) { + for (int i = 0, size = apkFilePaths.size(); i < size; i++) { + final String apkFilePath = apkFilePaths.get(i); File apkFile = new File(apkFilePath); ParcelFileDescriptor pfd = ParcelFileDescriptor.open(apkFile, ParcelFileDescriptor.MODE_READ_ONLY); @@ -705,9 +708,9 @@ public class StagingManager { "Unable to prepare multi-package session for staged session"); } - for (PackageInstallerSession sessionToClone : childSessions) { - PackageInstallerSession apkChildSession = - createAndWriteApkSession(sessionToClone, preReboot); + for (int i = 0, size = childSessions.size(); i < size; i++) { + final PackageInstallerSession apkChildSession = createAndWriteApkSession( + childSessions.get(i), preReboot); try { apkParentSession.addChildSessionId(apkChildSession.sessionId); } catch (IllegalStateException e) { @@ -1206,10 +1209,9 @@ public class StagingManager { // multi-package sessions, find all the child sessions that contain an APEX. if (hasApex) { try { - final List apexPackages = - submitSessionToApexService(session); - for (PackageInfo apexPackage : apexPackages) { - validateApexSignature(apexPackage); + final List apexPackages = submitSessionToApexService(session); + for (int i = 0, size = apexPackages.size(); i < size; i++) { + validateApexSignature(apexPackages.get(i)); } } catch (PackageManagerException e) { session.setStagedSessionFailed(e.error, e.getMessage());