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

Commit bc42a58f authored by Alex Buynytskyy's avatar Alex Buynytskyy Committed by Gerrit Code Review
Browse files

Merge "Allow apps with pre-release SDK in REL configuration." into main

parents da656f1b ee6a0528
Loading
Loading
Loading
Loading
+28 −4
Original line number Diff line number Diff line
@@ -1949,6 +1949,8 @@ public class PackageParser {
        int type;
        boolean foundApp = false;

        String pkgName = (pkg != null) ? pkg.packageName : "<unknown>";

        TypedArray sa = res.obtainAttributes(parser,
                com.android.internal.R.styleable.AndroidManifest);

@@ -2218,14 +2220,14 @@ public class PackageParser {
                    sa.recycle();

                    final int minSdkVersion = PackageParser.computeMinSdkVersion(minVers, minCode,
                            SDK_VERSION, SDK_CODENAMES, outError);
                            SDK_VERSION, SDK_CODENAMES, outError, pkgName);
                    if (minSdkVersion < 0) {
                        mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
                        return null;
                    }

                    final int targetSdkVersion = PackageParser.computeTargetSdkVersion(targetVers,
                            targetCode, SDK_CODENAMES, outError);
                            targetCode, SDK_CODENAMES, outError, pkgName);
                    if (targetSdkVersion < 0) {
                        mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
                        return null;
@@ -2610,13 +2612,15 @@ public class PackageParser {
     * @param platformSdkCodenames array of allowed pre-release SDK codenames
     *                             for this platform
     * @param outError output array to populate with error, if applicable
     * @param pkgName for debug logging
     * @return the targetSdkVersion to use at runtime, or -1 if the package is
     *         not compatible with this platform
     * @hide Exposed for unit testing only.
     */
    public static int computeTargetSdkVersion(@IntRange(from = 0) int targetVers,
            @Nullable String targetCode, @NonNull String[] platformSdkCodenames,
            @NonNull String[] outError) {
            @NonNull String[] outError,
            String pkgName) {
        // If it's a release SDK, return the version number unmodified.
        if (targetCode == null) {
            return targetVers;
@@ -2628,6 +2632,15 @@ public class PackageParser {
            return Build.VERSION_CODES.CUR_DEVELOPMENT;
        }

        // TODO(b/294161396): add a check for a "true REL" flag.
        if (platformSdkCodenames.length == 0
                && Build.VERSION.KNOWN_CODENAMES.stream().max(String::compareTo).orElse("").equals(
                targetCode)) {
            Slog.w(TAG, "Package " + pkgName + " requires development platform " + targetCode
                    + ", returning current version " + Build.VERSION.SDK_INT);
            return Build.VERSION.SDK_INT;
        }

        // Otherwise, we're looking at an incompatible pre-release SDK.
        if (platformSdkCodenames.length > 0) {
            outError[0] = "Requires development platform " + targetCode
@@ -2674,13 +2687,15 @@ public class PackageParser {
     * @param platformSdkCodenames array of allowed prerelease SDK codenames
     *                             for this platform
     * @param outError output array to populate with error, if applicable
     * @param pkgName for debug logging
     * @return the minSdkVersion to use at runtime, or -1 if the package is not
     *         compatible with this platform
     * @hide Exposed for unit testing only.
     */
    public static int computeMinSdkVersion(@IntRange(from = 1) int minVers,
            @Nullable String minCode, @IntRange(from = 1) int platformSdkVersion,
            @NonNull String[] platformSdkCodenames, @NonNull String[] outError) {
            @NonNull String[] platformSdkCodenames, @NonNull String[] outError,
            String pkgName) {
        // If it's a release SDK, make sure we meet the minimum SDK requirement.
        if (minCode == null) {
            if (minVers <= platformSdkVersion) {
@@ -2699,6 +2714,15 @@ public class PackageParser {
            return Build.VERSION_CODES.CUR_DEVELOPMENT;
        }

        // TODO(b/294161396): add a check for a "true REL" flag.
        if (platformSdkCodenames.length == 0
                && Build.VERSION.KNOWN_CODENAMES.stream().max(String::compareTo).orElse("").equals(
                minCode)) {
            Slog.w(TAG, "Package " + pkgName + " requires min development platform " + minCode
                    + ", returning current version " + Build.VERSION.SDK_INT);
            return Build.VERSION.SDK_INT;
        }

        // Otherwise, we're looking at an incompatible pre-release SDK.
        if (platformSdkCodenames.length > 0) {
            outError[0] = "Requires development platform " + minCode
+2 −2
Original line number Diff line number Diff line
@@ -577,14 +577,14 @@ public class ApkLiteParseUtils {

                ParseResult<Integer> targetResult = FrameworkParsingPackageUtils.computeTargetSdkVersion(
                        targetVer, targetCode, SDK_CODENAMES, input,
                        allowUnknownCodenames);
                        allowUnknownCodenames, codePath);
                if (targetResult.isError()) {
                    return input.error(targetResult);
                }
                targetSdkVersion = targetResult.getResult();

                ParseResult<Integer> minResult = FrameworkParsingPackageUtils.computeMinSdkVersion(
                        minVer, minCode, SDK_VERSION, SDK_CODENAMES, input);
                        minVer, minCode, SDK_VERSION, SDK_CODENAMES, input, codePath);
                if (minResult.isError()) {
                    return input.error(minResult);
                }
+31 −10
Original line number Diff line number Diff line
@@ -293,11 +293,14 @@ public class FrameworkParsingPackageUtils {
     *                             {@code null} otherwise
     * @param platformSdkVersion   platform SDK version number, typically Build.VERSION.SDK_INT
     * @param platformSdkCodenames array of allowed prerelease SDK codenames for this platform
     * @param input                parsing context
     * @param pkgName              for debug logging
     * @return the minSdkVersion to use at runtime if successful
     */
    public static ParseResult<Integer> computeMinSdkVersion(@IntRange(from = 1) int minVers,
            @Nullable String minCode, @IntRange(from = 1) int platformSdkVersion,
            @NonNull String[] platformSdkCodenames, @NonNull ParseInput input) {
            @NonNull String[] platformSdkCodenames, @NonNull ParseInput input,
            String pkgName) {
        // If it's a release SDK, make sure we meet the minimum SDK requirement.
        if (minCode == null) {
            if (minVers <= platformSdkVersion) {
@@ -316,6 +319,15 @@ public class FrameworkParsingPackageUtils {
            return input.success(Build.VERSION_CODES.CUR_DEVELOPMENT);
        }

        // TODO(b/294161396): add a check for a "true REL" flag.
        if (platformSdkCodenames.length == 0
                && Build.VERSION.KNOWN_CODENAMES.stream().max(String::compareTo).orElse("").equals(
                        minCode)) {
            Slog.w(TAG, "Parsed package " + pkgName + " requires min development platform "
                    + minCode + ", returning current version " + Build.VERSION.SDK_INT);
            return input.success(Build.VERSION.SDK_INT);
        }

        // Otherwise, we're looking at an incompatible pre-release SDK.
        if (platformSdkCodenames.length > 0) {
            return input.error(PackageManager.INSTALL_FAILED_OLDER_SDK,
@@ -358,30 +370,39 @@ public class FrameworkParsingPackageUtils {
     * @param platformSdkCodenames  array of allowed pre-release SDK codenames for this platform
     * @param allowUnknownCodenames allow unknown codenames, if true this method will accept unknown
     *                              (presumed to be future) codenames
     * @param pkgName               for debug logging
     * @return the targetSdkVersion to use at runtime if successful
     */
    public static ParseResult<Integer> computeTargetSdkVersion(@IntRange(from = 0) int targetVers,
            @Nullable String targetCode, @NonNull String[] platformSdkCodenames,
            @NonNull ParseInput input, boolean allowUnknownCodenames) {
            @NonNull ParseInput input, boolean allowUnknownCodenames,
            String pkgName) {
        // If it's a release SDK, return the version number unmodified.
        if (targetCode == null) {
            return input.success(targetVers);
        }

        try {
            if (allowUnknownCodenames && UnboundedSdkLevel.isAtMost(targetCode)) {
        // TODO(b/294161396): add a check for a "true REL" flag.
        // If it's a pre-release SDK and the codename matches this platform, it
        // definitely targets this SDK.
        if (matchTargetCode(platformSdkCodenames, targetCode)) {
            return input.success(Build.VERSION_CODES.CUR_DEVELOPMENT);
        }
        } catch (IllegalArgumentException e) {
            // isAtMost() throws it when encountering an older SDK codename
            return input.error(PackageManager.INSTALL_FAILED_OLDER_SDK, e.getMessage());
        if (platformSdkCodenames.length == 0
                && Build.VERSION.KNOWN_CODENAMES.stream().max(String::compareTo).orElse("").equals(
                        targetCode)) {
            Slog.w(TAG, "Parsed package " + pkgName + " requires development platform " + targetCode
                    + ", returning current version " + Build.VERSION.SDK_INT);
            return input.success(Build.VERSION.SDK_INT);
        }

        // If it's a pre-release SDK and the codename matches this platform, it
        // definitely targets this SDK.
        if (matchTargetCode(platformSdkCodenames, targetCode)) {
        try {
            if (allowUnknownCodenames && UnboundedSdkLevel.isAtMost(targetCode)) {
                return input.success(Build.VERSION_CODES.CUR_DEVELOPMENT);
            }
        } catch (IllegalArgumentException e) {
            return input.error(PackageManager.INSTALL_FAILED_OLDER_SDK, "Bad package SDK");
        }

        // Otherwise, we're looking at an incompatible pre-release SDK.
        if (platformSdkCodenames.length > 0) {
+4 −2
Original line number Diff line number Diff line
@@ -1546,6 +1546,7 @@ public class ParsingPackageUtils {
    private static ParseResult<ParsingPackage> parseUsesSdk(ParseInput input,
            ParsingPackage pkg, Resources res, XmlResourceParser parser, int flags)
            throws IOException, XmlPullParserException {
        String pkgName = (pkg != null) ? pkg.getPackageName() : "<unknown>";
        if (SDK_VERSION > 0) {
            final boolean isApkInApex = (flags & PARSE_APK_IN_APEX) != 0;
            TypedArray sa = res.obtainAttributes(parser, R.styleable.AndroidManifestUsesSdk);
@@ -1595,7 +1596,7 @@ public class ParsingPackageUtils {

                ParseResult<Integer> targetSdkVersionResult = FrameworkParsingPackageUtils
                        .computeTargetSdkVersion(targetVers, targetCode, SDK_CODENAMES, input,
                                isApkInApex);
                                isApkInApex, pkgName);
                if (targetSdkVersionResult.isError()) {
                    return input.error(targetSdkVersionResult);
                }
@@ -1609,7 +1610,8 @@ public class ParsingPackageUtils {
                }

                ParseResult<Integer> minSdkVersionResult = FrameworkParsingPackageUtils
                        .computeMinSdkVersion(minVers, minCode, SDK_VERSION, SDK_CODENAMES, input);
                        .computeMinSdkVersion(minVers, minCode, SDK_VERSION, SDK_CODENAMES,
                                input, pkgName);
                if (minSdkVersionResult.isError()) {
                    return input.error(minSdkVersionResult);
                }
+3 −2
Original line number Diff line number Diff line
@@ -111,7 +111,8 @@ public class PackageParserLegacyCoreTest {
                minSdkCodename,
                PLATFORM_VERSION,
                isPlatformReleased ? CODENAMES_RELEASED : CODENAMES_PRE_RELEASE,
                input);
                input,
                null);

        if (expectedMinSdk == -1) {
            assertTrue(result.isError());
@@ -206,7 +207,7 @@ public class PackageParserLegacyCoreTest {
                targetSdkCodename,
                isPlatformReleased ? CODENAMES_RELEASED : CODENAMES_PRE_RELEASE,
                input,
                allowUnknownCodenames);
                allowUnknownCodenames, null);

        if (expectedTargetSdk == -1) {
            assertTrue(result.isError());
Loading