From 6f5250836d1aaf2266b565c2a623ae09df6a28b1 Mon Sep 17 00:00:00 2001 From: Yurii Zubrytskyi Date: Mon, 23 May 2022 17:27:57 +0000 Subject: [PATCH 1/2] Revert "HACK: allow apps with pre-release SDK RESTRICT AUTOMERGE" This reverts commit 47a70c8253705c662ad13164da1d066d450ecc9a. Reason for revert: time to get rid of the hack Change-Id: I64b0cd74a124f68d8b72fcc6686634cc43989603 Bug: 233398506 Test: presubmits --- .../android/content/pm/PackageParser.java | 18 ----------- .../parsing/FrameworkParsingPackageUtils.java | 30 +++---------------- .../server/systemconfig/SystemConfigTest.java | 4 +-- 3 files changed, 6 insertions(+), 46 deletions(-) diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 52e64e80e6d4a..44dc28d2b0faf 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -2618,15 +2618,6 @@ public class PackageParser { return Build.VERSION_CODES.CUR_DEVELOPMENT; } - // STOPSHIP: hack for the pre-release SDK - if (platformSdkCodenames.length == 0 - && Build.VERSION.KNOWN_CODENAMES.stream().max(String::compareTo).orElse("").equals( - targetCode)) { - Slog.w(TAG, "Package 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 @@ -2698,15 +2689,6 @@ public class PackageParser { return Build.VERSION_CODES.CUR_DEVELOPMENT; } - // STOPSHIP: hack for the pre-release SDK - if (platformSdkCodenames.length == 0 - && Build.VERSION.KNOWN_CODENAMES.stream().max(String::compareTo).orElse("").equals( - minCode)) { - Slog.w(TAG, "Package 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 diff --git a/core/java/android/content/pm/parsing/FrameworkParsingPackageUtils.java b/core/java/android/content/pm/parsing/FrameworkParsingPackageUtils.java index 8cc4cdb955ca4..d2d00b237a0da 100644 --- a/core/java/android/content/pm/parsing/FrameworkParsingPackageUtils.java +++ b/core/java/android/content/pm/parsing/FrameworkParsingPackageUtils.java @@ -316,15 +316,6 @@ public class FrameworkParsingPackageUtils { return input.success(Build.VERSION_CODES.CUR_DEVELOPMENT); } - // STOPSHIP: hack for the pre-release SDK - if (platformSdkCodenames.length == 0 - && Build.VERSION.KNOWN_CODENAMES.stream().max(String::compareTo).orElse("").equals( - minCode)) { - Slog.w(TAG, "Parsed package 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, @@ -377,29 +368,16 @@ public class FrameworkParsingPackageUtils { return input.success(targetVers); } + if (allowUnknownCodenames && UnboundedSdkLevel.isAtMost(targetCode)) { + return input.success(Build.VERSION_CODES.CUR_DEVELOPMENT); + } + // 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); } - // STOPSHIP: hack for the pre-release SDK - if (platformSdkCodenames.length == 0 - && Build.VERSION.KNOWN_CODENAMES.stream().max(String::compareTo).orElse("").equals( - targetCode)) { - Slog.w(TAG, "Parsed package requires development platform " + targetCode - + ", returning current version " + Build.VERSION.SDK_INT); - return input.success(Build.VERSION.SDK_INT); - } - - 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) { return input.error(PackageManager.INSTALL_FAILED_OLDER_SDK, diff --git a/services/tests/servicestests/src/com/android/server/systemconfig/SystemConfigTest.java b/services/tests/servicestests/src/com/android/server/systemconfig/SystemConfigTest.java index 758a56f3d2ad6..e9171c0c35144 100644 --- a/services/tests/servicestests/src/com/android/server/systemconfig/SystemConfigTest.java +++ b/services/tests/servicestests/src/com/android/server/systemconfig/SystemConfigTest.java @@ -393,14 +393,14 @@ public class SystemConfigTest { + " \n\n" + " "; parseSharedLibraries(contents); assertFooIsOnlySharedLibrary(); SystemConfig.SharedLibraryEntry entry = mSysConfig.getSharedLibraries().get("foo"); - assertThat(entry.onBootclasspathBefore).isEqualTo("A"); + assertThat(entry.onBootclasspathBefore).isEqualTo("Q"); assertThat(entry.onBootclasspathSince).isEqualTo("W"); } From bb146e1b71e9cc5bf9a4db91c188b559c2a0a954 Mon Sep 17 00:00:00 2001 From: Yurii Zubrytskyi Date: Wed, 1 Jun 2022 15:43:01 -0700 Subject: [PATCH 2/2] Catch parsing errors for pre-release platforms In cases when a parsed APK is built with a pre-release platform (e.g. Tiramisu for 33) our generic parsing code may not fail, as it is called for user packages as well, and a single bad package may disable the whole device. Bug: 233398506 Test: presubmits Change-Id: I7f93176efceac94b0768d0e4d5be1c28ccce23e3 --- .../parsing/FrameworkParsingPackageUtils.java | 9 ++++-- .../java/com/android/server/SystemConfig.java | 28 +++++++++++++++---- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/core/java/android/content/pm/parsing/FrameworkParsingPackageUtils.java b/core/java/android/content/pm/parsing/FrameworkParsingPackageUtils.java index d2d00b237a0da..3e1c5bb3d7ec1 100644 --- a/core/java/android/content/pm/parsing/FrameworkParsingPackageUtils.java +++ b/core/java/android/content/pm/parsing/FrameworkParsingPackageUtils.java @@ -368,8 +368,13 @@ public class FrameworkParsingPackageUtils { return input.success(targetVers); } - if (allowUnknownCodenames && UnboundedSdkLevel.isAtMost(targetCode)) { - return input.success(Build.VERSION_CODES.CUR_DEVELOPMENT); + try { + if (allowUnknownCodenames && UnboundedSdkLevel.isAtMost(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 it's a pre-release SDK and the codename matches this platform, it diff --git a/core/java/com/android/server/SystemConfig.java b/core/java/com/android/server/SystemConfig.java index 3436b9e75c650..9b583be547c3d 100644 --- a/core/java/com/android/server/SystemConfig.java +++ b/core/java/com/android/server/SystemConfig.java @@ -113,6 +113,24 @@ public class SystemConfig { final ArrayList mSplitPermissions = new ArrayList<>(); + private static boolean isAtLeastSdkLevel(String version) { + try { + return UnboundedSdkLevel.isAtLeast(version); + } catch (IllegalArgumentException e) { + // UnboundedSdkLevel throws when it sees a known old codename + return false; + } + } + + private static boolean isAtMostSdkLevel(String version) { + try { + return UnboundedSdkLevel.isAtMost(version); + } catch (IllegalArgumentException e) { + // UnboundedSdkLevel throws when it sees a known old codename + return true; + } + } + public static final class SharedLibraryEntry { public final String name; public final String filename; @@ -180,9 +198,9 @@ public class SystemConfig { // - onBootclasspathBefore is set and we are before that SDK canBeSafelyIgnored = (this.onBootclasspathSince != null - && UnboundedSdkLevel.isAtLeast(this.onBootclasspathSince)) + && isAtLeastSdkLevel(this.onBootclasspathSince)) || (this.onBootclasspathBefore != null - && !UnboundedSdkLevel.isAtLeast(this.onBootclasspathBefore)); + && !isAtLeastSdkLevel(this.onBootclasspathBefore)); } } @@ -885,11 +903,9 @@ public class SystemConfig { + parser.getPositionDescription()); } else { boolean allowedMinSdk = - minDeviceSdk == null || UnboundedSdkLevel.isAtLeast( - minDeviceSdk); + minDeviceSdk == null || isAtLeastSdkLevel(minDeviceSdk); boolean allowedMaxSdk = - maxDeviceSdk == null || UnboundedSdkLevel.isAtMost( - maxDeviceSdk); + maxDeviceSdk == null || isAtMostSdkLevel(maxDeviceSdk); final boolean exists = new File(lfile).exists(); if (allowedMinSdk && allowedMaxSdk && exists) { String bcpSince = parser.getAttributeValue(null,