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

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

Use PackageParser2 instead of the old parser to getPackageArchiveInfo

1. New utils to generate PackageInfo
2. Use PackageParser2 instead of the old parser to
PackageManager#getPackageArchiveInfo

BYPASS_INCLUSIVE_LANGUAGE_REASON=Legacy API

Bug: 309596860
Test: atest CtsPackageManagerTestCases:PackageManagerTest
Change-Id: I24279443f1d3e49b2a3814cc4c5faa526bd15eeb
parent 881ba193
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)
@@ -8609,11 +8616,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
@@ -8623,14 +8628,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;