From e523aa4f6bf24d3f65ec9a8a79fa8ae23a62b8ed Mon Sep 17 00:00:00 2001 From: Shubham Ajmera Date: Fri, 9 Jun 2017 15:40:58 -0700 Subject: [PATCH 1/2] Compile secondary dex at boot after OTA (cherry picked from commit ce54397368dc98182d7b4eb2ff3c142bbd87e39d) Bug: 38413085 Test: build successful Merged-In: If080281fb3147fea625bcafce91167e8c1439736 Change-Id: If080281fb3147fea625bcafce91167e8c1439736 --- .../android/server/pm/OtaDexoptService.java | 4 ++ .../server/pm/PackageManagerService.java | 47 ++++++++++++------- .../com/android/server/pm/dex/DexManager.java | 8 +++- 3 files changed, 41 insertions(+), 18 deletions(-) diff --git a/services/core/java/com/android/server/pm/OtaDexoptService.java b/services/core/java/com/android/server/pm/OtaDexoptService.java index a43f8afa4d97b..60d7c959ab6de 100644 --- a/services/core/java/com/android/server/pm/OtaDexoptService.java +++ b/services/core/java/com/android/server/pm/OtaDexoptService.java @@ -321,6 +321,10 @@ public class OtaDexoptService extends IOtaDexopt.Stub { mPackageManagerService.getDexManager().isUsedByOtherApps(pkg.packageName), true /* bootComplete */); + mPackageManagerService.getDexManager().dexoptSecondaryDex(pkg.packageName, + getCompilerFilterForReason(compilationReason), + false /* force */, + false /* compileOnlySharedDex */); return commands; } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index da1df78b4f47b..1934b79c62ede 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -9392,24 +9392,39 @@ public class PackageManagerService extends IPackageManager.Stub // Unfortunately this will also means that "pm.dexopt.boot=speed-profile" will // behave differently than "pm.dexopt.bg-dexopt=speed-profile" but that's a // trade-off worth doing to save boot time work. - int dexOptStatus = performDexOptTraced(pkg.packageName, + int primaryDexOptStaus = performDexOptTraced(pkg.packageName, false /* checkProfiles */, compilerFilter, false /* force */, bootComplete); - switch (dexOptStatus) { - case PackageDexOptimizer.DEX_OPT_PERFORMED: - numberOfPackagesOptimized++; - break; - case PackageDexOptimizer.DEX_OPT_SKIPPED: - numberOfPackagesSkipped++; - break; - case PackageDexOptimizer.DEX_OPT_FAILED: - numberOfPackagesFailed++; - break; - default: - Log.e(TAG, "Unexpected dexopt return code " + dexOptStatus); - break; + + boolean secondaryDexOptStatus = true; + if (pkg.isSystemApp()) { + // Only dexopt shared secondary dex files belonging to system apps to not slow down + // too much boot after an OTA. + secondaryDexOptStatus = mDexManager.dexoptSecondaryDex(pkg.packageName, + compilerFilter, + false /* force */, + true /* compileOnlySharedDex */); + } + + if (secondaryDexOptStatus) { + switch (primaryDexOptStaus) { + case PackageDexOptimizer.DEX_OPT_PERFORMED: + numberOfPackagesOptimized++; + break; + case PackageDexOptimizer.DEX_OPT_SKIPPED: + numberOfPackagesSkipped++; + break; + case PackageDexOptimizer.DEX_OPT_FAILED: + numberOfPackagesFailed++; + break; + default: + Log.e(TAG, "Unexpected dexopt return code " + primaryDexOptStaus); + break; + } + } else { + numberOfPackagesFailed++; } } @@ -9611,8 +9626,8 @@ public class PackageManagerService extends IPackageManager.Stub } else if (isInstantApp(packageName, UserHandle.getCallingUserId())) { return false; } - mDexManager.reconcileSecondaryDexFiles(packageName); - return mDexManager.dexoptSecondaryDex(packageName, compilerFilter, force); + return mDexManager.dexoptSecondaryDex(packageName, compilerFilter, force, + /* compileOnlySharedDex*/ false); } public boolean performDexOptSecondary(String packageName, int compileReason, diff --git a/services/core/java/com/android/server/pm/dex/DexManager.java b/services/core/java/com/android/server/pm/dex/DexManager.java index be50eeeefc248..db2d30f9e5684 100644 --- a/services/core/java/com/android/server/pm/dex/DexManager.java +++ b/services/core/java/com/android/server/pm/dex/DexManager.java @@ -307,7 +307,7 @@ public class DexManager { public boolean dexoptSecondaryDex(String packageName, int compilerReason, boolean force) { return dexoptSecondaryDex(packageName, PackageManagerServiceCompilerMapping.getCompilerFilterForReason(compilerReason), - force); + force, /* compileOnlySharedDex */ false); } /** @@ -315,7 +315,8 @@ public class DexManager { * @return true if all secondary dex files were processed successfully (compiled or skipped * because they don't need to be compiled).. */ - public boolean dexoptSecondaryDex(String packageName, String compilerFilter, boolean force) { + public boolean dexoptSecondaryDex(String packageName, String compilerFilter, boolean force, + boolean compileOnlySharedDex) { // Select the dex optimizer based on the force parameter. // Forced compilation is done through ForcedUpdatePackageDexOptimizer which will adjust // the necessary dexopt flags to make sure that compilation is not skipped. This avoid @@ -337,6 +338,9 @@ public class DexManager { for (Map.Entry entry : useInfo.getDexUseInfoMap().entrySet()) { String dexPath = entry.getKey(); DexUseInfo dexUseInfo = entry.getValue(); + if (compileOnlySharedDex && !dexUseInfo.isUsedByOtherApps()) { + continue; + } PackageInfo pkg = null; try { pkg = mPackageManager.getPackageInfo(packageName, /*flags*/0, From c477ab141f9171f329c96b97ee073354847f727c Mon Sep 17 00:00:00 2001 From: Mathieu Chartier Date: Thu, 15 Jun 2017 19:09:38 -0700 Subject: [PATCH 2/2] Add property for system server compiler filter The property is dalvik.vm.systemservercompilerfilter, this changes if dexopt is needed. (cherry picked from commit 5e07a0d9cacb1bf943f4617b1edcb930e1578dad) Bug: 62356545 Test: adb shell setprop dalvik.vm.systemservercompilerfilter quicken Test: adb shell stop && adb shell start Merged-In: I2ef3737f24816a4cb75e718abf274a891eb9fda1 Change-Id: I2ef3737f24816a4cb75e718abf274a891eb9fda1 --- core/java/com/android/internal/os/ZygoteInit.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java index 6d8b81170e21c..2fd252170bbf8 100644 --- a/core/java/com/android/internal/os/ZygoteInit.java +++ b/core/java/com/android/internal/os/ZygoteInit.java @@ -546,12 +546,13 @@ public class ZygoteInit { for (String classPathElement : classPathElements) { // System server is fully AOTed and never profiled // for profile guided compilation. - // TODO: Make this configurable between INTERPRET_ONLY, SPEED, SPACE and EVERYTHING? + String systemServerFilter = SystemProperties.get( + "dalvik.vm.systemservercompilerfilter", "speed"); int dexoptNeeded; try { dexoptNeeded = DexFile.getDexOptNeeded( - classPathElement, instructionSet, "speed", + classPathElement, instructionSet, systemServerFilter, false /* newProfile */, false /* downgrade */); } catch (FileNotFoundException ignored) { // Do not add to the classpath. @@ -570,7 +571,7 @@ public class ZygoteInit { final String packageName = "*"; final String outputPath = null; final int dexFlags = 0; - final String compilerFilter = "speed"; + final String compilerFilter = systemServerFilter; final String uuid = StorageManager.UUID_PRIVATE_INTERNAL; final String seInfo = null; try {