Loading core/java/android/content/pm/PackageManager.java +8 −0 Original line number Diff line number Diff line Loading @@ -1542,6 +1542,14 @@ public abstract class PackageManager { */ public static final int INSTALL_FAILED_PROCESS_NOT_DEFINED = -122; /** * Installation parse return code: system is in a minimal boot state, and the parser only * allows the package with {@code coreApp} manifest attribute to be a valid application. * * @hide */ public static final int INSTALL_PARSE_FAILED_ONLY_COREAPP_ALLOWED = -123; /** @hide */ @IntDef(flag = true, prefix = { "DELETE_" }, value = { DELETE_KEEP_DATA, Loading core/java/android/content/pm/parsing/ParsingPackageUtils.java +5 −2 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import static android.content.pm.PackageManager.FEATURE_WATCH; import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_BAD_MANIFEST; import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES; import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_NOT_APK; import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_ONLY_COREAPP_ALLOWED; import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION; import static android.os.Build.VERSION_CODES.DONUT; import static android.os.Build.VERSION_CODES.O; Loading Loading @@ -228,7 +229,8 @@ public class ParsingPackageUtils { final PackageParser.PackageLite lite = ApkLiteParseUtils.parseClusterPackageLite(packageDir, 0); if (mOnlyCoreApps && !lite.coreApp) { return input.error("Not a coreApp: " + packageDir); return input.error(INSTALL_PARSE_FAILED_ONLY_COREAPP_ALLOWED, "Not a coreApp: " + packageDir); } // Build the split dependency tree. Loading Loading @@ -290,7 +292,8 @@ public class ParsingPackageUtils { final PackageParser.PackageLite lite = ApkLiteParseUtils.parseMonolithicPackageLite(apkFile, flags); if (mOnlyCoreApps && !lite.coreApp) { return input.error("Not a coreApp: " + apkFile); return input.error(INSTALL_PARSE_FAILED_ONLY_COREAPP_ALLOWED, "Not a coreApp: " + apkFile); } final SplitAssetLoader assetLoader = new DefaultSplitAssetLoader(lite, flags); Loading services/core/java/com/android/server/pm/ApexManager.java +10 −3 Original line number Diff line number Diff line Loading @@ -30,7 +30,7 @@ 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.os.Binder; import android.os.Environment; Loading Loading @@ -137,7 +137,8 @@ public abstract class ApexManager { /** * Called by package manager service to scan apex package files when device boots up. * * @param packageParser The package parser which supports caches. * @param packageParser The package parser to support apex package parsing and caching parsed * results. * @param executorService An executor to support parallel package parsing. */ abstract void scanApexPackagesTraced(@NonNull PackageParser2 packageParser, Loading Loading @@ -505,7 +506,13 @@ public abstract class ApexManager { } factoryPackagesSet.add(packageInfo.packageName); } } else if (throwable instanceof PackageParser.PackageParserException) { } else if (throwable instanceof PackageParserException) { final PackageParserException e = (PackageParserException) throwable; // Skip parsing non-coreApp apex file if system is in minimal boot state. if (e.error == PackageManager.INSTALL_PARSE_FAILED_ONLY_COREAPP_ALLOWED) { Slog.w(TAG, "Scan apex failed, not a coreApp:" + ai.modulePath); continue; } throw new IllegalStateException("Unable to parse: " + ai.modulePath, throwable); } else { throw new IllegalStateException("Unexpected exception occurred while parsing " Loading services/core/java/com/android/server/pm/PackageInstallerService.java +5 −2 Original line number Diff line number Diff line Loading @@ -82,6 +82,7 @@ import com.android.internal.util.ImageUtils; import com.android.internal.util.IndentingPrintWriter; import com.android.server.IoThread; import com.android.server.LocalServices; import com.android.server.pm.parsing.PackageParser2; import com.android.server.pm.permission.PermissionManagerServiceInternal; import libcore.io.IoUtils; Loading @@ -105,6 +106,7 @@ import java.util.List; import java.util.Objects; import java.util.Random; import java.util.function.IntPredicate; import java.util.function.Supplier; /** The service responsible for installing packages. */ public class PackageInstallerService extends IPackageInstaller.Stub implements Loading Loading @@ -194,7 +196,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements } }; public PackageInstallerService(Context context, PackageManagerService pm) { public PackageInstallerService(Context context, PackageManagerService pm, Supplier<PackageParser2> apexParserSupplier) { mContext = context; mPm = pm; mPermissionManager = LocalServices.getService(PermissionManagerServiceInternal.class); Loading @@ -213,7 +216,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements mSessionsDir.mkdirs(); mApexManager = ApexManager.getInstance(); mStagingManager = new StagingManager(this, context); mStagingManager = new StagingManager(this, context, apexParserSupplier); } boolean okToSendBroadcasts() { Loading services/core/java/com/android/server/pm/PackageManagerService.java +6 −1 Original line number Diff line number Diff line Loading @@ -417,6 +417,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.function.Supplier; /** * Keep track of all those APKs everywhere. Loading Loading @@ -3577,7 +3578,11 @@ public class PackageManagerService extends IPackageManager.Stub } } mInstallerService = new PackageInstallerService(mContext, this); // Prepare a supplier of package parser for the staging manager to parse apex file // during the staging installation. final Supplier<PackageParser2> apexParserSupplier = () -> new PackageParser2( mSeparateProcesses, mOnlyCore, mMetrics, mCacheDir, mPackageParserCallback); mInstallerService = new PackageInstallerService(mContext, this, apexParserSupplier); final Pair<ComponentName, String> instantAppResolverComponent = getInstantAppResolverLPr(); if (instantAppResolverComponent != null) { Loading
core/java/android/content/pm/PackageManager.java +8 −0 Original line number Diff line number Diff line Loading @@ -1542,6 +1542,14 @@ public abstract class PackageManager { */ public static final int INSTALL_FAILED_PROCESS_NOT_DEFINED = -122; /** * Installation parse return code: system is in a minimal boot state, and the parser only * allows the package with {@code coreApp} manifest attribute to be a valid application. * * @hide */ public static final int INSTALL_PARSE_FAILED_ONLY_COREAPP_ALLOWED = -123; /** @hide */ @IntDef(flag = true, prefix = { "DELETE_" }, value = { DELETE_KEEP_DATA, Loading
core/java/android/content/pm/parsing/ParsingPackageUtils.java +5 −2 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import static android.content.pm.PackageManager.FEATURE_WATCH; import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_BAD_MANIFEST; import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES; import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_NOT_APK; import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_ONLY_COREAPP_ALLOWED; import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION; import static android.os.Build.VERSION_CODES.DONUT; import static android.os.Build.VERSION_CODES.O; Loading Loading @@ -228,7 +229,8 @@ public class ParsingPackageUtils { final PackageParser.PackageLite lite = ApkLiteParseUtils.parseClusterPackageLite(packageDir, 0); if (mOnlyCoreApps && !lite.coreApp) { return input.error("Not a coreApp: " + packageDir); return input.error(INSTALL_PARSE_FAILED_ONLY_COREAPP_ALLOWED, "Not a coreApp: " + packageDir); } // Build the split dependency tree. Loading Loading @@ -290,7 +292,8 @@ public class ParsingPackageUtils { final PackageParser.PackageLite lite = ApkLiteParseUtils.parseMonolithicPackageLite(apkFile, flags); if (mOnlyCoreApps && !lite.coreApp) { return input.error("Not a coreApp: " + apkFile); return input.error(INSTALL_PARSE_FAILED_ONLY_COREAPP_ALLOWED, "Not a coreApp: " + apkFile); } final SplitAssetLoader assetLoader = new DefaultSplitAssetLoader(lite, flags); Loading
services/core/java/com/android/server/pm/ApexManager.java +10 −3 Original line number Diff line number Diff line Loading @@ -30,7 +30,7 @@ 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.os.Binder; import android.os.Environment; Loading Loading @@ -137,7 +137,8 @@ public abstract class ApexManager { /** * Called by package manager service to scan apex package files when device boots up. * * @param packageParser The package parser which supports caches. * @param packageParser The package parser to support apex package parsing and caching parsed * results. * @param executorService An executor to support parallel package parsing. */ abstract void scanApexPackagesTraced(@NonNull PackageParser2 packageParser, Loading Loading @@ -505,7 +506,13 @@ public abstract class ApexManager { } factoryPackagesSet.add(packageInfo.packageName); } } else if (throwable instanceof PackageParser.PackageParserException) { } else if (throwable instanceof PackageParserException) { final PackageParserException e = (PackageParserException) throwable; // Skip parsing non-coreApp apex file if system is in minimal boot state. if (e.error == PackageManager.INSTALL_PARSE_FAILED_ONLY_COREAPP_ALLOWED) { Slog.w(TAG, "Scan apex failed, not a coreApp:" + ai.modulePath); continue; } throw new IllegalStateException("Unable to parse: " + ai.modulePath, throwable); } else { throw new IllegalStateException("Unexpected exception occurred while parsing " Loading
services/core/java/com/android/server/pm/PackageInstallerService.java +5 −2 Original line number Diff line number Diff line Loading @@ -82,6 +82,7 @@ import com.android.internal.util.ImageUtils; import com.android.internal.util.IndentingPrintWriter; import com.android.server.IoThread; import com.android.server.LocalServices; import com.android.server.pm.parsing.PackageParser2; import com.android.server.pm.permission.PermissionManagerServiceInternal; import libcore.io.IoUtils; Loading @@ -105,6 +106,7 @@ import java.util.List; import java.util.Objects; import java.util.Random; import java.util.function.IntPredicate; import java.util.function.Supplier; /** The service responsible for installing packages. */ public class PackageInstallerService extends IPackageInstaller.Stub implements Loading Loading @@ -194,7 +196,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements } }; public PackageInstallerService(Context context, PackageManagerService pm) { public PackageInstallerService(Context context, PackageManagerService pm, Supplier<PackageParser2> apexParserSupplier) { mContext = context; mPm = pm; mPermissionManager = LocalServices.getService(PermissionManagerServiceInternal.class); Loading @@ -213,7 +216,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements mSessionsDir.mkdirs(); mApexManager = ApexManager.getInstance(); mStagingManager = new StagingManager(this, context); mStagingManager = new StagingManager(this, context, apexParserSupplier); } boolean okToSendBroadcasts() { Loading
services/core/java/com/android/server/pm/PackageManagerService.java +6 −1 Original line number Diff line number Diff line Loading @@ -417,6 +417,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.function.Supplier; /** * Keep track of all those APKs everywhere. Loading Loading @@ -3577,7 +3578,11 @@ public class PackageManagerService extends IPackageManager.Stub } } mInstallerService = new PackageInstallerService(mContext, this); // Prepare a supplier of package parser for the staging manager to parse apex file // during the staging installation. final Supplier<PackageParser2> apexParserSupplier = () -> new PackageParser2( mSeparateProcesses, mOnlyCore, mMetrics, mCacheDir, mPackageParserCallback); mInstallerService = new PackageInstallerService(mContext, this, apexParserSupplier); final Pair<ComponentName, String> instantAppResolverComponent = getInstantAppResolverLPr(); if (instantAppResolverComponent != null) {