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

Commit 599b3752 authored by TYM Tsai's avatar TYM Tsai Committed by Android (Google) Code Review
Browse files

Merge "Use PackageParser2 instead of the old parser to getPackageArchiveInfo" into main

parents 535e7b75 a65b3478
Loading
Loading
Loading
Loading
+55 −20
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package android.content.pm;

import static com.android.internal.pm.pkg.parsing.ParsingPackageUtils.PARSE_COLLECT_CERTIFICATES;

import android.Manifest;
import android.annotation.CallbackExecutor;
import android.annotation.CheckResult;
@@ -55,7 +57,6 @@ import android.content.IntentFilter;
import android.content.IntentSender;
import android.content.pm.PackageInstaller.SessionParams;
import android.content.pm.dex.ArtManager;
import android.content.pm.pkg.FrameworkPackageUserState;
import android.content.pm.verify.domain.DomainVerificationManager;
import android.content.res.Configuration;
import android.content.res.Resources;
@@ -91,6 +92,10 @@ import android.util.AndroidException;
import android.util.Log;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.pm.parsing.PackageInfoCommonUtils;
import com.android.internal.pm.parsing.PackageParser2;
import com.android.internal.pm.parsing.PackageParserException;
import com.android.internal.pm.parsing.pkg.ParsedPackage;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.DataClass;

@@ -817,6 +822,8 @@ public abstract class PackageManager {
            GET_DISABLED_UNTIL_USED_COMPONENTS,
            GET_UNINSTALLED_PACKAGES,
            MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS,
            MATCH_DIRECT_BOOT_AWARE,
            MATCH_DIRECT_BOOT_UNAWARE,
            GET_ATTRIBUTIONS_LONG,
    })
    @Retention(RetentionPolicy.SOURCE)
@@ -8628,11 +8635,9 @@ public abstract class PackageManager {
    @Nullable
    public PackageInfo getPackageArchiveInfo(@NonNull String archiveFilePath,
            @NonNull PackageInfoFlags flags) {
        long flagsBits = flags.getValue();
        final PackageParser parser = new PackageParser();
        parser.setCallback(new PackageParser.CallbackImpl(this));
        final File apkFile = new File(archiveFilePath);
        try {

        @PackageInfoFlagsBits long flagsBits = flags.getValue();
        if ((flagsBits & (MATCH_DIRECT_BOOT_UNAWARE | MATCH_DIRECT_BOOT_AWARE)) != 0) {
            // Caller expressed an explicit opinion about what encryption
            // aware/unaware components they want to see, so fall through and
@@ -8642,14 +8647,44 @@ public abstract class PackageManager {
            flagsBits |= MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE;
        }

            PackageParser.Package pkg = parser.parsePackage(apkFile, 0, false);
            if ((flagsBits & GET_SIGNATURES) != 0 || (flagsBits & GET_SIGNING_CERTIFICATES) != 0) {
                PackageParser.collectCertificates(pkg, false /* skipVerify */);
        int parserFlags = 0;
        if ((flagsBits & (GET_SIGNATURES | GET_SIGNING_CERTIFICATES)) != 0) {
            parserFlags |= PARSE_COLLECT_CERTIFICATES;
        }

        final PackageParser2 parser2 = new PackageParser2(/*separateProcesses*/ null,
                /*displayMetrics*/ null,/*cacher*/ null,
                new PackageParser2.Callback() {
                    @Override
                    public boolean hasFeature(String feature) {
                        return PackageManager.this.hasSystemFeature(feature);
                    }

                    @NonNull
                    @Override
                    public Set<String> getHiddenApiWhitelistedApps() {
                        return Collections.emptySet();
                    }
            return PackageParser.generatePackageInfo(pkg, null, (int) flagsBits, 0, 0, null,
                    FrameworkPackageUserState.DEFAULT);
        } catch (PackageParser.PackageParserException e) {
            Log.w(TAG, "Failure to parse package archive", e);

                    @NonNull
                    @Override
                    public Set<String> getInstallConstraintsAllowlist() {
                        return Collections.emptySet();
                    }

                    @Override
                    public boolean isChangeEnabled(long changeId,
                            @androidx.annotation.NonNull ApplicationInfo appInfo) {
                        return false;
                    }
                });

        try {
            ParsedPackage pp = parser2.parsePackage(apkFile, parserFlags, false);

            return PackageInfoCommonUtils.generate(pp, flagsBits, UserHandle.myUserId());
        } catch (PackageParserException e) {
            Log.w(TAG, "Failure to parse package archive apkFile= " +apkFile);
            return null;
        }
    }
+652 −0

File added.

Preview size limit exceeded, changes collapsed.

+15 −4
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.annotation.AnyThread;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityThread;
import android.app.Application;
import android.content.pm.ApplicationInfo;
import android.content.pm.parsing.PackageLite;
import android.content.pm.parsing.result.ParseInput;
@@ -40,6 +41,7 @@ import com.android.internal.pm.pkg.parsing.ParsingUtils;
import com.android.internal.util.ArrayUtils;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
@@ -78,10 +80,19 @@ public class PackageParser2 implements AutoCloseable {
            displayMetrics.setToDefaults();
        }

        PermissionManager permissionManager = ActivityThread.currentApplication()
                .getSystemService(PermissionManager.class);
        List<PermissionManager.SplitPermissionInfo> splitPermissions = permissionManager
                .getSplitPermissions();
        List<PermissionManager.SplitPermissionInfo> splitPermissions = null;

        final Application application = ActivityThread.currentApplication();
        if (application != null) {
            final PermissionManager permissionManager =
                    application.getSystemService(PermissionManager.class);
            if (permissionManager != null) {
                splitPermissions = permissionManager.getSplitPermissions();
            }
        }
        if (splitPermissions == null) {
            splitPermissions = new ArrayList<>();
        }

        mCacher = cacher;