Revert "Revert "Limit System SDK to 34 for Java modules in the v..." am: 7416d67f28

Original change: https://android-review.googlesource.com/c/platform/build/soong/+/2897683

Change-Id: Ib01190e49e9ac9d86fbfd542a8362fdb5be2f499
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Jiyong Park
2024-01-06 18:02:11 +00:00
committed by Automerger Merge Worker
5 changed files with 151 additions and 14 deletions

View File

@@ -16,6 +16,7 @@ package android
import (
"fmt"
"reflect"
"strconv"
"strings"
)
@@ -162,6 +163,17 @@ func (s SdkSpec) ForVendorPartition(ctx EarlyModuleContext) SdkSpec {
// If BOARD_CURRENT_API_LEVEL_FOR_VENDOR_MODULES has a numeric value,
// use it instead of "current" for the vendor partition.
currentSdkVersion := ctx.DeviceConfig().CurrentApiLevelForVendorModules()
// b/314011075: special case for Java modules in vendor partition. They can no longer use
// SDK 35 or later. Their maximum API level is limited to 34 (Android U). This is to
// discourage the use of Java APIs in the vendor partition which hasn't been officially
// supported since the Project Treble back in Android 10. We would like to eventually
// evacuate all Java modules from the partition, but that shall be done progressively.
// Note that the check for the availability of SDK 34 is to not break existing tests where
// any of the frozen SDK version is unavailable.
if isJava(ctx.Module()) && isSdkVersion34AvailableIn(ctx.Config()) {
currentSdkVersion = "34"
}
if currentSdkVersion == "current" {
return s
}
@@ -290,28 +302,79 @@ func SdkSpecFromWithConfig(config Config, str string) SdkSpec {
}
}
// Checks if the use of this SDK `s` is valid for the given module context `ctx`.
func (s SdkSpec) ValidateSystemSdk(ctx EarlyModuleContext) bool {
// Ensures that the specified system SDK version is one of BOARD_SYSTEMSDK_VERSIONS (for vendor/product Java module)
// Assuming that BOARD_SYSTEMSDK_VERSIONS := 28 29,
// sdk_version of the modules in vendor/product that use system sdk must be either system_28, system_29 or system_current
if s.Kind != SdkSystem || s.ApiLevel.IsPreview() {
// Do some early checks. This check is currently only for Java modules. And our only concern
// is the use of "system" SDKs.
if !isJava(ctx.Module()) || s.Kind != SdkSystem {
return true
}
allowedVersions := ctx.DeviceConfig().PlatformSystemSdkVersions()
if ctx.DeviceSpecific() || ctx.SocSpecific() || (ctx.ProductSpecific() && ctx.Config().EnforceProductPartitionInterface()) {
systemSdkVersions := ctx.DeviceConfig().SystemSdkVersions()
if len(systemSdkVersions) > 0 {
allowedVersions = systemSdkVersions
inVendor := ctx.DeviceSpecific() || ctx.SocSpecific()
inProduct := ctx.ProductSpecific()
isProductUnbundled := ctx.Config().EnforceProductPartitionInterface()
inApex := false
if am, ok := ctx.Module().(ApexModule); ok {
inApex = am.InAnyApex()
}
isUnbundled := inVendor || (inProduct && isProductUnbundled) || inApex
// Bundled modules can use any SDK
if !isUnbundled {
return true
}
// Unbundled modules are allowed to use BOARD_SYSTEMSDK_VERSIONS
supportedVersions := ctx.DeviceConfig().SystemSdkVersions()
// b/314011075: special case for vendor modules. Java modules in the vendor partition can
// not use SDK 35 or later. This is to discourage the use of Java APIs in the vendor
// partition which hasn't been officially supported since the Project Treble back in Android
// 10. We would like to eventually evacuate all Java modules from the partition, but that
// shall be done progressively.
if inVendor {
// 28 was the API when BOARD_SYSTEMSDK_VERSIONS was introduced, so that's the oldest
// we should allow.
supportedVersions = []string{}
for v := 28; v <= 34; v++ {
supportedVersions = append(supportedVersions, strconv.Itoa(v))
}
}
if len(allowedVersions) > 0 && !InList(s.ApiLevel.String(), allowedVersions) {
// APEXes in the system partition are still considered as part of the platform, thus can use
// more SDKs from PLATFORM_SYSTEMSDK_VERSIONS
if inApex && !inVendor {
supportedVersions = ctx.DeviceConfig().PlatformSystemSdkVersions()
}
thisVer, err := s.EffectiveVersion(ctx)
if err != nil {
ctx.PropertyErrorf("sdk_version", "invalid sdk version %q", s.Raw)
return false
}
thisVerString := strconv.Itoa(thisVer.FinalOrPreviewInt())
if thisVer.IsPreview() {
thisVerString = *ctx.Config().productVariables.Platform_sdk_version_or_codename
}
if !InList(thisVerString, supportedVersions) {
ctx.PropertyErrorf("sdk_version", "incompatible sdk version %q. System SDK version should be one of %q",
s.Raw, allowedVersions)
s.Raw, supportedVersions)
return false
}
return true
}
func isJava(m Module) bool {
moduleType := reflect.TypeOf(m).String()
return strings.HasPrefix(moduleType, "*java.")
}
func isSdkVersion34AvailableIn(c Config) bool {
return c.PlatformSdkVersion().FinalInt() >= 34
}
func init() {
RegisterMakeVarsProvider(pctx, javaSdkMakeVars)
}

View File

@@ -39,11 +39,12 @@ func TestConfig(buildDir string, env map[string]string, bp string, fs map[string
DeviceName: stringPtr("test_device"),
DeviceProduct: stringPtr("test_product"),
Platform_sdk_version: intPtr(30),
Platform_sdk_version_or_codename: stringPtr("S"),
Platform_sdk_codename: stringPtr("S"),
Platform_base_sdk_extension_version: intPtr(1),
Platform_version_active_codenames: []string{"S", "Tiramisu"},
DeviceSystemSdkVersions: []string{"14", "15"},
Platform_systemsdk_versions: []string{"29", "30"},
DeviceSystemSdkVersions: []string{"29", "30", "S"},
Platform_systemsdk_versions: []string{"29", "30", "S", "Tiramisu"},
AAPTConfig: []string{"normal", "large", "xlarge", "hdpi", "xhdpi", "xxhdpi"},
AAPTPreferredConfig: stringPtr("xhdpi"),
AAPTCharacteristics: stringPtr("nosdcard"),