From f9f526f29678c550edc264bc508bb13d95a8373a Mon Sep 17 00:00:00 2001 From: Jackal Guo Date: Tue, 12 Jan 2021 10:11:30 +0800 Subject: [PATCH] Refactor PackageParser (4/n) Replace the usage of the constant and Package/ApkLite from PackageParser by the alternative in order to move away from PackageParser. Bug: 174723245 Test: make Test: atest -p core/java/android/content/pm \ core/java/com/android/internal/content \ services/core/java/com/android/server/pm \ services/tests/servicestests/src/com/android/server/pm Change-Id: I4e2a7666b2feede3994a6075edfe4d18e80433e9 (cherry picked from commit ce0715ba54d65d57a65a74357f1881db50f08098) --- .../util/apk/ApkSignatureVerifier.java | 7 +++-- .../internal/content/NativeLibraryHelper.java | 29 ++++++++++--------- .../internal/content/PackageHelper.java | 8 ++--- .../internal/content/om/OverlayScanner.java | 23 +++++++++------ 4 files changed, 38 insertions(+), 29 deletions(-) diff --git a/core/java/android/util/apk/ApkSignatureVerifier.java b/core/java/android/util/apk/ApkSignatureVerifier.java index 02edb7ed50a51..696271c697179 100644 --- a/core/java/android/util/apk/ApkSignatureVerifier.java +++ b/core/java/android/util/apk/ApkSignatureVerifier.java @@ -27,6 +27,7 @@ import android.content.pm.PackageParser; import android.content.pm.PackageParser.PackageParserException; import android.content.pm.PackageParser.SigningDetails.SignatureSchemeVersion; import android.content.pm.Signature; +import android.content.pm.parsing.ParsingPackageUtils; import android.os.Build; import android.os.Trace; import android.util.jar.StrictJarFile; @@ -361,7 +362,7 @@ public class ApkSignatureVerifier { // Gather certs from AndroidManifest.xml, which every APK must have, as an optimization // to not need to verify the whole APK when verifyFUll == false. final ZipEntry manifestEntry = jarFile.findEntry( - PackageParser.ANDROID_MANIFEST_FILENAME); + ParsingPackageUtils.ANDROID_MANIFEST_FILENAME); if (manifestEntry == null) { throw new PackageParserException(INSTALL_PARSE_FAILED_BAD_MANIFEST, "Package " + apkPath + " has no manifest"); @@ -370,7 +371,7 @@ public class ApkSignatureVerifier { if (ArrayUtils.isEmpty(lastCerts)) { throw new PackageParserException(INSTALL_PARSE_FAILED_NO_CERTIFICATES, "Package " + apkPath + " has no certificates at entry " - + PackageParser.ANDROID_MANIFEST_FILENAME); + + ParsingPackageUtils.ANDROID_MANIFEST_FILENAME); } lastSigs = convertToSignatures(lastCerts); @@ -383,7 +384,7 @@ public class ApkSignatureVerifier { final String entryName = entry.getName(); if (entryName.startsWith("META-INF/")) continue; - if (entryName.equals(PackageParser.ANDROID_MANIFEST_FILENAME)) continue; + if (entryName.equals(ParsingPackageUtils.ANDROID_MANIFEST_FILENAME)) continue; toVerify.add(entry); } diff --git a/core/java/com/android/internal/content/NativeLibraryHelper.java b/core/java/com/android/internal/content/NativeLibraryHelper.java index bbfd07b64ccfe..c74c39a434fa4 100644 --- a/core/java/com/android/internal/content/NativeLibraryHelper.java +++ b/core/java/com/android/internal/content/NativeLibraryHelper.java @@ -27,9 +27,10 @@ import static android.system.OsConstants.S_IXOTH; import android.content.Context; import android.content.pm.PackageManager; -import android.content.pm.PackageParser; -import android.content.pm.PackageParser.PackageLite; -import android.content.pm.PackageParser.PackageParserException; +import android.content.pm.parsing.ApkLiteParseUtils; +import android.content.pm.parsing.PackageLite; +import android.content.pm.parsing.result.ParseResult; +import android.content.pm.parsing.result.ParseTypeImpl; import android.os.Build; import android.os.IBinder; import android.os.SELinux; @@ -86,17 +87,19 @@ public class NativeLibraryHelper { final boolean debuggable; public static Handle create(File packageFile) throws IOException { - try { - final PackageLite lite = PackageParser.parsePackageLite(packageFile, 0); - return create(lite); - } catch (PackageParserException e) { - throw new IOException("Failed to parse package: " + packageFile, e); + final ParseTypeImpl input = ParseTypeImpl.forDefaultParsing(); + final ParseResult ret = ApkLiteParseUtils.parsePackageLite(input.reset(), + packageFile, /* flags */ 0); + if (ret.isError()) { + throw new IOException("Failed to parse package: " + packageFile, + ret.getException()); } + return create(ret.getResult()); } public static Handle create(PackageLite lite) throws IOException { - return create(lite.getAllCodePaths(), lite.multiArch, lite.extractNativeLibs, - lite.debuggable); + return create(lite.getAllApkPaths(), lite.isMultiArch(), lite.isExtractNativeLibs(), + lite.isDebuggable()); } public static Handle create(List codePaths, boolean multiArch, @@ -122,14 +125,14 @@ public class NativeLibraryHelper { public static Handle createFd(PackageLite lite, FileDescriptor fd) throws IOException { final long[] apkHandles = new long[1]; - final String path = lite.baseCodePath; + final String path = lite.getBaseApkPath(); apkHandles[0] = nativeOpenApkFd(fd, path); if (apkHandles[0] == 0) { throw new IOException("Unable to open APK " + path + " from fd " + fd); } - return new Handle(new String[]{path}, apkHandles, lite.multiArch, - lite.extractNativeLibs, lite.debuggable); + return new Handle(new String[]{path}, apkHandles, lite.isMultiArch(), + lite.isExtractNativeLibs(), lite.isDebuggable()); } Handle(String[] apkPaths, long[] apkHandles, boolean multiArch, diff --git a/core/java/com/android/internal/content/PackageHelper.java b/core/java/com/android/internal/content/PackageHelper.java index 2b78be383d431..c2f20526f8fd0 100644 --- a/core/java/com/android/internal/content/PackageHelper.java +++ b/core/java/com/android/internal/content/PackageHelper.java @@ -24,8 +24,8 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageInstaller.SessionParams; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; -import android.content.pm.PackageParser.PackageLite; import android.content.pm.dex.DexMetadataHelper; +import android.content.pm.parsing.PackageLite; import android.os.Environment; import android.os.IBinder; import android.os.RemoteException; @@ -84,8 +84,8 @@ public class PackageHelper { /** * A group of external dependencies used in - * {@link #resolveInstallVolume(Context, String, int, long)}. It can be backed by real values - * from the system or mocked ones for testing purposes. + * {@link #resolveInstallVolume(Context, String, int, long, TestableInterface)}. + * It can be backed by real values from the system or mocked ones for testing purposes. */ public static abstract class TestableInterface { abstract public StorageManager getStorageManager(Context context); @@ -447,7 +447,7 @@ public class PackageHelper { long sizeBytes = 0; // Include raw APKs, and possibly unpacked resources - for (String codePath : pkg.getAllCodePaths()) { + for (String codePath : pkg.getAllApkPaths()) { final File codeFile = new File(codePath); sizeBytes += codeFile.length(); } diff --git a/core/java/com/android/internal/content/om/OverlayScanner.java b/core/java/com/android/internal/content/om/OverlayScanner.java index a85cf56068cd7..6b5cb8d9b850e 100644 --- a/core/java/com/android/internal/content/om/OverlayScanner.java +++ b/core/java/com/android/internal/content/om/OverlayScanner.java @@ -20,7 +20,10 @@ import static com.android.internal.content.om.OverlayConfig.TAG; import android.annotation.NonNull; import android.annotation.Nullable; -import android.content.pm.PackageParser; +import android.content.pm.parsing.ApkLite; +import android.content.pm.parsing.ApkLiteParseUtils; +import android.content.pm.parsing.result.ParseResult; +import android.content.pm.parsing.result.ParseTypeImpl; import android.util.ArrayMap; import android.util.Log; @@ -124,15 +127,17 @@ public class OverlayScanner { /** Extracts information about the overlay from its manifest. */ @VisibleForTesting public ParsedOverlayInfo parseOverlayManifest(File overlayApk) { - try { - final PackageParser.ApkLite apkLite = PackageParser.parseApkLite(overlayApk, 0); - return apkLite.targetPackageName == null ? null : - new ParsedOverlayInfo(apkLite.packageName, apkLite.targetPackageName, - apkLite.targetSdkVersion, apkLite.overlayIsStatic, - apkLite.overlayPriority, new File(apkLite.codePath)); - } catch (PackageParser.PackageParserException e) { - Log.w(TAG, "Got exception loading overlay.", e); + final ParseTypeImpl input = ParseTypeImpl.forParsingWithoutPlatformCompat(); + final ParseResult ret = ApkLiteParseUtils.parseApkLite(input.reset(), + overlayApk, /* flags */ 0); + if (ret.isError()) { + Log.w(TAG, "Got exception loading overlay.", ret.getException()); return null; } + final ApkLite apkLite = ret.getResult(); + return apkLite.getTargetPackageName() == null ? null : + new ParsedOverlayInfo(apkLite.getPackageName(), apkLite.getTargetPackageName(), + apkLite.getTargetSdkVersion(), apkLite.isOverlayIsStatic(), + apkLite.getOverlayPriority(), new File(apkLite.getPath())); } }