Use DexUseManager to determine whether a primary dex needs to be shared.
Bug: 249984283
Test: atest ArtServiceTests
Ignore-AOSP-First: ART Services.
Change-Id: Idcaf89d3e4e54a75e8700ac18dcbe1907cfa9833
diff --git a/libartservice/service/java/com/android/server/art/PrimaryDexOptimizer.java b/libartservice/service/java/com/android/server/art/PrimaryDexOptimizer.java
index 81990d2..a80bb05 100644
--- a/libartservice/service/java/com/android/server/art/PrimaryDexOptimizer.java
+++ b/libartservice/service/java/com/android/server/art/PrimaryDexOptimizer.java
@@ -116,7 +116,8 @@
String compilerFilter = targetCompilerFilter;
boolean needsToBeShared = isSharedLibrary(pkg)
- || mInjector.isUsedByOtherApps(pkgState.getPackageName());
+ || mInjector.getDexUseManager().isPrimaryDexUsedByOtherApps(
+ pkgState.getPackageName(), dexInfo.dexPath());
boolean isOtherReadable = true;
// If true, implies that the profile has changed since the last compilation.
boolean profileMerged = false;
@@ -647,17 +648,17 @@
return packageName.equals(mContext.getString(R.string.config_systemUi));
}
- boolean isUsedByOtherApps(@NonNull String packageName) {
- // TODO(jiakaiz): Get the real value.
- return false;
- }
-
@NonNull
UserManager getUserManager() {
return mContext.getSystemService(UserManager.class);
}
@NonNull
+ DexUseManager getDexUseManager() {
+ return DexUseManager.getInstance();
+ }
+
+ @NonNull
public IArtd getArtd() {
return Utils.getArtd();
}
diff --git a/libartservice/service/javatests/com/android/server/art/PrimaryDexOptimizerTest.java b/libartservice/service/javatests/com/android/server/art/PrimaryDexOptimizerTest.java
index c2ef33f..2eae691 100644
--- a/libartservice/service/javatests/com/android/server/art/PrimaryDexOptimizerTest.java
+++ b/libartservice/service/javatests/com/android/server/art/PrimaryDexOptimizerTest.java
@@ -347,7 +347,10 @@
@Test
public void testDexoptNeedsToBeShared() throws Exception {
- when(mInjector.isUsedByOtherApps(PKG_NAME)).thenReturn(true);
+ when(mDexUseManager.isPrimaryDexUsedByOtherApps(eq(PKG_NAME), eq(mDexPath)))
+ .thenReturn(true);
+ when(mDexUseManager.isPrimaryDexUsedByOtherApps(eq(PKG_NAME), eq(mSplit0DexPath)))
+ .thenReturn(true);
// The ref profile is usable but shouldn't be used.
makeProfileUsable(mRefProfile);
@@ -386,7 +389,11 @@
@Test
public void testDexoptNeedsToBeSharedArtifactsArePublic() throws Exception {
// Same setup as above, but the existing artifacts are public.
- when(mInjector.isUsedByOtherApps(PKG_NAME)).thenReturn(true);
+ when(mDexUseManager.isPrimaryDexUsedByOtherApps(eq(PKG_NAME), eq(mDexPath)))
+ .thenReturn(true);
+ when(mDexUseManager.isPrimaryDexUsedByOtherApps(eq(PKG_NAME), eq(mSplit0DexPath)))
+ .thenReturn(true);
+
makeProfileUsable(mRefProfile);
makeProfileNotUsable(mPrebuiltProfile);
makeProfileUsable(mDmProfile);
diff --git a/libartservice/service/javatests/com/android/server/art/PrimaryDexOptimizerTestBase.java b/libartservice/service/javatests/com/android/server/art/PrimaryDexOptimizerTestBase.java
index be0e491..c175640 100644
--- a/libartservice/service/javatests/com/android/server/art/PrimaryDexOptimizerTestBase.java
+++ b/libartservice/service/javatests/com/android/server/art/PrimaryDexOptimizerTestBase.java
@@ -58,6 +58,7 @@
@Mock protected PrimaryDexOptimizer.Injector mInjector;
@Mock protected IArtd mArtd;
@Mock protected UserManager mUserManager;
+ @Mock protected DexUseManager mDexUseManager;
protected PackageState mPkgState;
protected AndroidPackage mPkg;
protected PackageUserState mPkgUserStateNotInstalled;
@@ -70,8 +71,8 @@
public void setUp() throws Exception {
lenient().when(mInjector.getArtd()).thenReturn(mArtd);
lenient().when(mInjector.isSystemUiPackage(any())).thenReturn(false);
- lenient().when(mInjector.isUsedByOtherApps(any())).thenReturn(false);
lenient().when(mInjector.getUserManager()).thenReturn(mUserManager);
+ lenient().when(mInjector.getDexUseManager()).thenReturn(mDexUseManager);
lenient()
.when(SystemProperties.get("dalvik.vm.systemuicompilerfilter"))
@@ -95,6 +96,8 @@
.when(mUserManager.getUserHandles(anyBoolean()))
.thenReturn(List.of(UserHandle.of(0), UserHandle.of(1), UserHandle.of(2)));
+ lenient().when(mDexUseManager.isPrimaryDexUsedByOtherApps(any(), any())).thenReturn(false);
+
mPkgUserStateNotInstalled = createPackageUserState(false /* installed */);
mPkgUserStateInstalled = createPackageUserState(true /* installed */);
mPkgState = createPackageState();