summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Anton Kulakov <akulakov@google.com> 2024-07-05 15:03:32 +0000
committer Anton Kulakov <akulakov@google.com> 2024-07-08 07:01:39 +0000
commitb0b9465f5e60087ac69552783ee863a17ba00515 (patch)
treeda2de3a8f423809921a93cc68a956bb2f2897d18
parentca92bc74a356f31ad3b5456d5c6ebe699942e9ef (diff)
Skip Secondary dexopt for PrivacySandbox SDKs.
PrivacySandbox SDK packages can't have secondary DEX files. After recent changes in PackageManager, these libraries have appId = -1, resulting in errors when DexoptHelper trying to perform background secondary dexopt. Bug: 348427557 Test: DexoptHelperTest Change-Id: I5d34d34f8a0773d7cf189f0cc79978ea48bbe709
-rw-r--r--libartservice/service/java/com/android/server/art/DexoptHelper.java3
-rw-r--r--libartservice/service/javatests/com/android/server/art/DexoptHelperTest.java30
2 files changed, 31 insertions, 2 deletions
diff --git a/libartservice/service/java/com/android/server/art/DexoptHelper.java b/libartservice/service/java/com/android/server/art/DexoptHelper.java
index 1f7bd93235..2369ad4eba 100644
--- a/libartservice/service/java/com/android/server/art/DexoptHelper.java
+++ b/libartservice/service/java/com/android/server/art/DexoptHelper.java
@@ -239,7 +239,8 @@ public class DexoptHelper {
.dexopt());
}
- if ((params.getFlags() & ArtFlags.FLAG_FOR_SECONDARY_DEX) != 0) {
+ if (((params.getFlags() & ArtFlags.FLAG_FOR_SECONDARY_DEX) != 0)
+ && pkgState.getAppId() > 0) {
if (cancellationSignal.isCanceled()) {
return createResult.apply(DexoptResult.DEXOPT_CANCELLED);
}
diff --git a/libartservice/service/javatests/com/android/server/art/DexoptHelperTest.java b/libartservice/service/javatests/com/android/server/art/DexoptHelperTest.java
index 8fb46b6225..ac5947930b 100644
--- a/libartservice/service/javatests/com/android/server/art/DexoptHelperTest.java
+++ b/libartservice/service/javatests/com/android/server/art/DexoptHelperTest.java
@@ -88,6 +88,7 @@ public class DexoptHelperTest {
private static final String PKG_NAME_LIB3 = "com.example.lib3";
private static final String PKG_NAME_LIB4 = "com.example.lib4";
private static final String PKG_NAME_LIBBAZ = "com.example.libbaz";
+ private static final String PKG_NAME_SDK = "com.example.sdk";
@Rule
public StaticMockitoRule mockitoRule = new StaticMockitoRule(PackageStateModulesUtils.class);
@@ -283,6 +284,28 @@ public class DexoptHelperTest {
}
@Test
+ public void testDexoptSdkPrimaryOnly() throws Exception {
+ mParams = new DexoptParams.Builder("bg-dexopt")
+ .setCompilerFilter("speed-profile")
+ .setFlags(ArtFlags.FLAG_FOR_PRIMARY_DEX | ArtFlags.FLAG_FOR_SECONDARY_DEX)
+ .build();
+
+ PackageState sdkPackageState =
+ createPackageState(PKG_NAME_SDK, -1 /* appId */, List.of(), false);
+ lenient().when(mSnapshot.getPackageState(PKG_NAME_SDK)).thenReturn(sdkPackageState);
+ mRequestedPackages = List.of(PKG_NAME_SDK);
+
+ DexoptResult result = mDexoptHelper.dexopt(
+ mSnapshot, mRequestedPackages, mParams, mCancellationSignal, mExecutor);
+
+ assertThat(result.getPackageDexoptResults()).hasSize(1);
+ checkPackageResult(result, 0 /* index */, PKG_NAME_SDK, DexoptResult.DEXOPT_PERFORMED,
+ List.of(mPrimaryResults));
+
+ verifyNoMoreDexopt(1 /* expectedPrimaryTimes */, 0 /* expectedSecondaryTimes */);
+ }
+
+ @Test
public void testDexoptPrimaryOnlyNoDependencies() throws Exception {
mParams = new DexoptParams.Builder("install")
.setCompilerFilter("speed-profile")
@@ -712,9 +735,14 @@ public class DexoptHelperTest {
private PackageState createPackageState(
String packageName, List<SharedLibrary> deps, boolean multiSplit) {
+ return createPackageState(packageName, 12345, deps, multiSplit);
+ }
+
+ private PackageState createPackageState(
+ String packageName, int appId, List<SharedLibrary> deps, boolean multiSplit) {
PackageState pkgState = mock(PackageState.class);
lenient().when(pkgState.getPackageName()).thenReturn(packageName);
- lenient().when(pkgState.getAppId()).thenReturn(12345);
+ lenient().when(pkgState.getAppId()).thenReturn(appId);
lenient().when(pkgState.getSharedLibraryDependencies()).thenReturn(deps);
AndroidPackage pkg = createPackage(multiSplit);
lenient().when(pkgState.getAndroidPackage()).thenReturn(pkg);