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

Commit a2962fa9 authored by Nikita Ioffe's avatar Nikita Ioffe
Browse files

PackageParser2: collect certificates if requested

This is a relatively easy and safe change that should significantly
reduce boot time.

Test: atest google/perf/boottime/boottime-test
Test: atest PackageManagerTest
Bug: 155535721
Bug: 155513789
Bug: 155525390
Change-Id: Ib5152892184d407361ce3698575075ec0138edbf
parent 0b17a067
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -396,8 +396,13 @@ public class ParsingPackageUtils {
                }
            }

            pkg.setVolumeUuid(volumeUuid)
                    .setSigningDetails(SigningDetails.UNKNOWN);
            pkg.setVolumeUuid(volumeUuid);

            if ((flags & PackageParser.PARSE_COLLECT_CERTIFICATES) != 0) {
                pkg.setSigningDetails(getSigningDetails(pkg, false));
            } else {
                pkg.setSigningDetails(SigningDetails.UNKNOWN);
            }

            return input.success(pkg);
        } catch (Exception e) {
@@ -449,7 +454,7 @@ public class ParsingPackageUtils {
     */
    private ParseResult<ParsingPackage> parseBaseApk(ParseInput input, String apkPath,
            String codePath, Resources res, XmlResourceParser parser, int flags)
            throws XmlPullParserException, IOException {
            throws XmlPullParserException, IOException, PackageParserException {
        final String splitName;
        final String pkgName;

+3 −14
Original line number Diff line number Diff line
@@ -30,9 +30,9 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageInstaller;
import android.content.pm.PackageManager;
import android.content.pm.PackageParser;
import android.content.pm.PackageParser.PackageParserException;
import android.content.pm.parsing.PackageInfoWithoutStateUtils;
import android.content.pm.parsing.ParsingPackageUtils;
import android.os.Binder;
import android.os.Environment;
import android.os.RemoteException;
@@ -50,7 +50,6 @@ import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.Preconditions;
import com.android.server.pm.parsing.PackageParser2;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.pm.parsing.pkg.ParsedPackage;
import com.android.server.utils.TimingsTraceAndSlog;

import com.google.android.collect.Lists;
@@ -491,7 +490,7 @@ public abstract class ApexManager {

            for (ApexInfo ai : allPkgs) {
                File apexFile = new File(ai.modulePath);
                parallelPackageParser.submit(apexFile, 0);
                parallelPackageParser.submit(apexFile, PackageParser.PARSE_COLLECT_CERTIFICATES);
                parsingApexInfo.put(apexFile, ai);
            }

@@ -504,18 +503,8 @@ public abstract class ApexManager {
                ApexInfo ai = parsingApexInfo.get(parseResult.scanFile);

                if (throwable == null) {
                    // Unfortunately, ParallelPackageParser won't collect certificates for us. We
                    // need to manually collect them here.
                    ParsedPackage pp = parseResult.parsedPackage;
                    try {
                        pp.setSigningDetails(
                                ParsingPackageUtils.getSigningDetails(pp, false));
                    } catch (PackageParserException e) {
                        throw new IllegalStateException(
                                "Unable to collect certificates for " + ai.modulePath, e);
                    }
                    final PackageInfo packageInfo = PackageInfoWithoutStateUtils.generate(
                            pp, ai, flags);
                            parseResult.parsedPackage, ai, flags);
                    if (packageInfo == null) {
                        throw new IllegalStateException("Unable to generate package info: "
                                + ai.modulePath);