Loading core/java/android/content/pm/PackageParser.java +28 −4 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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; Loading Loading @@ -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; Loading @@ -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 Loading Loading @@ -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) { Loading @@ -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 Loading core/java/android/content/pm/parsing/ApkLiteParseUtils.java +2 −2 Original line number Diff line number Diff line Loading @@ -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); } Loading core/java/android/content/pm/parsing/FrameworkParsingPackageUtils.java +31 −10 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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, Loading Loading @@ -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) { Loading services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java +4 −2 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); } Loading @@ -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); } Loading services/tests/PackageManagerServiceTests/server/src/com/android/server/parsing/PackageParserLegacyCoreTest.java +3 −2 Original line number Diff line number Diff line Loading @@ -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()); Loading Loading @@ -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 Loading
core/java/android/content/pm/PackageParser.java +28 −4 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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; Loading Loading @@ -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; Loading @@ -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 Loading Loading @@ -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) { Loading @@ -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 Loading
core/java/android/content/pm/parsing/ApkLiteParseUtils.java +2 −2 Original line number Diff line number Diff line Loading @@ -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); } Loading
core/java/android/content/pm/parsing/FrameworkParsingPackageUtils.java +31 −10 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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, Loading Loading @@ -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) { Loading
services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java +4 −2 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); } Loading @@ -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); } Loading
services/tests/PackageManagerServiceTests/server/src/com/android/server/parsing/PackageParserLegacyCoreTest.java +3 −2 Original line number Diff line number Diff line Loading @@ -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()); Loading Loading @@ -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