diff options
| author | 2024-03-12 14:03:07 +0800 | |
|---|---|---|
| committer | 2024-03-12 15:54:24 +0800 | |
| commit | b87258eb691cd9709d6a9ea6f02c01223f29aa8f (patch) | |
| tree | ab432a1ceb8d96a734423bc364ff5d22aa42c59e | |
| parent | 487d8fa9252a92c21dc9cc448bdfce4dfbb29abb (diff) | |
Set callback to the PackageImpl if creates via a Parcel
PM get the allowed list of using the hidden API apps via the callback.
But the callback is not set if PackageImpl is create from a Parcel
when use PackageCacher.
Bug: 322815588
Test: atest PackageManagerServiceServerTests
Test: atest PackageManagerComponentOverrideTests
Test: atest PackageManagerServiceUnitTests
Test: atest PackageParsingPerfTest
Test: atest PackageParserTest
Change-Id: I0cf4bca72355e6713dd04a8c133daa4e2e77969d
4 files changed, 26 insertions, 5 deletions
diff --git a/core/java/com/android/internal/pm/parsing/pkg/PackageImpl.java b/core/java/com/android/internal/pm/parsing/pkg/PackageImpl.java index 5e89d06facd1..e1aff2af0965 100644 --- a/core/java/com/android/internal/pm/parsing/pkg/PackageImpl.java +++ b/core/java/com/android/internal/pm/parsing/pkg/PackageImpl.java @@ -3281,6 +3281,11 @@ public class PackageImpl implements ParsedPackage, AndroidPackageInternal, } public PackageImpl(Parcel in) { + this(in, /* callback */ null); + } + + public PackageImpl(@NonNull Parcel in, @Nullable ParsingPackageUtils.Callback callback) { + mCallback = callback; // We use the boot classloader for all classes that we load. final ClassLoader boot = Object.class.getClassLoader(); this.supportsSmallScreens = sForBoolean.unparcel(in); diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index 4bfd077760e4..89c4f0f276af 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -3598,7 +3598,8 @@ final class InstallPackageHelper { continue; } if ((scanFlags & SCAN_DROP_CACHE) != 0) { - final PackageCacher cacher = new PackageCacher(mPm.getCacheDir()); + final PackageCacher cacher = new PackageCacher(mPm.getCacheDir(), + mPm.mPackageParserCallback); Log.w(TAG, "Dropping cache of " + file.getAbsolutePath()); cacher.cleanCachedResult(file); } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 7c51707f7280..35cb5b000219 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -1739,7 +1739,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService () -> LocalServices.getService(UserManagerInternal.class)), (i, pm) -> new DisplayMetrics(), (i, pm) -> new PackageParser2(pm.mSeparateProcesses, i.getDisplayMetrics(), - new PackageCacher(pm.mCacheDir), + new PackageCacher(pm.mCacheDir, pm.mPackageParserCallback), pm.mPackageParserCallback) /* scanningCachingPackageParserProducer */, (i, pm) -> new PackageParser2(pm.mSeparateProcesses, i.getDisplayMetrics(), null, pm.mPackageParserCallback) /* scanningPackageParserProducer */, diff --git a/services/core/java/com/android/server/pm/parsing/PackageCacher.java b/services/core/java/com/android/server/pm/parsing/PackageCacher.java index b6267c499c07..2db454aa4c41 100644 --- a/services/core/java/com/android/server/pm/parsing/PackageCacher.java +++ b/services/core/java/com/android/server/pm/parsing/PackageCacher.java @@ -17,6 +17,7 @@ package com.android.server.pm.parsing; import android.annotation.NonNull; +import android.annotation.Nullable; import android.content.pm.PackageParserCacheHelper; import android.os.Environment; import android.os.FileUtils; @@ -29,8 +30,10 @@ import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.pm.parsing.IPackageCacher; +import com.android.internal.pm.parsing.PackageParser2; import com.android.internal.pm.parsing.pkg.PackageImpl; import com.android.internal.pm.parsing.pkg.ParsedPackage; +import com.android.internal.pm.pkg.parsing.ParsingPackageUtils; import com.android.server.pm.ApexManager; import libcore.io.IoUtils; @@ -51,9 +54,16 @@ public class PackageCacher implements IPackageCacher { @NonNull private final File mCacheDir; + @Nullable + private final PackageParser2.Callback mCallback; - public PackageCacher(@NonNull File cacheDir) { + public PackageCacher(File cacheDir) { + this(cacheDir, null); + } + + public PackageCacher(File cacheDir, @Nullable PackageParser2.Callback callback) { this.mCacheDir = cacheDir; + this.mCallback = callback; } /** @@ -71,12 +81,17 @@ public class PackageCacher implements IPackageCacher { @VisibleForTesting protected ParsedPackage fromCacheEntry(byte[] bytes) { - return fromCacheEntryStatic(bytes); + return fromCacheEntryStatic(bytes, mCallback); } /** static version of {@link #fromCacheEntry} for unit tests. */ @VisibleForTesting public static ParsedPackage fromCacheEntryStatic(byte[] bytes) { + return fromCacheEntryStatic(bytes, null); + } + + private static ParsedPackage fromCacheEntryStatic(byte[] bytes, + @Nullable ParsingPackageUtils.Callback callback) { final Parcel p = Parcel.obtain(); p.unmarshall(bytes, 0, bytes.length); p.setDataPosition(0); @@ -85,7 +100,7 @@ public class PackageCacher implements IPackageCacher { new PackageParserCacheHelper.ReadHelper(p); helper.startAndInstall(); - ParsedPackage pkg = new PackageImpl(p); + ParsedPackage pkg = new PackageImpl(p, callback); p.recycle(); |