Loading android/config.go +5 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import ( var Bool = proptools.Bool var String = proptools.String var StringDefault = proptools.StringDefault const FutureApiLevel = 10000 Loading Loading @@ -958,6 +959,10 @@ func (c *deviceConfig) VndkVersion() string { return String(c.config.productVariables.DeviceVndkVersion) } func (c *deviceConfig) CurrentApiLevelForVendorModules() string { return StringDefault(c.config.productVariables.DeviceCurrentApiLevelForVendorModules, "current") } func (c *deviceConfig) PlatformVndkVersion() string { return String(c.config.productVariables.Platform_vndk_version) } Loading android/variable.go +8 −7 Original line number Diff line number Diff line Loading @@ -172,6 +172,7 @@ type productVariables struct { DeviceCpuVariant *string `json:",omitempty"` DeviceAbi []string `json:",omitempty"` DeviceVndkVersion *string `json:",omitempty"` DeviceCurrentApiLevelForVendorModules *string `json:",omitempty"` DeviceSystemSdkVersions []string `json:",omitempty"` DeviceSecondaryArch *string `json:",omitempty"` Loading java/app_test.go +101 −25 Original line number Diff line number Diff line Loading @@ -1038,6 +1038,35 @@ func TestAndroidResources(t *testing.T) { } } func checkSdkVersion(t *testing.T, config android.Config, expectedSdkVersion string) { ctx := testContext() run(t, ctx, config) foo := ctx.ModuleForTests("foo", "android_common") link := foo.Output("package-res.apk") linkFlags := strings.Split(link.Args["flags"], " ") min := android.IndexList("--min-sdk-version", linkFlags) target := android.IndexList("--target-sdk-version", linkFlags) if min == -1 || target == -1 || min == len(linkFlags)-1 || target == len(linkFlags)-1 { t.Fatalf("missing --min-sdk-version or --target-sdk-version in link flags: %q", linkFlags) } gotMinSdkVersion := linkFlags[min+1] gotTargetSdkVersion := linkFlags[target+1] if gotMinSdkVersion != expectedSdkVersion { t.Errorf("incorrect --min-sdk-version, expected %q got %q", expectedSdkVersion, gotMinSdkVersion) } if gotTargetSdkVersion != expectedSdkVersion { t.Errorf("incorrect --target-sdk-version, expected %q got %q", expectedSdkVersion, gotTargetSdkVersion) } } func TestAppSdkVersion(t *testing.T) { testCases := []struct { name string Loading Loading @@ -1107,37 +1136,84 @@ func TestAppSdkVersion(t *testing.T) { config.TestProductVariables.Platform_sdk_version = &test.platformSdkInt config.TestProductVariables.Platform_sdk_codename = &test.platformSdkCodename config.TestProductVariables.Platform_sdk_final = &test.platformSdkFinal checkSdkVersion(t, config, test.expectedMinSdkVersion) ctx := testContext() run(t, ctx, config) foo := ctx.ModuleForTests("foo", "android_common") link := foo.Output("package-res.apk") linkFlags := strings.Split(link.Args["flags"], " ") min := android.IndexList("--min-sdk-version", linkFlags) target := android.IndexList("--target-sdk-version", linkFlags) if min == -1 || target == -1 || min == len(linkFlags)-1 || target == len(linkFlags)-1 { t.Fatalf("missing --min-sdk-version or --target-sdk-version in link flags: %q", linkFlags) }) } } gotMinSdkVersion := linkFlags[min+1] gotTargetSdkVersion := linkFlags[target+1] if gotMinSdkVersion != test.expectedMinSdkVersion { t.Errorf("incorrect --min-sdk-version, expected %q got %q", test.expectedMinSdkVersion, gotMinSdkVersion) } if gotTargetSdkVersion != test.expectedMinSdkVersion { t.Errorf("incorrect --target-sdk-version, expected %q got %q", test.expectedMinSdkVersion, gotTargetSdkVersion) func TestVendorAppSdkVersion(t *testing.T) { testCases := []struct { name string sdkVersion string platformSdkInt int platformSdkCodename string platformSdkFinal bool deviceCurrentApiLevelForVendorModules string expectedMinSdkVersion string }{ { name: "current final SDK", sdkVersion: "current", platformSdkInt: 29, platformSdkCodename: "REL", platformSdkFinal: true, deviceCurrentApiLevelForVendorModules: "29", expectedMinSdkVersion: "29", }, { name: "current final SDK", sdkVersion: "current", platformSdkInt: 29, platformSdkCodename: "REL", platformSdkFinal: true, deviceCurrentApiLevelForVendorModules: "28", expectedMinSdkVersion: "28", }, { name: "current final SDK", sdkVersion: "current", platformSdkInt: 29, platformSdkCodename: "Q", platformSdkFinal: false, deviceCurrentApiLevelForVendorModules: "current", expectedMinSdkVersion: "Q", }, { name: "current final SDK", sdkVersion: "current", platformSdkInt: 29, platformSdkCodename: "Q", platformSdkFinal: false, deviceCurrentApiLevelForVendorModules: "28", expectedMinSdkVersion: "28", }, } for _, moduleType := range []string{"android_app", "android_library"} { for _, sdkKind := range []string{"", "system_"} { for _, test := range testCases { t.Run(moduleType+" "+test.name, func(t *testing.T) { bp := fmt.Sprintf(`%s { name: "foo", srcs: ["a.java"], sdk_version: "%s%s", vendor: true, }`, moduleType, sdkKind, test.sdkVersion) config := testAppConfig(nil, bp, nil) config.TestProductVariables.Platform_sdk_version = &test.platformSdkInt config.TestProductVariables.Platform_sdk_codename = &test.platformSdkCodename config.TestProductVariables.Platform_sdk_final = &test.platformSdkFinal config.TestProductVariables.DeviceCurrentApiLevelForVendorModules = &test.deviceCurrentApiLevelForVendorModules config.TestProductVariables.DeviceSystemSdkVersions = []string{"28", "29"} checkSdkVersion(t, config, test.expectedMinSdkVersion) }) } } } } func TestJNIABI(t *testing.T) { ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+` Loading java/sdk.go +28 −0 Original line number Diff line number Diff line Loading @@ -191,6 +191,26 @@ func (s sdkSpec) prebuiltSdkAvailableForUnbundledBuild() bool { return s.kind != sdkPrivate && s.kind != sdkNone && s.kind != sdkCorePlatform } func (s sdkSpec) forVendorPartition(ctx android.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() if currentSdkVersion == "current" { return s } if s.kind == sdkPublic || s.kind == sdkSystem { if s.version.isCurrent() { if i, err := strconv.Atoi(currentSdkVersion); err == nil { version := sdkVersion(i) return sdkSpec{s.kind, version, s.raw} } panic(fmt.Errorf("BOARD_CURRENT_API_LEVEL_FOR_VENDOR_MODULES must be either \"current\" or a number, but was %q", currentSdkVersion)) } } return s } // usePrebuilt determines whether prebuilt SDK should be used for this sdkSpec with the given context. func (s sdkSpec) usePrebuilt(ctx android.EarlyModuleContext) bool { if s.version.isCurrent() { Loading @@ -216,6 +236,10 @@ func (s sdkSpec) effectiveVersion(ctx android.EarlyModuleContext) (sdkVersion, e if !s.valid() { return s.version, fmt.Errorf("invalid sdk version %q", s.raw) } if ctx.DeviceSpecific() || ctx.SocSpecific() { s = s.forVendorPartition(ctx) } if s.version.isNumbered() { return s.version, nil } Loading Loading @@ -330,6 +354,10 @@ func decodeSdkDep(ctx android.EarlyModuleContext, sdkContext sdkContext) sdkDep return sdkDep{} } if ctx.DeviceSpecific() || ctx.SocSpecific() { sdkVersion = sdkVersion.forVendorPartition(ctx) } if !sdkVersion.validateSystemSdk(ctx) { return sdkDep{} } Loading java/testing.go +3 −0 Original line number Diff line number Diff line Loading @@ -44,6 +44,9 @@ func TestConfig(buildDir string, env map[string]string, bp string, fs map[string "prebuilts/sdk/17/public/android.jar": nil, "prebuilts/sdk/17/public/framework.aidl": nil, "prebuilts/sdk/17/system/android.jar": nil, "prebuilts/sdk/28/public/android.jar": nil, "prebuilts/sdk/28/public/framework.aidl": nil, "prebuilts/sdk/28/system/android.jar": nil, "prebuilts/sdk/29/public/android.jar": nil, "prebuilts/sdk/29/public/framework.aidl": nil, "prebuilts/sdk/29/system/android.jar": nil, Loading Loading
android/config.go +5 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import ( var Bool = proptools.Bool var String = proptools.String var StringDefault = proptools.StringDefault const FutureApiLevel = 10000 Loading Loading @@ -958,6 +959,10 @@ func (c *deviceConfig) VndkVersion() string { return String(c.config.productVariables.DeviceVndkVersion) } func (c *deviceConfig) CurrentApiLevelForVendorModules() string { return StringDefault(c.config.productVariables.DeviceCurrentApiLevelForVendorModules, "current") } func (c *deviceConfig) PlatformVndkVersion() string { return String(c.config.productVariables.Platform_vndk_version) } Loading
android/variable.go +8 −7 Original line number Diff line number Diff line Loading @@ -172,6 +172,7 @@ type productVariables struct { DeviceCpuVariant *string `json:",omitempty"` DeviceAbi []string `json:",omitempty"` DeviceVndkVersion *string `json:",omitempty"` DeviceCurrentApiLevelForVendorModules *string `json:",omitempty"` DeviceSystemSdkVersions []string `json:",omitempty"` DeviceSecondaryArch *string `json:",omitempty"` Loading
java/app_test.go +101 −25 Original line number Diff line number Diff line Loading @@ -1038,6 +1038,35 @@ func TestAndroidResources(t *testing.T) { } } func checkSdkVersion(t *testing.T, config android.Config, expectedSdkVersion string) { ctx := testContext() run(t, ctx, config) foo := ctx.ModuleForTests("foo", "android_common") link := foo.Output("package-res.apk") linkFlags := strings.Split(link.Args["flags"], " ") min := android.IndexList("--min-sdk-version", linkFlags) target := android.IndexList("--target-sdk-version", linkFlags) if min == -1 || target == -1 || min == len(linkFlags)-1 || target == len(linkFlags)-1 { t.Fatalf("missing --min-sdk-version or --target-sdk-version in link flags: %q", linkFlags) } gotMinSdkVersion := linkFlags[min+1] gotTargetSdkVersion := linkFlags[target+1] if gotMinSdkVersion != expectedSdkVersion { t.Errorf("incorrect --min-sdk-version, expected %q got %q", expectedSdkVersion, gotMinSdkVersion) } if gotTargetSdkVersion != expectedSdkVersion { t.Errorf("incorrect --target-sdk-version, expected %q got %q", expectedSdkVersion, gotTargetSdkVersion) } } func TestAppSdkVersion(t *testing.T) { testCases := []struct { name string Loading Loading @@ -1107,37 +1136,84 @@ func TestAppSdkVersion(t *testing.T) { config.TestProductVariables.Platform_sdk_version = &test.platformSdkInt config.TestProductVariables.Platform_sdk_codename = &test.platformSdkCodename config.TestProductVariables.Platform_sdk_final = &test.platformSdkFinal checkSdkVersion(t, config, test.expectedMinSdkVersion) ctx := testContext() run(t, ctx, config) foo := ctx.ModuleForTests("foo", "android_common") link := foo.Output("package-res.apk") linkFlags := strings.Split(link.Args["flags"], " ") min := android.IndexList("--min-sdk-version", linkFlags) target := android.IndexList("--target-sdk-version", linkFlags) if min == -1 || target == -1 || min == len(linkFlags)-1 || target == len(linkFlags)-1 { t.Fatalf("missing --min-sdk-version or --target-sdk-version in link flags: %q", linkFlags) }) } } gotMinSdkVersion := linkFlags[min+1] gotTargetSdkVersion := linkFlags[target+1] if gotMinSdkVersion != test.expectedMinSdkVersion { t.Errorf("incorrect --min-sdk-version, expected %q got %q", test.expectedMinSdkVersion, gotMinSdkVersion) } if gotTargetSdkVersion != test.expectedMinSdkVersion { t.Errorf("incorrect --target-sdk-version, expected %q got %q", test.expectedMinSdkVersion, gotTargetSdkVersion) func TestVendorAppSdkVersion(t *testing.T) { testCases := []struct { name string sdkVersion string platformSdkInt int platformSdkCodename string platformSdkFinal bool deviceCurrentApiLevelForVendorModules string expectedMinSdkVersion string }{ { name: "current final SDK", sdkVersion: "current", platformSdkInt: 29, platformSdkCodename: "REL", platformSdkFinal: true, deviceCurrentApiLevelForVendorModules: "29", expectedMinSdkVersion: "29", }, { name: "current final SDK", sdkVersion: "current", platformSdkInt: 29, platformSdkCodename: "REL", platformSdkFinal: true, deviceCurrentApiLevelForVendorModules: "28", expectedMinSdkVersion: "28", }, { name: "current final SDK", sdkVersion: "current", platformSdkInt: 29, platformSdkCodename: "Q", platformSdkFinal: false, deviceCurrentApiLevelForVendorModules: "current", expectedMinSdkVersion: "Q", }, { name: "current final SDK", sdkVersion: "current", platformSdkInt: 29, platformSdkCodename: "Q", platformSdkFinal: false, deviceCurrentApiLevelForVendorModules: "28", expectedMinSdkVersion: "28", }, } for _, moduleType := range []string{"android_app", "android_library"} { for _, sdkKind := range []string{"", "system_"} { for _, test := range testCases { t.Run(moduleType+" "+test.name, func(t *testing.T) { bp := fmt.Sprintf(`%s { name: "foo", srcs: ["a.java"], sdk_version: "%s%s", vendor: true, }`, moduleType, sdkKind, test.sdkVersion) config := testAppConfig(nil, bp, nil) config.TestProductVariables.Platform_sdk_version = &test.platformSdkInt config.TestProductVariables.Platform_sdk_codename = &test.platformSdkCodename config.TestProductVariables.Platform_sdk_final = &test.platformSdkFinal config.TestProductVariables.DeviceCurrentApiLevelForVendorModules = &test.deviceCurrentApiLevelForVendorModules config.TestProductVariables.DeviceSystemSdkVersions = []string{"28", "29"} checkSdkVersion(t, config, test.expectedMinSdkVersion) }) } } } } func TestJNIABI(t *testing.T) { ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+` Loading
java/sdk.go +28 −0 Original line number Diff line number Diff line Loading @@ -191,6 +191,26 @@ func (s sdkSpec) prebuiltSdkAvailableForUnbundledBuild() bool { return s.kind != sdkPrivate && s.kind != sdkNone && s.kind != sdkCorePlatform } func (s sdkSpec) forVendorPartition(ctx android.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() if currentSdkVersion == "current" { return s } if s.kind == sdkPublic || s.kind == sdkSystem { if s.version.isCurrent() { if i, err := strconv.Atoi(currentSdkVersion); err == nil { version := sdkVersion(i) return sdkSpec{s.kind, version, s.raw} } panic(fmt.Errorf("BOARD_CURRENT_API_LEVEL_FOR_VENDOR_MODULES must be either \"current\" or a number, but was %q", currentSdkVersion)) } } return s } // usePrebuilt determines whether prebuilt SDK should be used for this sdkSpec with the given context. func (s sdkSpec) usePrebuilt(ctx android.EarlyModuleContext) bool { if s.version.isCurrent() { Loading @@ -216,6 +236,10 @@ func (s sdkSpec) effectiveVersion(ctx android.EarlyModuleContext) (sdkVersion, e if !s.valid() { return s.version, fmt.Errorf("invalid sdk version %q", s.raw) } if ctx.DeviceSpecific() || ctx.SocSpecific() { s = s.forVendorPartition(ctx) } if s.version.isNumbered() { return s.version, nil } Loading Loading @@ -330,6 +354,10 @@ func decodeSdkDep(ctx android.EarlyModuleContext, sdkContext sdkContext) sdkDep return sdkDep{} } if ctx.DeviceSpecific() || ctx.SocSpecific() { sdkVersion = sdkVersion.forVendorPartition(ctx) } if !sdkVersion.validateSystemSdk(ctx) { return sdkDep{} } Loading
java/testing.go +3 −0 Original line number Diff line number Diff line Loading @@ -44,6 +44,9 @@ func TestConfig(buildDir string, env map[string]string, bp string, fs map[string "prebuilts/sdk/17/public/android.jar": nil, "prebuilts/sdk/17/public/framework.aidl": nil, "prebuilts/sdk/17/system/android.jar": nil, "prebuilts/sdk/28/public/android.jar": nil, "prebuilts/sdk/28/public/framework.aidl": nil, "prebuilts/sdk/28/system/android.jar": nil, "prebuilts/sdk/29/public/android.jar": nil, "prebuilts/sdk/29/public/framework.aidl": nil, "prebuilts/sdk/29/system/android.jar": nil, Loading