From de0272b85c4ff1eba1c58a3cdfd53bd5eb9925ef Mon Sep 17 00:00:00 2001 From: Nicolas Geoffray Date: Sun, 26 Mar 2017 14:09:04 +0100 Subject: [PATCH] Drop REASON_NON_SYSTEM_LIBRARY. Dexopt them with the same "mode" as the apk we are going to dexopt. Because we treat them as shared, this means they are only going to be fully compiled once an app that has it in its gets compiled. bug:33799337 Test: m -j32 && boot Change-Id: Ic93fbcf45be6b9cf31ad3a3eb498f9fbbefeb288 (cherry picked from commit 90978b4159dd1394c0643ae8171d24668fbc27a4) --- .../server/pm/PackageManagerService.java | 17 ++++++++++------- .../PackageManagerServiceCompilerMapping.java | 3 +-- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index a360bfaabc806..6ef0a2542713d 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -537,9 +537,8 @@ public class PackageManagerService extends IPackageManager.Stub { public static final int REASON_INSTALL = 2; public static final int REASON_BACKGROUND_DEXOPT = 3; public static final int REASON_AB_OTA = 4; - public static final int REASON_NON_SYSTEM_LIBRARY = 5; - public static final int REASON_SHARED_APK = 6; - public static final int REASON_FORCED_DEXOPT = 7; + public static final int REASON_SHARED_APK = 5; + public static final int REASON_FORCED_DEXOPT = 6; public static final int REASON_LAST = REASON_FORCED_DEXOPT; @@ -8461,19 +8460,23 @@ public class PackageManagerService extends IPackageManager.Stub { ? new PackageDexOptimizer.ForcedUpdatePackageDexOptimizer(mPackageDexOptimizer) : mPackageDexOptimizer; - // Optimize all dependencies first. Note: we ignore the return value and march on + // Dexopt all dependencies first. Note: we ignore the return value and march on // on errors. + // Note that we are going to call performDexOpt on those libraries as many times as + // they are referenced in packages. When we do a batch of performDexOpt (for example + // at boot, or background job), the passed 'targetCompilerFilter' stays the same, + // and the first package that uses the library will dexopt it. The + // others will see that the compiled code for the library is up to date. Collection deps = findSharedNonSystemLibraries(p); final String[] instructionSets = getAppDexInstructionSets(p.applicationInfo); if (!deps.isEmpty()) { for (PackageParser.Package depPackage : deps) { // TODO: Analyze and investigate if we (should) profile libraries. - // Currently this will do a full compilation of the library by default. pdo.performDexOpt(depPackage, null /* sharedLibraries */, instructionSets, false /* checkProfiles */, - getCompilerFilterForReason(REASON_NON_SYSTEM_LIBRARY), + targetCompilerFilter, getOrCreateCompilerPackageStats(depPackage), - mDexManager.isUsedByOtherApps(p.packageName)); + true /* isUsedByOtherApps */); } } return pdo.performDexOpt(p, p.usesLibraryFiles, instructionSets, checkProfiles, diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceCompilerMapping.java b/services/core/java/com/android/server/pm/PackageManagerServiceCompilerMapping.java index 4433f4a68444d..987a801c4e1c5 100644 --- a/services/core/java/com/android/server/pm/PackageManagerServiceCompilerMapping.java +++ b/services/core/java/com/android/server/pm/PackageManagerServiceCompilerMapping.java @@ -26,8 +26,7 @@ import dalvik.system.DexFile; public class PackageManagerServiceCompilerMapping { // Names for compilation reasons. static final String REASON_STRINGS[] = { - "first-boot", "boot", "install", "bg-dexopt", "ab-ota", "nsys-library", "shared-apk", - "forced-dexopt" + "first-boot", "boot", "install", "bg-dexopt", "ab-ota", "shared-apk", "forced-dexopt" }; // Static block to ensure the strings array is of the right length.