diff --git a/services/core/java/com/android/server/pm/BackgroundDexOptService.java b/services/core/java/com/android/server/pm/BackgroundDexOptService.java index 0a254029a8f4b..ee02a9954a5ad 100644 --- a/services/core/java/com/android/server/pm/BackgroundDexOptService.java +++ b/services/core/java/com/android/server/pm/BackgroundDexOptService.java @@ -144,11 +144,18 @@ public class BackgroundDexOptService extends JobService { if (DEBUG_DEXOPT) { Log.i(TAG, "Updating package " + pkg); } + // Update package if needed. Note that there can be no race between concurrent // jobs because PackageDexOptimizer.performDexOpt is synchronized. + + // checkProfiles is false to avoid merging profiles during boot which + // might interfere with background compilation (b/28612421). + // 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. pm.performDexOpt(pkg, /* instruction set */ null, - /* checkProfiles */ true, + /* checkProfiles */ false, PackageManagerService.REASON_BOOT, /* force */ false); } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 96bfe4a27a0a1..d268e8543f6b1 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -7196,9 +7196,14 @@ public class PackageManagerService extends IPackageManager.Stub { } } + // checkProfiles is false to avoid merging profiles during boot which + // might interfere with background compilation (b/28612421). + // 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, null /* instructionSet */, - true /* checkProfiles */, + false /* checkProfiles */, getCompilerFilterForReason(causeFirstBoot ? REASON_FIRST_BOOT : REASON_BOOT), false /* force */); switch (dexOptStatus) {