From ce54397368dc98182d7b4eb2ff3c142bbd87e39d Mon Sep 17 00:00:00 2001 From: Shubham Ajmera Date: Fri, 9 Jun 2017 15:40:58 -0700 Subject: [PATCH] Compile secondary dex at boot after OTA Bug: 38413085 Test: build successful 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 54ca6b950ed76..2a45d156ed420 100644 --- a/services/core/java/com/android/server/pm/OtaDexoptService.java +++ b/services/core/java/com/android/server/pm/OtaDexoptService.java @@ -345,6 +345,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 92c5862910c5e..e3575a939ba50 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -9340,24 +9340,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++; } } @@ -9559,8 +9574,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,