diff options
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 186cf5e37003..ef9acc4b41ae 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 fe8030b656b0..c814a1ef1c13 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -1741,7 +1741,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(); |