diff options
3 files changed, 56 insertions, 39 deletions
diff --git a/artd/binder/com/android/server/art/ArtifactsLocation.aidl b/artd/binder/com/android/server/art/ArtifactsLocation.aidl index 1084456dec..bb1d505c29 100644 --- a/artd/binder/com/android/server/art/ArtifactsLocation.aidl +++ b/artd/binder/com/android/server/art/ArtifactsLocation.aidl @@ -27,4 +27,15 @@ enum ArtifactsLocation { NEXT_TO_DEX = 2, /** In the dex metadata file. This means the only usable artifact is the VDEX file. */ DM = 3, + /** + * The OAT and ART files are in the SDM file next to the dex file. The VDEX file is in the DM + * file next to the dex file. The SDC file is in the global "dalvik-cache" folder. (This happens + * typically when the app is in incremental-fs.) + */ + SDM_DALVIK_CACHE = 4, + /** + * The OAT and ART files are in the SDM file next to the dex file. The VDEX file is in the DM + * file next to the dex file. The SDC file is next to the dex file. + */ + SDM_NEXT_TO_DEX = 5, } diff --git a/libartservice/service/java/com/android/server/art/Dexopter.java b/libartservice/service/java/com/android/server/art/Dexopter.java index 49bba8105e..d3bcdbb270 100644 --- a/libartservice/service/java/com/android/server/art/Dexopter.java +++ b/libartservice/service/java/com/android/server/art/Dexopter.java @@ -628,7 +628,10 @@ public abstract class Dexopter<DexInfoType extends DetailedDexInfo> { return VdexPath.artifactsPath(AidlUtils.buildArtifactsPathAsInput( dexPath, isa, false /* isInDalvikCache */)); case ArtifactsLocation.DM: - // The DM file is passed to dex2oat as a separate flag whenever it exists. + case ArtifactsLocation.SDM_DALVIK_CACHE: + case ArtifactsLocation.SDM_NEXT_TO_DEX: + // In these cases, the VDEX file is in the DM file. The whole DM file is passed to + // dex2oat as a separate flag whenever it exists. return null; default: // This should never happen as the value is got from artd. diff --git a/libartservice/service/javatests/com/android/server/art/PrimaryDexopterTest.java b/libartservice/service/javatests/com/android/server/art/PrimaryDexopterTest.java index 0711eff49c..b032538bbb 100644 --- a/libartservice/service/javatests/com/android/server/art/PrimaryDexopterTest.java +++ b/libartservice/service/javatests/com/android/server/art/PrimaryDexopterTest.java @@ -63,6 +63,7 @@ import java.util.concurrent.ForkJoinPool; import java.util.concurrent.Future; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; import java.util.zip.ZipFile; @SmallTest @@ -157,50 +158,52 @@ public class PrimaryDexopterTest extends PrimaryDexopterTestBase { mUsedEmbeddedProfiles = new ArrayList<>(); } - @Test - public void testDexoptInputVdex() throws Exception { - // null. - doReturn(dexoptIsNeeded(ArtifactsLocation.NONE_OR_ERROR)) + private void checkDexoptInputVdex( + @ArtifactsLocation int location, Supplier<VdexPath> inputVdexMatcher) throws Exception { + doReturn(dexoptIsNeeded(location)) .when(mArtd) .getDexoptNeeded(eq(mDexPath), eq("arm64"), any(), any(), anyInt()); - doReturn(mArtdDexoptResult) - .when(mArtd) - .dexopt(any(), eq(mDexPath), eq("arm64"), any(), any(), any(), isNull(), any(), - anyInt(), any(), any()); - // ArtifactsPath, isInDalvikCache=true. - doReturn(dexoptIsNeeded(ArtifactsLocation.DALVIK_CACHE)) - .when(mArtd) - .getDexoptNeeded(eq(mDexPath), eq("arm"), any(), any(), anyInt()); - doReturn(mArtdDexoptResult) - .when(mArtd) - .dexopt(any(), eq(mDexPath), eq("arm"), any(), any(), any(), - deepEq(VdexPath.artifactsPath(AidlUtils.buildArtifactsPathAsInput( - mDexPath, "arm", true /* isInDalvikCache */))), - any(), anyInt(), any(), any()); + List<DexContainerFileDexoptResult> results = mPrimaryDexopter.dexopt(); + verifyStatusAllOk(results); + verify(mArtd).dexopt(any(), eq(mDexPath), eq("arm64"), any(), any(), any(), + inputVdexMatcher.get(), any(), anyInt(), any(), any()); + } - // ArtifactsPath, isInDalvikCache=false. - doReturn(dexoptIsNeeded(ArtifactsLocation.NEXT_TO_DEX)) - .when(mArtd) - .getDexoptNeeded(eq(mSplit0DexPath), eq("arm64"), any(), any(), anyInt()); - doReturn(mArtdDexoptResult) - .when(mArtd) - .dexopt(any(), eq(mSplit0DexPath), eq("arm64"), any(), any(), any(), - deepEq(VdexPath.artifactsPath(AidlUtils.buildArtifactsPathAsInput( - mSplit0DexPath, "arm64", false /* isInDalvikCache */))), - any(), anyInt(), any(), any()); + @Test + public void testDexoptInputVdexNoneOrError() throws Exception { + checkDexoptInputVdex(ArtifactsLocation.NONE_OR_ERROR, () -> isNull()); + } - // DexMetadataPath. - doReturn(dexoptIsNeeded(ArtifactsLocation.DM)) - .when(mArtd) - .getDexoptNeeded(eq(mSplit0DexPath), eq("arm"), any(), any(), anyInt()); - doReturn(mArtdDexoptResult) - .when(mArtd) - .dexopt(any(), eq(mSplit0DexPath), eq("arm"), any(), any(), any(), isNull(), any(), - anyInt(), any(), any()); + @Test + public void testDexoptInputVdexDalvikCache() throws Exception { + checkDexoptInputVdex(ArtifactsLocation.DALVIK_CACHE, () -> { + return deepEq(VdexPath.artifactsPath(AidlUtils.buildArtifactsPathAsInput( + mDexPath, "arm64", true /* isInDalvikCache */))); + }); + } - List<DexContainerFileDexoptResult> results = mPrimaryDexopter.dexopt(); - verifyStatusAllOk(results); + @Test + public void testDexoptInputVdexNextToDex() throws Exception { + checkDexoptInputVdex(ArtifactsLocation.NEXT_TO_DEX, () -> { + return deepEq(VdexPath.artifactsPath(AidlUtils.buildArtifactsPathAsInput( + mDexPath, "arm64", false /* isInDalvikCache */))); + }); + } + + @Test + public void testDexoptInputVdexDm() throws Exception { + checkDexoptInputVdex(ArtifactsLocation.DM, () -> isNull()); + } + + @Test + public void testDexoptInputVdexSdmDalvikCache() throws Exception { + checkDexoptInputVdex(ArtifactsLocation.SDM_DALVIK_CACHE, () -> isNull()); + } + + @Test + public void testDexoptInputVdexSdmNextToDex() throws Exception { + checkDexoptInputVdex(ArtifactsLocation.SDM_NEXT_TO_DEX, () -> isNull()); } @Test |