From 85cfaad535ba9b24a30cc1cb1ea157e96c1d8f2c Mon Sep 17 00:00:00 2001 From: JW Wang Date: Fri, 23 Sep 2022 10:39:31 +0800 Subject: [PATCH] Skip APEX when doing dexopt APEX is not dex-optimized and doesn't have a valid UID. Fix: 247001427 Bug: 225756739 Test: adb shell cmd package compile -m speed-profile -a Change-Id: Idce43d23eb92c39d8861f29136adaea5a676706d --- .../java/com/android/server/pm/DexOptHelper.java | 12 ++++++++++++ .../com/android/server/pm/PackageDexOptimizer.java | 5 +++++ 2 files changed, 17 insertions(+) diff --git a/services/core/java/com/android/server/pm/DexOptHelper.java b/services/core/java/com/android/server/pm/DexOptHelper.java index 2b8a196ba5280..cd074c0d4a5d7 100644 --- a/services/core/java/com/android/server/pm/DexOptHelper.java +++ b/services/core/java/com/android/server/pm/DexOptHelper.java @@ -385,6 +385,11 @@ final class DexOptHelper { } else if (snapshot.isInstantApp(options.getPackageName(), UserHandle.getCallingUserId())) { return false; } + var pkg = snapshot.getPackage(options.getPackageName()); + if (pkg != null && pkg.isApex()) { + // skip APEX + return true; + } if (options.isDexoptOnlySecondaryDex()) { return mPm.getDexManager().dexoptSecondaryDex(options); @@ -427,6 +432,10 @@ final class DexOptHelper { // Package could not be found. Report failure. return PackageDexOptimizer.DEX_OPT_FAILED; } + if (p.isApex()) { + // APEX needs no dexopt + return PackageDexOptimizer.DEX_OPT_SKIPPED; + } mPm.getPackageUsage().maybeWriteAsync(mPm.mSettings.getPackagesLocked()); mPm.mCompilerStats.maybeWriteAsync(); } @@ -498,6 +507,9 @@ final class DexOptHelper { if (packageState == null || pkg == null) { throw new IllegalArgumentException("Unknown package: " + packageName); } + if (pkg.isApex()) { + throw new IllegalArgumentException("Can't dexopt APEX package: " + packageName); + } Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dexopt"); diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java index 3fb4066c965a1..178d0ea594b1c 100644 --- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java +++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java @@ -189,6 +189,11 @@ public class PackageDexOptimizer { return false; } + // We do not dexopt APEX packages. + if (pkg.isApex()) { + return false; + } + // We do not dexopt unused packages. // It's possible for this to be called before app hibernation service is ready due to // an OTA dexopt. In this case, we ignore the hibernation check here. This is fine since