diff --git a/apex/apex_test.go b/apex/apex_test.go index 0b67ef577..277fa1c7e 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -1782,6 +1782,31 @@ func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) { min_sdk_version: "30", } `) + + testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, ` + apex { + name: "myapex", + key: "myapex.key", + native_shared_libs: ["libfoo.ffi"], + min_sdk_version: "29", + } + + apex_key { + name: "myapex.key", + public_key: "testkey.avbpubkey", + private_key: "testkey.pem", + } + + rust_ffi_shared { + name: "libfoo.ffi", + srcs: ["foo.rs"], + crate_name: "foo", + apex_available: [ + "myapex", + ], + min_sdk_version: "30", + } + `) } func TestApexMinSdkVersion_Okay(t *testing.T) { diff --git a/cc/testing.go b/cc/testing.go index 95a93a0ed..3764fad99 100644 --- a/cc/testing.go +++ b/cc/testing.go @@ -334,7 +334,7 @@ func GatherRequiredDepsForTest(oses ...android.OsType) string { }, apex_available: [ "//apex_available:platform", - "myapex" + "//apex_available:anyapex", ], } cc_library { diff --git a/rust/rust.go b/rust/rust.go index 38caad373..1ceedf397 100644 --- a/rust/rust.go +++ b/rust/rust.go @@ -67,6 +67,9 @@ type BaseProperties struct { SubName string `blueprint:"mutated"` + // Minimum sdk version that the artifact should support when it runs as part of mainline modules(APEX). + Min_sdk_version *string + PreventInstall bool HideFromMake bool } @@ -1076,7 +1079,29 @@ func (mod *Module) HostToolPath() android.OptionalPath { var _ android.ApexModule = (*Module)(nil) +func (mod *Module) minSdkVersion() string { + return String(mod.Properties.Min_sdk_version) +} + func (mod *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext, sdkVersion android.ApiLevel) error { + minSdkVersion := mod.minSdkVersion() + if minSdkVersion == "apex_inherit" { + return nil + } + if minSdkVersion == "" { + return fmt.Errorf("min_sdk_version is not specificed") + } + + // Not using nativeApiLevelFromUser because the context here is not + // necessarily a native context. + ver, err := android.ApiLevelFromUser(ctx, minSdkVersion) + if err != nil { + return err + } + + if ver.GreaterThan(sdkVersion) { + return fmt.Errorf("newer SDK(%v)", ver) + } return nil } diff --git a/rust/testing.go b/rust/testing.go index a8496d983..8648dc39a 100644 --- a/rust/testing.go +++ b/rust/testing.go @@ -78,6 +78,7 @@ func GatherRequiredDepsForTest() string { nocrt: true, system_shared_libs: [], apex_available: ["//apex_available:platform", "//apex_available:anyapex"], + min_sdk_version: "29", } cc_library { name: "libprotobuf-cpp-full", @@ -95,6 +96,7 @@ func GatherRequiredDepsForTest() string { native_coverage: false, sysroot: true, apex_available: ["//apex_available:platform", "//apex_available:anyapex"], + min_sdk_version: "29", } rust_library { name: "libtest", @@ -105,6 +107,7 @@ func GatherRequiredDepsForTest() string { native_coverage: false, sysroot: true, apex_available: ["//apex_available:platform", "//apex_available:anyapex"], + min_sdk_version: "29", } rust_library { name: "libprotobuf",