Loading core/java/android/content/pm/PackageParser.java +19 −2 Original line number Diff line number Diff line Loading @@ -2655,6 +2655,23 @@ public class PackageParser { pkg.usesPermissionInfos.add(new UsesPermissionInfo(permission)); } /** * Matches a given {@code targetCode} against a set of release codeNames. Target codes can * either be of the form {@code [codename]}" (e.g {@code "Q"}) or of the form * {@code [codename].[fingerprint]} (e.g {@code "Q.cafebc561"}). */ private static boolean matchTargetCode(@NonNull String[] codeNames, @NonNull String targetCode) { final String targetCodeName; final int targetCodeIdx = targetCode.indexOf('.'); if (targetCodeIdx == -1) { targetCodeName = targetCode; } else { targetCodeName = targetCode.substring(0, targetCodeIdx); } return ArrayUtils.contains(codeNames, targetCodeName); } /** * Computes the targetSdkVersion to use at runtime. If the package is not * compatible with this platform, populates {@code outError[0]} with an Loading Loading @@ -2698,7 +2715,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) || forceCurrentDev) { if (matchTargetCode(platformSdkCodenames, targetCode) || forceCurrentDev) { return Build.VERSION_CODES.CUR_DEVELOPMENT; } Loading Loading @@ -2831,7 +2848,7 @@ public class PackageParser { // If it's a pre-release SDK and the codename matches this platform, we // definitely meet the minimum SDK requirement. if (ArrayUtils.contains(platformSdkCodenames, minCode)) { if (matchTargetCode(platformSdkCodenames, minCode)) { return Build.VERSION_CODES.CUR_DEVELOPMENT; } Loading core/tests/coretests/src/android/content/pm/PackageParserTest.java +34 −1 Original line number Diff line number Diff line Loading @@ -51,6 +51,12 @@ public class PackageParserTest { private static final String PRE_RELEASE = "B"; private static final String NEWER_PRE_RELEASE = "C"; // Codenames with a fingerprint attached to them. These may only be present in the apps // declared min SDK and not as platform codenames. private static final String OLDER_PRE_RELEASE_WITH_FINGERPRINT = "A.fingerprint"; private static final String PRE_RELEASE_WITH_FINGERPRINT = "B.fingerprint"; private static final String NEWER_PRE_RELEASE_WITH_FINGERPRINT = "C.fingerprint"; private static final String[] CODENAMES_RELEASED = { /* empty */ }; private static final String[] CODENAMES_PRE_RELEASE = { PRE_RELEASE }; Loading @@ -68,7 +74,7 @@ public class PackageParserTest { isPlatformReleased ? CODENAMES_RELEASED : CODENAMES_PRE_RELEASE, outError); assertEquals(result, expectedMinSdk); assertEquals("Error msg: " + outError[0], expectedMinSdk, result); if (expectedMinSdk == -1) { assertNotNull(outError[0]); Loading Loading @@ -98,6 +104,7 @@ public class PackageParserTest { // APP: Pre-release API 10 // DEV: Pre-release API 20 verifyComputeMinSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE, false, -1); verifyComputeMinSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE_WITH_FINGERPRINT, false, -1); // Do allow same pre-release minSdkVersion on pre-release platform, // but overwrite the specified version with CUR_DEVELOPMENT. Loading @@ -105,11 +112,15 @@ public class PackageParserTest { // DEV: Pre-release API 20 verifyComputeMinSdkVersion(PLATFORM_VERSION, PRE_RELEASE, false, Build.VERSION_CODES.CUR_DEVELOPMENT); verifyComputeMinSdkVersion(PLATFORM_VERSION, PRE_RELEASE_WITH_FINGERPRINT, false, Build.VERSION_CODES.CUR_DEVELOPMENT); // Don't allow newer pre-release minSdkVersion on pre-release platform. // APP: Pre-release API 30 // DEV: Pre-release API 20 verifyComputeMinSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE, false, -1); verifyComputeMinSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE_WITH_FINGERPRINT, false, -1); } @Test Loading @@ -133,16 +144,20 @@ public class PackageParserTest { // APP: Pre-release API 10 // DEV: Released API 20 verifyComputeMinSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE, true, -1); verifyComputeMinSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE_WITH_FINGERPRINT, true, -1); // Don't allow same pre-release minSdkVersion on released platform. // APP: Pre-release API 20 // DEV: Released API 20 verifyComputeMinSdkVersion(PLATFORM_VERSION, PRE_RELEASE, true, -1); verifyComputeMinSdkVersion(PLATFORM_VERSION, PRE_RELEASE_WITH_FINGERPRINT, true, -1); // Don't allow newer pre-release minSdkVersion on released platform. // APP: Pre-release API 30 // DEV: Released API 20 verifyComputeMinSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE, true, -1); verifyComputeMinSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE_WITH_FINGERPRINT, true, -1); } private void verifyComputeTargetSdkVersion(int targetSdkVersion, String targetSdkCodename, Loading Loading @@ -189,6 +204,9 @@ public class PackageParserTest { // DEV: Pre-release API 20 verifyComputeTargetSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE, false, -1, false /* forceCurrentDev */); verifyComputeTargetSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE_WITH_FINGERPRINT, false, -1, false /* forceCurrentDev */); // Do allow same pre-release targetSdkVersion on pre-release platform, // but overwrite the specified version with CUR_DEVELOPMENT. Loading @@ -196,18 +214,26 @@ public class PackageParserTest { // DEV: Pre-release API 20 verifyComputeTargetSdkVersion(PLATFORM_VERSION, PRE_RELEASE, false, Build.VERSION_CODES.CUR_DEVELOPMENT, false /* forceCurrentDev */); verifyComputeTargetSdkVersion(PLATFORM_VERSION, PRE_RELEASE_WITH_FINGERPRINT, false, 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, false /* forceCurrentDev */); verifyComputeTargetSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE_WITH_FINGERPRINT, 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 */); verifyComputeTargetSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE_WITH_FINGERPRINT, false, Build.VERSION_CODES.CUR_DEVELOPMENT, true /* forceCurrentDev */); } @Test Loading Loading @@ -235,18 +261,25 @@ public class PackageParserTest { // DEV: Released API 20 verifyComputeTargetSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE, true, -1, false /* forceCurrentDev */); verifyComputeTargetSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE_WITH_FINGERPRINT, 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, false /* forceCurrentDev */); verifyComputeTargetSdkVersion(PLATFORM_VERSION, PRE_RELEASE_WITH_FINGERPRINT, 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, false /* forceCurrentDev */); verifyComputeTargetSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE_WITH_FINGERPRINT, true, -1, false /* forceCurrentDev */); } /** Loading Loading
core/java/android/content/pm/PackageParser.java +19 −2 Original line number Diff line number Diff line Loading @@ -2655,6 +2655,23 @@ public class PackageParser { pkg.usesPermissionInfos.add(new UsesPermissionInfo(permission)); } /** * Matches a given {@code targetCode} against a set of release codeNames. Target codes can * either be of the form {@code [codename]}" (e.g {@code "Q"}) or of the form * {@code [codename].[fingerprint]} (e.g {@code "Q.cafebc561"}). */ private static boolean matchTargetCode(@NonNull String[] codeNames, @NonNull String targetCode) { final String targetCodeName; final int targetCodeIdx = targetCode.indexOf('.'); if (targetCodeIdx == -1) { targetCodeName = targetCode; } else { targetCodeName = targetCode.substring(0, targetCodeIdx); } return ArrayUtils.contains(codeNames, targetCodeName); } /** * Computes the targetSdkVersion to use at runtime. If the package is not * compatible with this platform, populates {@code outError[0]} with an Loading Loading @@ -2698,7 +2715,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) || forceCurrentDev) { if (matchTargetCode(platformSdkCodenames, targetCode) || forceCurrentDev) { return Build.VERSION_CODES.CUR_DEVELOPMENT; } Loading Loading @@ -2831,7 +2848,7 @@ public class PackageParser { // If it's a pre-release SDK and the codename matches this platform, we // definitely meet the minimum SDK requirement. if (ArrayUtils.contains(platformSdkCodenames, minCode)) { if (matchTargetCode(platformSdkCodenames, minCode)) { return Build.VERSION_CODES.CUR_DEVELOPMENT; } Loading
core/tests/coretests/src/android/content/pm/PackageParserTest.java +34 −1 Original line number Diff line number Diff line Loading @@ -51,6 +51,12 @@ public class PackageParserTest { private static final String PRE_RELEASE = "B"; private static final String NEWER_PRE_RELEASE = "C"; // Codenames with a fingerprint attached to them. These may only be present in the apps // declared min SDK and not as platform codenames. private static final String OLDER_PRE_RELEASE_WITH_FINGERPRINT = "A.fingerprint"; private static final String PRE_RELEASE_WITH_FINGERPRINT = "B.fingerprint"; private static final String NEWER_PRE_RELEASE_WITH_FINGERPRINT = "C.fingerprint"; private static final String[] CODENAMES_RELEASED = { /* empty */ }; private static final String[] CODENAMES_PRE_RELEASE = { PRE_RELEASE }; Loading @@ -68,7 +74,7 @@ public class PackageParserTest { isPlatformReleased ? CODENAMES_RELEASED : CODENAMES_PRE_RELEASE, outError); assertEquals(result, expectedMinSdk); assertEquals("Error msg: " + outError[0], expectedMinSdk, result); if (expectedMinSdk == -1) { assertNotNull(outError[0]); Loading Loading @@ -98,6 +104,7 @@ public class PackageParserTest { // APP: Pre-release API 10 // DEV: Pre-release API 20 verifyComputeMinSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE, false, -1); verifyComputeMinSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE_WITH_FINGERPRINT, false, -1); // Do allow same pre-release minSdkVersion on pre-release platform, // but overwrite the specified version with CUR_DEVELOPMENT. Loading @@ -105,11 +112,15 @@ public class PackageParserTest { // DEV: Pre-release API 20 verifyComputeMinSdkVersion(PLATFORM_VERSION, PRE_RELEASE, false, Build.VERSION_CODES.CUR_DEVELOPMENT); verifyComputeMinSdkVersion(PLATFORM_VERSION, PRE_RELEASE_WITH_FINGERPRINT, false, Build.VERSION_CODES.CUR_DEVELOPMENT); // Don't allow newer pre-release minSdkVersion on pre-release platform. // APP: Pre-release API 30 // DEV: Pre-release API 20 verifyComputeMinSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE, false, -1); verifyComputeMinSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE_WITH_FINGERPRINT, false, -1); } @Test Loading @@ -133,16 +144,20 @@ public class PackageParserTest { // APP: Pre-release API 10 // DEV: Released API 20 verifyComputeMinSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE, true, -1); verifyComputeMinSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE_WITH_FINGERPRINT, true, -1); // Don't allow same pre-release minSdkVersion on released platform. // APP: Pre-release API 20 // DEV: Released API 20 verifyComputeMinSdkVersion(PLATFORM_VERSION, PRE_RELEASE, true, -1); verifyComputeMinSdkVersion(PLATFORM_VERSION, PRE_RELEASE_WITH_FINGERPRINT, true, -1); // Don't allow newer pre-release minSdkVersion on released platform. // APP: Pre-release API 30 // DEV: Released API 20 verifyComputeMinSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE, true, -1); verifyComputeMinSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE_WITH_FINGERPRINT, true, -1); } private void verifyComputeTargetSdkVersion(int targetSdkVersion, String targetSdkCodename, Loading Loading @@ -189,6 +204,9 @@ public class PackageParserTest { // DEV: Pre-release API 20 verifyComputeTargetSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE, false, -1, false /* forceCurrentDev */); verifyComputeTargetSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE_WITH_FINGERPRINT, false, -1, false /* forceCurrentDev */); // Do allow same pre-release targetSdkVersion on pre-release platform, // but overwrite the specified version with CUR_DEVELOPMENT. Loading @@ -196,18 +214,26 @@ public class PackageParserTest { // DEV: Pre-release API 20 verifyComputeTargetSdkVersion(PLATFORM_VERSION, PRE_RELEASE, false, Build.VERSION_CODES.CUR_DEVELOPMENT, false /* forceCurrentDev */); verifyComputeTargetSdkVersion(PLATFORM_VERSION, PRE_RELEASE_WITH_FINGERPRINT, false, 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, false /* forceCurrentDev */); verifyComputeTargetSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE_WITH_FINGERPRINT, 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 */); verifyComputeTargetSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE_WITH_FINGERPRINT, false, Build.VERSION_CODES.CUR_DEVELOPMENT, true /* forceCurrentDev */); } @Test Loading Loading @@ -235,18 +261,25 @@ public class PackageParserTest { // DEV: Released API 20 verifyComputeTargetSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE, true, -1, false /* forceCurrentDev */); verifyComputeTargetSdkVersion(OLDER_VERSION, OLDER_PRE_RELEASE_WITH_FINGERPRINT, 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, false /* forceCurrentDev */); verifyComputeTargetSdkVersion(PLATFORM_VERSION, PRE_RELEASE_WITH_FINGERPRINT, 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, false /* forceCurrentDev */); verifyComputeTargetSdkVersion(NEWER_VERSION, NEWER_PRE_RELEASE_WITH_FINGERPRINT, true, -1, false /* forceCurrentDev */); } /** Loading