From ccb20b8eb6c890eb5278c6693b5ad0a223bb9fa7 Mon Sep 17 00:00:00 2001 From: Patrick Baumann Date: Mon, 8 Jan 2018 13:22:46 -0800 Subject: [PATCH] Allow forcing target SDK to current dev This change overrides the existing --force-sdk install flag to also force the installing target SDK to the current dev version if the app targets a different dev version. Test: Manual, installed an O-built app on P dev build. Change-Id: I71070e99649aa6faad979f2fa712617a7b325a10 Fixes: 27880828 --- .../android/content/pm/PackageManager.java | 3 +- .../android/content/pm/PackageParser.java | 13 ++--- .../android/content/pm/PackageParserTest.java | 47 +++++++++++++------ 3 files changed, 41 insertions(+), 22 deletions(-) diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 5f82c2a76a18f..a4ca6a5aac12d 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -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 */ diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 367c39dfd8ff0..51087c353280c 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -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; @@ -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; @@ -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; } diff --git a/core/tests/coretests/src/android/content/pm/PackageParserTest.java b/core/tests/coretests/src/android/content/pm/PackageParserTest.java index 53f4f3a8af9ad..267267ed47775 100644 --- a/core/tests/coretests/src/android/content/pm/PackageParserTest.java +++ b/core/tests/coretests/src/android/content/pm/PackageParserTest.java @@ -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); @@ -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 @@ -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 */); } /**