diff options
author | 2023-01-10 21:07:48 +0000 | |
---|---|---|
committer | 2023-01-10 21:07:48 +0000 | |
commit | 476b5433ec76348325d3f04c38e5ecc8c73b28c2 (patch) | |
tree | c8afb6cb785e62f3c0182ab699a2cfb9c9e80048 | |
parent | 1cd587124b81a9e76c7727ac2a5f96966e14c1ee (diff) | |
parent | 7c710f62228fbc829eaa097204a00bccd8aa420d (diff) |
Merge "Add install flag --bypass-low-target-sdk-block"
3 files changed, 50 insertions, 5 deletions
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 4ad657e64fb3..7cc8af7fcab0 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -1545,6 +1545,14 @@ public abstract class PackageManager { */ public static final int INSTALL_DISABLE_ALLOWED_APEX_UPDATE_CHECK = 0x00800000; + /** + * Flag parameter for {@link #installPackage} to bypass the low targer sdk version block + * for this install. + * + * @hide + */ + public static final int INSTALL_BYPASS_LOW_TARGET_SDK_BLOCK = 0x00800000; + /** @hide */ @IntDef(flag = true, value = { DONT_KILL_APP, diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index 27d312ec4d4d..803c97a47688 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -1039,15 +1039,48 @@ final class InstallPackageHelper { DeviceConfig.getInt(DeviceConfig.NAMESPACE_PACKAGE_MANAGER_SERVICE, "MinInstallableTargetSdk__min_installable_target_sdk", 0); - if (parsedPackage.getTargetSdkVersion() < minInstallableTargetSdk) { + + // Skip enforcement when the bypass flag is set + boolean bypassLowTargetSdkBlock = + ((installFlags & PackageManager.INSTALL_BYPASS_LOW_TARGET_SDK_BLOCK) != 0); + + // Skip enforcement for tests that were installed from adb + if (!bypassLowTargetSdkBlock + && ((installFlags & PackageManager.INSTALL_FROM_ADB) != 0)) { + bypassLowTargetSdkBlock = true; + } + + // Skip enforcement if the installer package name is not set + // (e.g. "pm install" from shell) + if (!bypassLowTargetSdkBlock) { + if (request.getInstallerPackageName() == null) { + bypassLowTargetSdkBlock = true; + } else { + // Also skip if the install is occurring from an app that was installed from adb + if (mContext + .getPackageManager() + .getInstallerPackageName(request.getInstallerPackageName()) == null) { + bypassLowTargetSdkBlock = true; + } + } + } + + // Skip enforcement when the testOnly flag is set + if (!bypassLowTargetSdkBlock && parsedPackage.isTestOnly()) { + bypassLowTargetSdkBlock = true; + } + + // Enforce the low target sdk install block except when + // the --bypass-low-target-sdk-block is set for the install + if (!bypassLowTargetSdkBlock + && parsedPackage.getTargetSdkVersion() < minInstallableTargetSdk) { Slog.w(TAG, "App " + parsedPackage.getPackageName() + " targets deprecated sdk version"); throw new PrepareFailure(INSTALL_FAILED_DEPRECATED_SDK_VERSION, - "App package must target at least version " - + minInstallableTargetSdk); + "App package must target at least SDK version " + + minInstallableTargetSdk + ", but found " + + parsedPackage.getTargetSdkVersion()); } - } else { - Slog.i(TAG, "Minimum installable target sdk enforcement not enabled"); } // Instant apps have several additional install-time checks. diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index 9fc6c6387223..0709502dd2b0 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -3258,6 +3258,10 @@ class PackageManagerShellCommand extends ShellCommand { case "--skip-enable": sessionParams.setKeepApplicationEnabledSetting(); break; + case "--bypass-low-target-sdk-block": + sessionParams.installFlags |= + PackageManager.INSTALL_BYPASS_LOW_TARGET_SDK_BLOCK; + break; default: throw new IllegalArgumentException("Unknown option " + opt); } |