Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b87258eb authored by TYM Tsai's avatar TYM Tsai
Browse files

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
parent 487d8fa9
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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);
+2 −1
Original line number Diff line number Diff line
@@ -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);
            }
+1 −1
Original line number Diff line number Diff line
@@ -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 */,
+18 −3
Original line number Diff line number Diff line
@@ -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();