Loading cmds/pm/src/com/android/commands/pm/Pm.java +3 −0 Original line number Diff line number Diff line Loading @@ -502,6 +502,9 @@ public final class Pm { sessionParams.volumeUuid = null; } break; case "--force-sdk": sessionParams.installFlags |= PackageManager.INSTALL_FORCE_SDK; break; default: throw new IllegalArgumentException("Unknown option " + opt); } Loading core/java/android/content/pm/PackageManager.java +8 −0 Original line number Diff line number Diff line Loading @@ -683,6 +683,14 @@ public abstract class PackageManager { */ public static final int INSTALL_DONT_KILL_APP = 0x00001000; /** * Flag parameter for {@link #installPackage} to indicate that this package is an * upgrade to a package that refers to the SDK via release letter. * * @hide */ public static final int INSTALL_FORCE_SDK = 0x00002000; /** * Flag parameter for * {@link #setComponentEnabledSetting(android.content.ComponentName, int, int)} to indicate Loading core/java/android/content/pm/PackageParser.java +1 −0 Original line number Diff line number Diff line Loading @@ -652,6 +652,7 @@ public class PackageParser { public final static int PARSE_TRUSTED_OVERLAY = 1<<9; public final static int PARSE_ENFORCE_CODE = 1<<10; public final static int PARSE_IS_EPHEMERAL = 1<<11; public final static int PARSE_FORCE_SDK = 1<<12; private static final Comparator<String> sSplitNameComparator = new SplitNameComparator(); Loading services/core/java/com/android/server/pm/PackageManagerService.java +21 −3 Original line number Diff line number Diff line Loading @@ -13796,9 +13796,24 @@ public class PackageManagerService extends IPackageManager.Stub { final int[] allUsers; final int[] installedUsers; // First find the old package info and check signatures synchronized(mPackages) { oldPackage = mPackages.get(pkgName); if (DEBUG_INSTALL) Slog.d(TAG, "replacePackageLI: new=" + pkg + ", old=" + oldPackage); // don't allow upgrade to target a release SDK from a pre-release SDK final boolean oldTargetsPreRelease = oldPackage.applicationInfo.targetSdkVersion == android.os.Build.VERSION_CODES.CUR_DEVELOPMENT; final boolean newTargetsPreRelease = pkg.applicationInfo.targetSdkVersion == android.os.Build.VERSION_CODES.CUR_DEVELOPMENT; if (oldTargetsPreRelease && !newTargetsPreRelease && ((policyFlags & PackageParser.PARSE_FORCE_SDK) == 0)) { Slog.w(TAG, "Can't install package targeting released sdk"); res.setReturnCode(PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE); return; } // don't allow an upgrade from full to ephemeral final boolean oldIsEphemeral = oldPackage.applicationInfo.isEphemeralApp(); if (isEphemeral && !oldIsEphemeral) { // can't downgrade from full to ephemeral Loading @@ -13806,7 +13821,8 @@ public class PackageManagerService extends IPackageManager.Stub { res.setReturnCode(PackageManager.INSTALL_FAILED_EPHEMERAL_INVALID); return; } if (DEBUG_INSTALL) Slog.d(TAG, "replacePackageLI: new=" + pkg + ", old=" + oldPackage); // verify signatures are valid final PackageSetting ps = mSettings.mPackages.get(pkgName); if (shouldCheckUpgradeKeySetLP(ps, scanFlags)) { if (!checkUpgradeKeySetLP(ps, pkg)) { Loading Loading @@ -14414,6 +14430,7 @@ public class PackageManagerService extends IPackageManager.Stub { final boolean onExternal = (((installFlags & PackageManager.INSTALL_EXTERNAL) != 0) || (args.volumeUuid != null)); final boolean ephemeral = ((installFlags & PackageManager.INSTALL_EPHEMERAL) != 0); final boolean forceSdk = ((installFlags & PackageManager.INSTALL_FORCE_SDK) != 0); boolean replace = false; int scanFlags = SCAN_NEW_INSTALL | SCAN_UPDATE_SIGNATURE; if (args.move != null) { Loading Loading @@ -14442,7 +14459,8 @@ public class PackageManagerService extends IPackageManager.Stub { | PackageParser.PARSE_ENFORCE_CODE | (forwardLocked ? PackageParser.PARSE_FORWARD_LOCK : 0) | (onExternal ? PackageParser.PARSE_EXTERNAL_STORAGE : 0) | (ephemeral ? PackageParser.PARSE_IS_EPHEMERAL : 0); | (ephemeral ? PackageParser.PARSE_IS_EPHEMERAL : 0) | (forceSdk ? PackageParser.PARSE_FORCE_SDK : 0); PackageParser pp = new PackageParser(); pp.setSeparateProcesses(mSeparateProcesses); pp.setDisplayMetrics(mMetrics); services/core/java/com/android/server/pm/PackageManagerShellCommand.java +6 −0 Original line number Diff line number Diff line Loading @@ -1000,6 +1000,9 @@ class PackageManagerShellCommand extends ShellCommand { case "-g": sessionParams.installFlags |= PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS; break; case "--dont-kill": sessionParams.installFlags |= PackageManager.INSTALL_DONT_KILL_APP; break; case "--originating-uri": sessionParams.originatingUri = Uri.parse(getNextArg()); break; Loading Loading @@ -1035,6 +1038,9 @@ class PackageManagerShellCommand extends ShellCommand { sessionParams.volumeUuid = null; } break; case "--force-sdk": sessionParams.installFlags |= PackageManager.INSTALL_FORCE_SDK; break; default: throw new IllegalArgumentException("Unknown option " + opt); } Loading Loading
cmds/pm/src/com/android/commands/pm/Pm.java +3 −0 Original line number Diff line number Diff line Loading @@ -502,6 +502,9 @@ public final class Pm { sessionParams.volumeUuid = null; } break; case "--force-sdk": sessionParams.installFlags |= PackageManager.INSTALL_FORCE_SDK; break; default: throw new IllegalArgumentException("Unknown option " + opt); } Loading
core/java/android/content/pm/PackageManager.java +8 −0 Original line number Diff line number Diff line Loading @@ -683,6 +683,14 @@ public abstract class PackageManager { */ public static final int INSTALL_DONT_KILL_APP = 0x00001000; /** * Flag parameter for {@link #installPackage} to indicate that this package is an * upgrade to a package that refers to the SDK via release letter. * * @hide */ public static final int INSTALL_FORCE_SDK = 0x00002000; /** * Flag parameter for * {@link #setComponentEnabledSetting(android.content.ComponentName, int, int)} to indicate Loading
core/java/android/content/pm/PackageParser.java +1 −0 Original line number Diff line number Diff line Loading @@ -652,6 +652,7 @@ public class PackageParser { public final static int PARSE_TRUSTED_OVERLAY = 1<<9; public final static int PARSE_ENFORCE_CODE = 1<<10; public final static int PARSE_IS_EPHEMERAL = 1<<11; public final static int PARSE_FORCE_SDK = 1<<12; private static final Comparator<String> sSplitNameComparator = new SplitNameComparator(); Loading
services/core/java/com/android/server/pm/PackageManagerService.java +21 −3 Original line number Diff line number Diff line Loading @@ -13796,9 +13796,24 @@ public class PackageManagerService extends IPackageManager.Stub { final int[] allUsers; final int[] installedUsers; // First find the old package info and check signatures synchronized(mPackages) { oldPackage = mPackages.get(pkgName); if (DEBUG_INSTALL) Slog.d(TAG, "replacePackageLI: new=" + pkg + ", old=" + oldPackage); // don't allow upgrade to target a release SDK from a pre-release SDK final boolean oldTargetsPreRelease = oldPackage.applicationInfo.targetSdkVersion == android.os.Build.VERSION_CODES.CUR_DEVELOPMENT; final boolean newTargetsPreRelease = pkg.applicationInfo.targetSdkVersion == android.os.Build.VERSION_CODES.CUR_DEVELOPMENT; if (oldTargetsPreRelease && !newTargetsPreRelease && ((policyFlags & PackageParser.PARSE_FORCE_SDK) == 0)) { Slog.w(TAG, "Can't install package targeting released sdk"); res.setReturnCode(PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE); return; } // don't allow an upgrade from full to ephemeral final boolean oldIsEphemeral = oldPackage.applicationInfo.isEphemeralApp(); if (isEphemeral && !oldIsEphemeral) { // can't downgrade from full to ephemeral Loading @@ -13806,7 +13821,8 @@ public class PackageManagerService extends IPackageManager.Stub { res.setReturnCode(PackageManager.INSTALL_FAILED_EPHEMERAL_INVALID); return; } if (DEBUG_INSTALL) Slog.d(TAG, "replacePackageLI: new=" + pkg + ", old=" + oldPackage); // verify signatures are valid final PackageSetting ps = mSettings.mPackages.get(pkgName); if (shouldCheckUpgradeKeySetLP(ps, scanFlags)) { if (!checkUpgradeKeySetLP(ps, pkg)) { Loading Loading @@ -14414,6 +14430,7 @@ public class PackageManagerService extends IPackageManager.Stub { final boolean onExternal = (((installFlags & PackageManager.INSTALL_EXTERNAL) != 0) || (args.volumeUuid != null)); final boolean ephemeral = ((installFlags & PackageManager.INSTALL_EPHEMERAL) != 0); final boolean forceSdk = ((installFlags & PackageManager.INSTALL_FORCE_SDK) != 0); boolean replace = false; int scanFlags = SCAN_NEW_INSTALL | SCAN_UPDATE_SIGNATURE; if (args.move != null) { Loading Loading @@ -14442,7 +14459,8 @@ public class PackageManagerService extends IPackageManager.Stub { | PackageParser.PARSE_ENFORCE_CODE | (forwardLocked ? PackageParser.PARSE_FORWARD_LOCK : 0) | (onExternal ? PackageParser.PARSE_EXTERNAL_STORAGE : 0) | (ephemeral ? PackageParser.PARSE_IS_EPHEMERAL : 0); | (ephemeral ? PackageParser.PARSE_IS_EPHEMERAL : 0) | (forceSdk ? PackageParser.PARSE_FORCE_SDK : 0); PackageParser pp = new PackageParser(); pp.setSeparateProcesses(mSeparateProcesses); pp.setDisplayMetrics(mMetrics);
services/core/java/com/android/server/pm/PackageManagerShellCommand.java +6 −0 Original line number Diff line number Diff line Loading @@ -1000,6 +1000,9 @@ class PackageManagerShellCommand extends ShellCommand { case "-g": sessionParams.installFlags |= PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS; break; case "--dont-kill": sessionParams.installFlags |= PackageManager.INSTALL_DONT_KILL_APP; break; case "--originating-uri": sessionParams.originatingUri = Uri.parse(getNextArg()); break; Loading Loading @@ -1035,6 +1038,9 @@ class PackageManagerShellCommand extends ShellCommand { sessionParams.volumeUuid = null; } break; case "--force-sdk": sessionParams.installFlags |= PackageManager.INSTALL_FORCE_SDK; break; default: throw new IllegalArgumentException("Unknown option " + opt); } Loading