Don't compile an app if it wants to use the embedded dex.
Bug: 229268202
Test: atest ArtServiceTests
Ignore-AOSP-First: ART Services.
Change-Id: I0764115d9f7a79205f19c4702ab10b13073053b0
diff --git a/libartservice/service/java/com/android/server/art/DexOptimizer.java b/libartservice/service/java/com/android/server/art/DexOptimizer.java
index 13afa0b..2096977 100644
--- a/libartservice/service/java/com/android/server/art/DexOptimizer.java
+++ b/libartservice/service/java/com/android/server/art/DexOptimizer.java
@@ -270,9 +270,19 @@
}
// We cannot do AOT compilation if we don't have a valid class loader context.
- if (dexInfo.classLoaderContext() == null
- && DexFile.isOptimizedCompilerFilter(targetCompilerFilter)) {
- return "verify";
+ if (dexInfo.classLoaderContext() == null) {
+ return DexFile.isOptimizedCompilerFilter(targetCompilerFilter) ? "verify"
+ : targetCompilerFilter;
+ }
+
+ // This application wants to use the embedded dex in the APK, rather than extracted or
+ // locally compiled variants, so we only verify it.
+ // "verify" does not prevent dex2oat from extracting the dex code, but in practice, dex2oat
+ // won't extract the dex code because the APK is uncompressed, and the assumption is that
+ // such applications always use uncompressed APKs.
+ if (mPkg.isUseEmbeddedDex()) {
+ return DexFile.isOptimizedCompilerFilter(targetCompilerFilter) ? "verify"
+ : targetCompilerFilter;
}
return targetCompilerFilter;
diff --git a/libartservice/service/javatests/com/android/server/art/PrimaryDexOptimizerParameterizedTest.java b/libartservice/service/javatests/com/android/server/art/PrimaryDexOptimizerParameterizedTest.java
index dc36886..91147b0 100644
--- a/libartservice/service/javatests/com/android/server/art/PrimaryDexOptimizerParameterizedTest.java
+++ b/libartservice/service/javatests/com/android/server/art/PrimaryDexOptimizerParameterizedTest.java
@@ -130,6 +130,12 @@
list.add(params);
params = new Params();
+ params.mIsUseEmbeddedDex = true;
+ params.mRequestedCompilerFilter = "speed";
+ params.mExpectedCompilerFilter = "verify";
+ list.add(params);
+
+ params = new Params();
params.mAlwaysDebuggable = true;
params.mExpectedIsDebuggable = true;
list.add(params);
@@ -178,6 +184,7 @@
lenient().when(mPkg.getTargetSdkVersion()).thenReturn(123);
lenient().when(mPkg.isSignedWithPlatformKey()).thenReturn(mParams.mIsSignedWithPlatformKey);
lenient().when(mPkg.isUsesNonSdkApi()).thenReturn(mParams.mIsUsesNonSdkApi);
+ lenient().when(mPkg.isUseEmbeddedDex()).thenReturn(mParams.mIsUseEmbeddedDex);
lenient().when(mPkgState.isSystem()).thenReturn(mParams.mIsSystem);
lenient().when(mPkgState.isUpdatedSystemApp()).thenReturn(mParams.mIsUpdatedSystemApp);
@@ -296,6 +303,7 @@
public boolean mIsVmSafeMode = false;
public boolean mIsDebuggable = false;
public boolean mIsSystemUi = false;
+ public boolean mIsUseEmbeddedDex = false;
// Options.
public String mRequestedCompilerFilter = "verify";
@@ -316,15 +324,15 @@
public String toString() {
return String.format("isSystem=%b,isUpdatedSystemApp=%b,isSignedWithPlatformKey=%b,"
+ "isUsesNonSdkApi=%b,isVmSafeMode=%b,isDebuggable=%b,isSystemUi=%b,"
- + "requestedCompilerFilter=%s,force=%b,shouldDowngrade=%b,"
- + "alwaysDebuggable=%b => targetCompilerFilter=%s,"
+ + "isUseEmbeddedDex=%b,requestedCompilerFilter=%s,force=%b,"
+ + "shouldDowngrade=%b,alwaysDebuggable=%b => targetCompilerFilter=%s,"
+ "expectedDexoptTrigger=%d,expectedIsInDalvikCache=%b,"
+ "expectedIsDebuggable=%b,expectedIsHiddenApiPolicyEnabled=%b",
mIsSystem, mIsUpdatedSystemApp, mIsSignedWithPlatformKey, mIsUsesNonSdkApi,
- mIsVmSafeMode, mIsDebuggable, mIsSystemUi, mRequestedCompilerFilter, mForce,
- mShouldDowngrade, mAlwaysDebuggable, mExpectedCompilerFilter,
- mExpectedDexoptTrigger, mExpectedIsInDalvikCache, mExpectedIsDebuggable,
- mExpectedIsHiddenApiPolicyEnabled);
+ mIsVmSafeMode, mIsDebuggable, mIsSystemUi, mIsUseEmbeddedDex,
+ mRequestedCompilerFilter, mForce, mShouldDowngrade, mAlwaysDebuggable,
+ mExpectedCompilerFilter, mExpectedDexoptTrigger, mExpectedIsInDalvikCache,
+ mExpectedIsDebuggable, mExpectedIsHiddenApiPolicyEnabled);
}
}
}