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);
         }
     }
 }