Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 476b5433 authored by Nick Kovacs's avatar Nick Kovacs Committed by Android (Google) Code Review
Browse files

Merge "Add install flag --bypass-low-target-sdk-block"

parents 1cd58712 7c710f62
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -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,
+38 −5
Original line number Diff line number Diff line
@@ -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.
+4 −0
Original line number Diff line number Diff line
@@ -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);
            }