Loading core/java/android/content/pm/PackageManager.java +2 −1 Original line number Diff line number Diff line Loading @@ -787,7 +787,8 @@ public abstract class PackageManager { /** * Flag parameter for {@link #installPackage} to indicate that this package is an * upgrade to a package that refers to the SDK via release letter. * upgrade to a package that refers to the SDK via release letter or is targeting an SDK via * release letter that the current build does not support. * * @hide */ Loading core/java/android/content/pm/PackageParser.java +7 −6 Original line number Diff line number Diff line Loading @@ -2245,8 +2245,9 @@ public class PackageParser { return null; } boolean defaultToCurrentDevBranch = (flags & PARSE_FORCE_SDK) != 0; final int targetSdkVersion = PackageParser.computeTargetSdkVersion(targetVers, targetCode, SDK_VERSION, SDK_CODENAMES, outError); targetCode, SDK_CODENAMES, outError, defaultToCurrentDevBranch); if (targetSdkVersion < 0) { mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK; return null; Loading Loading @@ -2562,19 +2563,19 @@ public class PackageParser { * application manifest, or 0 otherwise * @param targetCode targetSdkVersion code, if specified in the application * manifest, or {@code null} otherwise * @param platformSdkVersion platform SDK version number, typically * Build.VERSION.SDK_INT * @param platformSdkCodenames array of allowed pre-release SDK codenames * for this platform * @param outError output array to populate with error, if applicable * @param forceCurrentDev if development target code is not available, use the current * development version by default. * @return the targetSdkVersion to use at runtime, or -1 if the package is * not compatible with this platform * @hide Exposed for unit testing only. */ @TestApi public static int computeTargetSdkVersion(@IntRange(from = 0) int targetVers, @Nullable String targetCode, @IntRange(from = 1) int platformSdkVersion, @NonNull String[] platformSdkCodenames, @NonNull String[] outError) { @Nullable String targetCode, @NonNull String[] platformSdkCodenames, @NonNull String[] outError, boolean forceCurrentDev) { // If it's a release SDK, return the version number unmodified. if (targetCode == null) { return targetVers; Loading @@ -2582,7 +2583,7 @@ public class PackageParser { // If it's a pre-release SDK and the codename matches this platform, it // definitely targets this SDK. if (ArrayUtils.contains(platformSdkCodenames, targetCode)) { if (ArrayUtils.contains(platformSdkCodenames, targetCode) || forceCurrentDev) { return Build.VERSION_CODES.CUR_DEVELOPMENT; } Loading core/tests/coretests/src/android/content/pm/PackageParserTest.java +32 −15 Original line number Diff line number Diff line Loading @@ -146,14 +146,14 @@ public class PackageParserTest { } private void verifyComputeTargetSdkVersion(int targetSdkVersion, String targetSdkCodename, boolean isPlatformReleased, int expectedTargetSdk) { boolean isPlatformReleased, int expectedTargetSdk, boolean forceCurrentDev) { final String[] outError = new String[1]; final int result = PackageParser.computeTargetSdkVersion( targetSdkVersion, targetSdkCodename, PLATFORM_VERSION, isPlatformReleased ? CODENAMES_RELEASED : CODENAMES_PRE_RELEASE, outError); outError, forceCurrentDev); assertEquals(result, expectedTargetSdk); Loading @@ -169,34 +169,45 @@ public class PackageParserTest { // Do allow older release targetSdkVersion on pre-release platform. // APP: Released API 10 // DEV: Pre-release API 20 verifyComputeTargetSdkVersion(OLDER_VERSION, RELEASED, false, OLDER_VERSION); verifyComputeTargetSdkVersion(OLDER_VERSION, RELEASED, false, OLDER_VERSION, false /* forceCurrentDev */); // Do allow same release targetSdkVersion on pre-release platform. // APP: Released API 20 // DEV: Pre-release API 20 verifyComputeTargetSdkVersion(PLATFORM_VERSION, RELEASED, false, PLATFORM_VERSION); verifyComputeTargetSdkVersion(PLATFORM_VERSION, RELEASED, false, PLATFORM_VERSION, false /* forceCurrentDev */); // Do allow newer release targetSdkVersion on pre-release platform. // APP: Released API 30 // DEV: Pre-release API 20 verifyComputeTargetSdkVersion(NEWER_VERSION, RELEASED, false, NEWER_VERSION); verifyComputeTargetSdkVersion(NEWER_VERSION, RELEASED, false, NEWER_VERSION, false /* forceCurrentDev */); // Don't allow older pre-release targetSdkVersion on pre-release platform. // APP: Pre-release API 10 // DEV: Pre-release API 20 verifyComputeTargetSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE, false, -1); verifyComputeTargetSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE, false, -1, false /* forceCurrentDev */); // Do allow same pre-release targetSdkVersion on pre-release platform, // but overwrite the specified version with CUR_DEVELOPMENT. // APP: Pre-release API 20 // DEV: Pre-release API 20 verifyComputeTargetSdkVersion(PLATFORM_VERSION, PRE_RELEASE, false, Build.VERSION_CODES.CUR_DEVELOPMENT); Build.VERSION_CODES.CUR_DEVELOPMENT, false /* forceCurrentDev */); // Don't allow newer pre-release targetSdkVersion on pre-release platform. // APP: Pre-release API 30 // DEV: Pre-release API 20 verifyComputeTargetSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE, false, -1); verifyComputeTargetSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE, false, -1, false /* forceCurrentDev */); // Force newer pre-release targetSdkVersion to current pre-release platform. // APP: Pre-release API 30 // DEV: Pre-release API 20 verifyComputeTargetSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE, false, Build.VERSION_CODES.CUR_DEVELOPMENT, true /* forceCurrentDev */); } @Test Loading @@ -204,32 +215,38 @@ public class PackageParserTest { // Do allow older release targetSdkVersion on released platform. // APP: Released API 10 // DEV: Released API 20 verifyComputeTargetSdkVersion(OLDER_VERSION, RELEASED, true, OLDER_VERSION); verifyComputeTargetSdkVersion(OLDER_VERSION, RELEASED, true, OLDER_VERSION, false /* forceCurrentDev */); // Do allow same release targetSdkVersion on released platform. // APP: Released API 20 // DEV: Released API 20 verifyComputeTargetSdkVersion(PLATFORM_VERSION, RELEASED, true, PLATFORM_VERSION); verifyComputeTargetSdkVersion(PLATFORM_VERSION, RELEASED, true, PLATFORM_VERSION, false /* forceCurrentDev */); // Do allow newer release targetSdkVersion on released platform. // APP: Released API 30 // DEV: Released API 20 verifyComputeTargetSdkVersion(NEWER_VERSION, RELEASED, true, NEWER_VERSION); verifyComputeTargetSdkVersion(NEWER_VERSION, RELEASED, true, NEWER_VERSION, false /* forceCurrentDev */); // Don't allow older pre-release targetSdkVersion on released platform. // APP: Pre-release API 10 // DEV: Released API 20 verifyComputeTargetSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE, true, -1); verifyComputeTargetSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE, true, -1, false /* forceCurrentDev */); // Don't allow same pre-release targetSdkVersion on released platform. // APP: Pre-release API 20 // DEV: Released API 20 verifyComputeTargetSdkVersion(PLATFORM_VERSION, PRE_RELEASE, true, -1); verifyComputeTargetSdkVersion(PLATFORM_VERSION, PRE_RELEASE, true, -1, false /* forceCurrentDev */); // Don't allow newer pre-release targetSdkVersion on released platform. // APP: Pre-release API 30 // DEV: Released API 20 verifyComputeTargetSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE, true, -1); verifyComputeTargetSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE, true, -1, false /* forceCurrentDev */); } /** Loading Loading
core/java/android/content/pm/PackageManager.java +2 −1 Original line number Diff line number Diff line Loading @@ -787,7 +787,8 @@ public abstract class PackageManager { /** * Flag parameter for {@link #installPackage} to indicate that this package is an * upgrade to a package that refers to the SDK via release letter. * upgrade to a package that refers to the SDK via release letter or is targeting an SDK via * release letter that the current build does not support. * * @hide */ Loading
core/java/android/content/pm/PackageParser.java +7 −6 Original line number Diff line number Diff line Loading @@ -2245,8 +2245,9 @@ public class PackageParser { return null; } boolean defaultToCurrentDevBranch = (flags & PARSE_FORCE_SDK) != 0; final int targetSdkVersion = PackageParser.computeTargetSdkVersion(targetVers, targetCode, SDK_VERSION, SDK_CODENAMES, outError); targetCode, SDK_CODENAMES, outError, defaultToCurrentDevBranch); if (targetSdkVersion < 0) { mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK; return null; Loading Loading @@ -2562,19 +2563,19 @@ public class PackageParser { * application manifest, or 0 otherwise * @param targetCode targetSdkVersion code, if specified in the application * manifest, or {@code null} otherwise * @param platformSdkVersion platform SDK version number, typically * Build.VERSION.SDK_INT * @param platformSdkCodenames array of allowed pre-release SDK codenames * for this platform * @param outError output array to populate with error, if applicable * @param forceCurrentDev if development target code is not available, use the current * development version by default. * @return the targetSdkVersion to use at runtime, or -1 if the package is * not compatible with this platform * @hide Exposed for unit testing only. */ @TestApi public static int computeTargetSdkVersion(@IntRange(from = 0) int targetVers, @Nullable String targetCode, @IntRange(from = 1) int platformSdkVersion, @NonNull String[] platformSdkCodenames, @NonNull String[] outError) { @Nullable String targetCode, @NonNull String[] platformSdkCodenames, @NonNull String[] outError, boolean forceCurrentDev) { // If it's a release SDK, return the version number unmodified. if (targetCode == null) { return targetVers; Loading @@ -2582,7 +2583,7 @@ public class PackageParser { // If it's a pre-release SDK and the codename matches this platform, it // definitely targets this SDK. if (ArrayUtils.contains(platformSdkCodenames, targetCode)) { if (ArrayUtils.contains(platformSdkCodenames, targetCode) || forceCurrentDev) { return Build.VERSION_CODES.CUR_DEVELOPMENT; } Loading
core/tests/coretests/src/android/content/pm/PackageParserTest.java +32 −15 Original line number Diff line number Diff line Loading @@ -146,14 +146,14 @@ public class PackageParserTest { } private void verifyComputeTargetSdkVersion(int targetSdkVersion, String targetSdkCodename, boolean isPlatformReleased, int expectedTargetSdk) { boolean isPlatformReleased, int expectedTargetSdk, boolean forceCurrentDev) { final String[] outError = new String[1]; final int result = PackageParser.computeTargetSdkVersion( targetSdkVersion, targetSdkCodename, PLATFORM_VERSION, isPlatformReleased ? CODENAMES_RELEASED : CODENAMES_PRE_RELEASE, outError); outError, forceCurrentDev); assertEquals(result, expectedTargetSdk); Loading @@ -169,34 +169,45 @@ public class PackageParserTest { // Do allow older release targetSdkVersion on pre-release platform. // APP: Released API 10 // DEV: Pre-release API 20 verifyComputeTargetSdkVersion(OLDER_VERSION, RELEASED, false, OLDER_VERSION); verifyComputeTargetSdkVersion(OLDER_VERSION, RELEASED, false, OLDER_VERSION, false /* forceCurrentDev */); // Do allow same release targetSdkVersion on pre-release platform. // APP: Released API 20 // DEV: Pre-release API 20 verifyComputeTargetSdkVersion(PLATFORM_VERSION, RELEASED, false, PLATFORM_VERSION); verifyComputeTargetSdkVersion(PLATFORM_VERSION, RELEASED, false, PLATFORM_VERSION, false /* forceCurrentDev */); // Do allow newer release targetSdkVersion on pre-release platform. // APP: Released API 30 // DEV: Pre-release API 20 verifyComputeTargetSdkVersion(NEWER_VERSION, RELEASED, false, NEWER_VERSION); verifyComputeTargetSdkVersion(NEWER_VERSION, RELEASED, false, NEWER_VERSION, false /* forceCurrentDev */); // Don't allow older pre-release targetSdkVersion on pre-release platform. // APP: Pre-release API 10 // DEV: Pre-release API 20 verifyComputeTargetSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE, false, -1); verifyComputeTargetSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE, false, -1, false /* forceCurrentDev */); // Do allow same pre-release targetSdkVersion on pre-release platform, // but overwrite the specified version with CUR_DEVELOPMENT. // APP: Pre-release API 20 // DEV: Pre-release API 20 verifyComputeTargetSdkVersion(PLATFORM_VERSION, PRE_RELEASE, false, Build.VERSION_CODES.CUR_DEVELOPMENT); Build.VERSION_CODES.CUR_DEVELOPMENT, false /* forceCurrentDev */); // Don't allow newer pre-release targetSdkVersion on pre-release platform. // APP: Pre-release API 30 // DEV: Pre-release API 20 verifyComputeTargetSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE, false, -1); verifyComputeTargetSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE, false, -1, false /* forceCurrentDev */); // Force newer pre-release targetSdkVersion to current pre-release platform. // APP: Pre-release API 30 // DEV: Pre-release API 20 verifyComputeTargetSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE, false, Build.VERSION_CODES.CUR_DEVELOPMENT, true /* forceCurrentDev */); } @Test Loading @@ -204,32 +215,38 @@ public class PackageParserTest { // Do allow older release targetSdkVersion on released platform. // APP: Released API 10 // DEV: Released API 20 verifyComputeTargetSdkVersion(OLDER_VERSION, RELEASED, true, OLDER_VERSION); verifyComputeTargetSdkVersion(OLDER_VERSION, RELEASED, true, OLDER_VERSION, false /* forceCurrentDev */); // Do allow same release targetSdkVersion on released platform. // APP: Released API 20 // DEV: Released API 20 verifyComputeTargetSdkVersion(PLATFORM_VERSION, RELEASED, true, PLATFORM_VERSION); verifyComputeTargetSdkVersion(PLATFORM_VERSION, RELEASED, true, PLATFORM_VERSION, false /* forceCurrentDev */); // Do allow newer release targetSdkVersion on released platform. // APP: Released API 30 // DEV: Released API 20 verifyComputeTargetSdkVersion(NEWER_VERSION, RELEASED, true, NEWER_VERSION); verifyComputeTargetSdkVersion(NEWER_VERSION, RELEASED, true, NEWER_VERSION, false /* forceCurrentDev */); // Don't allow older pre-release targetSdkVersion on released platform. // APP: Pre-release API 10 // DEV: Released API 20 verifyComputeTargetSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE, true, -1); verifyComputeTargetSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE, true, -1, false /* forceCurrentDev */); // Don't allow same pre-release targetSdkVersion on released platform. // APP: Pre-release API 20 // DEV: Released API 20 verifyComputeTargetSdkVersion(PLATFORM_VERSION, PRE_RELEASE, true, -1); verifyComputeTargetSdkVersion(PLATFORM_VERSION, PRE_RELEASE, true, -1, false /* forceCurrentDev */); // Don't allow newer pre-release targetSdkVersion on released platform. // APP: Pre-release API 30 // DEV: Released API 20 verifyComputeTargetSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE, true, -1); verifyComputeTargetSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE, true, -1, false /* forceCurrentDev */); } /** Loading