diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java index 9bba9ed0f6124..24abf8657b883 100644 --- a/services/core/java/com/android/server/pm/Installer.java +++ b/services/core/java/com/android/server/pm/Installer.java @@ -65,6 +65,8 @@ public class Installer extends SystemService { public static final int DEXOPT_IDLE_BACKGROUND_JOB = 1 << 9; /** Indicates that dexopt should restrict access to private APIs. */ public static final int DEXOPT_ENABLE_HIDDEN_API_CHECKS = 1 << 10; + /** Indicates that dexopt should convert to CompactDex. */ + public static final int DEXOPT_GENERATE_COMPACT_DEX = 1 << 11; // NOTE: keep in sync with installd public static final int FLAG_CLEAR_CACHE_ONLY = 1 << 8; diff --git a/services/core/java/com/android/server/pm/OtaDexoptService.java b/services/core/java/com/android/server/pm/OtaDexoptService.java index 9420a6c5c15bb..5a7893aa7c2de 100644 --- a/services/core/java/com/android/server/pm/OtaDexoptService.java +++ b/services/core/java/com/android/server/pm/OtaDexoptService.java @@ -266,8 +266,8 @@ public class OtaDexoptService extends IOtaDexopt.Stub { throws InstallerException { final StringBuilder builder = new StringBuilder(); - // The version. Right now it's 7. - builder.append("7 "); + // The current version. + builder.append("8 "); builder.append("dexopt"); diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java index 77bf67daa4789..9e7ad47deab9d 100644 --- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java +++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java @@ -57,6 +57,7 @@ import static com.android.server.pm.Installer.DEXOPT_STORAGE_CE; import static com.android.server.pm.Installer.DEXOPT_STORAGE_DE; import static com.android.server.pm.Installer.DEXOPT_IDLE_BACKGROUND_JOB; import static com.android.server.pm.Installer.DEXOPT_ENABLE_HIDDEN_API_CHECKS; +import static com.android.server.pm.Installer.DEXOPT_GENERATE_COMPACT_DEX; import static com.android.server.pm.InstructionSets.getAppDexInstructionSets; import static com.android.server.pm.InstructionSets.getDexCodeInstructionSets; @@ -532,12 +533,22 @@ public class PackageDexOptimizer { // Some apps are executed with restrictions on hidden API usage. If this app is one // of them, pass a flag to dexopt to enable the same restrictions during compilation. int hiddenApiFlag = info.isAllowedToUseHiddenApi() ? 0 : DEXOPT_ENABLE_HIDDEN_API_CHECKS; + // Avoid generating CompactDex for modes that are latency critical. + final int compilationReason = options.getCompilationReason(); + boolean generateCompactDex = true; + switch (compilationReason) { + case PackageManagerService.REASON_FIRST_BOOT: + case PackageManagerService.REASON_BOOT: + case PackageManagerService.REASON_INSTALL: + generateCompactDex = false; + } int dexFlags = (isPublic ? DEXOPT_PUBLIC : 0) | (debuggable ? DEXOPT_DEBUGGABLE : 0) | profileFlag | (options.isBootComplete() ? DEXOPT_BOOTCOMPLETE : 0) | (options.isDexoptIdleBackgroundJob() ? DEXOPT_IDLE_BACKGROUND_JOB : 0) + | (generateCompactDex ? DEXOPT_GENERATE_COMPACT_DEX : 0) | hiddenApiFlag; return adjustDexoptFlags(dexFlags); }