diff options
| author | 2024-07-05 15:03:32 +0000 | |
|---|---|---|
| committer | 2024-07-08 07:01:39 +0000 | |
| commit | b0b9465f5e60087ac69552783ee863a17ba00515 (patch) | |
| tree | da2de3a8f423809921a93cc68a956bb2f2897d18 | |
| parent | ca92bc74a356f31ad3b5456d5c6ebe699942e9ef (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.java | 3 | ||||
| -rw-r--r-- | libartservice/service/javatests/com/android/server/art/DexoptHelperTest.java | 30 |
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); |