From a2962fa93f808f8d21b0188b1632ce5324851e53 Mon Sep 17 00:00:00 2001 From: Nikita Ioffe Date: Wed, 6 May 2020 23:20:44 +0100 Subject: [PATCH] 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 --- .../content/pm/parsing/ParsingPackageUtils.java | 11 ++++++++--- .../java/com/android/server/pm/ApexManager.java | 17 +++-------------- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/core/java/android/content/pm/parsing/ParsingPackageUtils.java b/core/java/android/content/pm/parsing/ParsingPackageUtils.java index 9372c957af347..cb2943122781c 100644 --- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java +++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java @@ -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 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; diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java index 92c145275ac85..aafd261f7d9f9 100644 --- a/services/core/java/com/android/server/pm/ApexManager.java +++ b/services/core/java/com/android/server/pm/ApexManager.java @@ -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);