Merge changes I08ec0b44,I79b5a1fc,I469d6558
* changes: Allow java_sdk_library in an APEX to have higher min_sdk_version. Perform CheckMinSdkVersion for java_sdk_library. Add MinSdkVersion(ctx) method to ModuleWithMinSdkVersionCheck interface.
This commit is contained in:
commit
6abfb33784
6 changed files with 305 additions and 5 deletions
|
@ -913,6 +913,7 @@ type WalkPayloadDepsFunc func(ctx ModuleContext, do PayloadDepsCallback)
|
|||
// ModuleWithMinSdkVersionCheck represents a module that implements min_sdk_version checks
|
||||
type ModuleWithMinSdkVersionCheck interface {
|
||||
Module
|
||||
MinSdkVersion(ctx EarlyModuleContext) SdkSpec
|
||||
CheckMinSdkVersion(ctx ModuleContext)
|
||||
}
|
||||
|
||||
|
@ -944,6 +945,14 @@ func CheckMinSdkVersion(ctx ModuleContext, minSdkVersion ApiLevel, walk WalkPayl
|
|||
if am, ok := from.(DepIsInSameApex); ok && !am.DepIsInSameApex(ctx, to) {
|
||||
return false
|
||||
}
|
||||
if m, ok := to.(ModuleWithMinSdkVersionCheck); ok {
|
||||
// This dependency performs its own min_sdk_version check, just make sure it sets min_sdk_version
|
||||
// to trigger the check.
|
||||
if !m.MinSdkVersion(ctx).Specified() {
|
||||
ctx.OtherModuleErrorf(m, "must set min_sdk_version")
|
||||
}
|
||||
return false
|
||||
}
|
||||
if err := to.ShouldSupportSdkVersion(ctx, minSdkVersion); err != nil {
|
||||
toName := ctx.OtherModuleName(to)
|
||||
if ver, ok := minSdkVersionAllowlist[toName]; !ok || ver.GreaterThan(minSdkVersion) {
|
||||
|
|
12
apex/apex.go
12
apex/apex.go
|
@ -2346,6 +2346,8 @@ func overrideApexFactory() android.Module {
|
|||
//
|
||||
// TODO(jiyong): move these checks to a separate go file.
|
||||
|
||||
var _ android.ModuleWithMinSdkVersionCheck = (*apexBundle)(nil)
|
||||
|
||||
// Entures that min_sdk_version of the included modules are equal or less than the min_sdk_version
|
||||
// of this apexBundle.
|
||||
func (a *apexBundle) CheckMinSdkVersion(ctx android.ModuleContext) {
|
||||
|
@ -2357,7 +2359,15 @@ func (a *apexBundle) CheckMinSdkVersion(ctx android.ModuleContext) {
|
|||
android.CheckMinSdkVersion(ctx, minSdkVersion, a.WalkPayloadDeps)
|
||||
}
|
||||
|
||||
func (a *apexBundle) minSdkVersion(ctx android.BaseModuleContext) android.ApiLevel {
|
||||
func (a *apexBundle) MinSdkVersion(ctx android.EarlyModuleContext) android.SdkSpec {
|
||||
return android.SdkSpec{
|
||||
Kind: android.SdkNone,
|
||||
ApiLevel: a.minSdkVersion(ctx),
|
||||
Raw: String(a.properties.Min_sdk_version),
|
||||
}
|
||||
}
|
||||
|
||||
func (a *apexBundle) minSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel {
|
||||
ver := proptools.String(a.properties.Min_sdk_version)
|
||||
if ver == "" {
|
||||
return android.NoneApiLevel
|
||||
|
|
|
@ -8410,6 +8410,184 @@ func TestAndroidMk_RequiredModules(t *testing.T) {
|
|||
ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherapex")
|
||||
}
|
||||
|
||||
func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
|
||||
preparer := android.GroupFixturePreparers(
|
||||
PrepareForTestWithApexBuildComponents,
|
||||
prepareForTestWithMyapex,
|
||||
java.PrepareForTestWithJavaSdkLibraryFiles,
|
||||
java.PrepareForTestWithJavaDefaultModules,
|
||||
android.PrepareForTestWithAndroidBuildComponents,
|
||||
dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
|
||||
dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
|
||||
)
|
||||
|
||||
// Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
|
||||
t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
|
||||
preparer.RunTestWithBp(t, `
|
||||
apex {
|
||||
name: "myapex",
|
||||
key: "myapex.key",
|
||||
bootclasspath_fragments: ["mybootclasspathfragment"],
|
||||
min_sdk_version: "30",
|
||||
updatable: false,
|
||||
}
|
||||
|
||||
apex_key {
|
||||
name: "myapex.key",
|
||||
public_key: "testkey.avbpubkey",
|
||||
private_key: "testkey.pem",
|
||||
}
|
||||
|
||||
bootclasspath_fragment {
|
||||
name: "mybootclasspathfragment",
|
||||
contents: ["mybootclasspathlib"],
|
||||
apex_available: ["myapex"],
|
||||
}
|
||||
|
||||
java_sdk_library {
|
||||
name: "mybootclasspathlib",
|
||||
srcs: ["mybootclasspathlib.java"],
|
||||
apex_available: ["myapex"],
|
||||
compile_dex: true,
|
||||
unsafe_ignore_missing_latest_api: true,
|
||||
min_sdk_version: "31",
|
||||
static_libs: ["util"],
|
||||
}
|
||||
|
||||
java_library {
|
||||
name: "util",
|
||||
srcs: ["a.java"],
|
||||
apex_available: ["myapex"],
|
||||
min_sdk_version: "31",
|
||||
static_libs: ["another_util"],
|
||||
}
|
||||
|
||||
java_library {
|
||||
name: "another_util",
|
||||
srcs: ["a.java"],
|
||||
min_sdk_version: "31",
|
||||
apex_available: ["myapex"],
|
||||
}
|
||||
`)
|
||||
})
|
||||
|
||||
// Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
|
||||
t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
|
||||
preparer.RunTestWithBp(t, `
|
||||
apex {
|
||||
name: "myapex",
|
||||
key: "myapex.key",
|
||||
systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
|
||||
min_sdk_version: "30",
|
||||
updatable: false,
|
||||
}
|
||||
|
||||
apex_key {
|
||||
name: "myapex.key",
|
||||
public_key: "testkey.avbpubkey",
|
||||
private_key: "testkey.pem",
|
||||
}
|
||||
|
||||
systemserverclasspath_fragment {
|
||||
name: "mysystemserverclasspathfragment",
|
||||
contents: ["mysystemserverclasspathlib"],
|
||||
apex_available: ["myapex"],
|
||||
}
|
||||
|
||||
java_sdk_library {
|
||||
name: "mysystemserverclasspathlib",
|
||||
srcs: ["mysystemserverclasspathlib.java"],
|
||||
apex_available: ["myapex"],
|
||||
compile_dex: true,
|
||||
min_sdk_version: "32",
|
||||
unsafe_ignore_missing_latest_api: true,
|
||||
static_libs: ["util"],
|
||||
}
|
||||
|
||||
java_library {
|
||||
name: "util",
|
||||
srcs: ["a.java"],
|
||||
apex_available: ["myapex"],
|
||||
min_sdk_version: "31",
|
||||
static_libs: ["another_util"],
|
||||
}
|
||||
|
||||
java_library {
|
||||
name: "another_util",
|
||||
srcs: ["a.java"],
|
||||
min_sdk_version: "31",
|
||||
apex_available: ["myapex"],
|
||||
}
|
||||
`)
|
||||
})
|
||||
|
||||
t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
|
||||
preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
|
||||
RunTestWithBp(t, `
|
||||
apex {
|
||||
name: "myapex",
|
||||
key: "myapex.key",
|
||||
bootclasspath_fragments: ["mybootclasspathfragment"],
|
||||
min_sdk_version: "30",
|
||||
updatable: false,
|
||||
}
|
||||
|
||||
apex_key {
|
||||
name: "myapex.key",
|
||||
public_key: "testkey.avbpubkey",
|
||||
private_key: "testkey.pem",
|
||||
}
|
||||
|
||||
bootclasspath_fragment {
|
||||
name: "mybootclasspathfragment",
|
||||
contents: ["mybootclasspathlib"],
|
||||
apex_available: ["myapex"],
|
||||
}
|
||||
|
||||
java_sdk_library {
|
||||
name: "mybootclasspathlib",
|
||||
srcs: ["mybootclasspathlib.java"],
|
||||
apex_available: ["myapex"],
|
||||
compile_dex: true,
|
||||
unsafe_ignore_missing_latest_api: true,
|
||||
}
|
||||
`)
|
||||
})
|
||||
|
||||
t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
|
||||
preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
|
||||
RunTestWithBp(t, `
|
||||
apex {
|
||||
name: "myapex",
|
||||
key: "myapex.key",
|
||||
systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
|
||||
min_sdk_version: "30",
|
||||
updatable: false,
|
||||
}
|
||||
|
||||
apex_key {
|
||||
name: "myapex.key",
|
||||
public_key: "testkey.avbpubkey",
|
||||
private_key: "testkey.pem",
|
||||
}
|
||||
|
||||
systemserverclasspath_fragment {
|
||||
name: "mysystemserverclasspathfragment",
|
||||
contents: ["mysystemserverclasspathlib"],
|
||||
apex_available: ["myapex"],
|
||||
}
|
||||
|
||||
java_sdk_library {
|
||||
name: "mysystemserverclasspathlib",
|
||||
srcs: ["mysystemserverclasspathlib.java"],
|
||||
apex_available: ["myapex"],
|
||||
compile_dex: true,
|
||||
unsafe_ignore_missing_latest_api: true,
|
||||
}
|
||||
`)
|
||||
})
|
||||
}
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
os.Exit(m.Run())
|
||||
}
|
||||
|
|
|
@ -1643,8 +1643,7 @@ func (j *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Modu
|
|||
}
|
||||
|
||||
// Implements android.ApexModule
|
||||
func (j *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext,
|
||||
sdkVersion android.ApiLevel) error {
|
||||
func (j *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext, sdkVersion android.ApiLevel) error {
|
||||
sdkSpec := j.MinSdkVersion(ctx)
|
||||
if !sdkSpec.Specified() {
|
||||
return fmt.Errorf("min_sdk_version is not specified")
|
||||
|
|
|
@ -1129,6 +1129,22 @@ func (module *SdkLibrary) getGeneratedApiScopes(ctx android.EarlyModuleContext)
|
|||
return generatedScopes
|
||||
}
|
||||
|
||||
var _ android.ModuleWithMinSdkVersionCheck = (*SdkLibrary)(nil)
|
||||
|
||||
func (module *SdkLibrary) CheckMinSdkVersion(ctx android.ModuleContext) {
|
||||
android.CheckMinSdkVersion(ctx, module.MinSdkVersion(ctx).ApiLevel, func(c android.ModuleContext, do android.PayloadDepsCallback) {
|
||||
ctx.WalkDeps(func(child android.Module, parent android.Module) bool {
|
||||
isExternal := !module.depIsInSameApex(ctx, child)
|
||||
if am, ok := child.(android.ApexModule); ok {
|
||||
if !do(ctx, parent, am, isExternal) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return !isExternal
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
type sdkLibraryComponentTag struct {
|
||||
blueprint.BaseDependencyTag
|
||||
name string
|
||||
|
@ -1214,6 +1230,10 @@ func (module *SdkLibrary) OutputFiles(tag string) (android.Paths, error) {
|
|||
}
|
||||
|
||||
func (module *SdkLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
||||
if proptools.String(module.deviceProperties.Min_sdk_version) != "" {
|
||||
module.CheckMinSdkVersion(ctx)
|
||||
}
|
||||
|
||||
module.generateCommonBuildActions(ctx)
|
||||
|
||||
// Only build an implementation library if required.
|
||||
|
@ -2605,12 +2625,12 @@ func (module *sdkLibraryXml) GenerateAndroidBuildActions(ctx android.ModuleConte
|
|||
|
||||
func (module *sdkLibraryXml) AndroidMkEntries() []android.AndroidMkEntries {
|
||||
if module.hideApexVariantFromMake {
|
||||
return []android.AndroidMkEntries{android.AndroidMkEntries{
|
||||
return []android.AndroidMkEntries{{
|
||||
Disabled: true,
|
||||
}}
|
||||
}
|
||||
|
||||
return []android.AndroidMkEntries{android.AndroidMkEntries{
|
||||
return []android.AndroidMkEntries{{
|
||||
Class: "ETC",
|
||||
OutputFile: android.OptionalPathForPath(module.outputFilePath),
|
||||
ExtraEntries: []android.AndroidMkExtraEntriesFunc{
|
||||
|
|
|
@ -1140,3 +1140,87 @@ func TestJavaSdkLibraryDist(t *testing.T) {
|
|||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestSdkLibrary_CheckMinSdkVersion(t *testing.T) {
|
||||
preparer := android.GroupFixturePreparers(
|
||||
PrepareForTestWithJavaBuildComponents,
|
||||
PrepareForTestWithJavaDefaultModules,
|
||||
PrepareForTestWithJavaSdkLibraryFiles,
|
||||
)
|
||||
|
||||
preparer.RunTestWithBp(t, `
|
||||
java_sdk_library {
|
||||
name: "sdklib",
|
||||
srcs: ["a.java"],
|
||||
static_libs: ["util"],
|
||||
min_sdk_version: "30",
|
||||
unsafe_ignore_missing_latest_api: true,
|
||||
}
|
||||
|
||||
java_library {
|
||||
name: "util",
|
||||
srcs: ["a.java"],
|
||||
min_sdk_version: "30",
|
||||
}
|
||||
`)
|
||||
|
||||
preparer.
|
||||
RunTestWithBp(t, `
|
||||
java_sdk_library {
|
||||
name: "sdklib",
|
||||
srcs: ["a.java"],
|
||||
libs: ["util"],
|
||||
impl_only_libs: ["util"],
|
||||
stub_only_libs: ["util"],
|
||||
stub_only_static_libs: ["util"],
|
||||
min_sdk_version: "30",
|
||||
unsafe_ignore_missing_latest_api: true,
|
||||
}
|
||||
|
||||
java_library {
|
||||
name: "util",
|
||||
srcs: ["a.java"],
|
||||
}
|
||||
`)
|
||||
|
||||
preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "util".*should support min_sdk_version\(30\)`)).
|
||||
RunTestWithBp(t, `
|
||||
java_sdk_library {
|
||||
name: "sdklib",
|
||||
srcs: ["a.java"],
|
||||
static_libs: ["util"],
|
||||
min_sdk_version: "30",
|
||||
unsafe_ignore_missing_latest_api: true,
|
||||
}
|
||||
|
||||
java_library {
|
||||
name: "util",
|
||||
srcs: ["a.java"],
|
||||
min_sdk_version: "31",
|
||||
}
|
||||
`)
|
||||
|
||||
preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "another_util".*should support min_sdk_version\(30\)`)).
|
||||
RunTestWithBp(t, `
|
||||
java_sdk_library {
|
||||
name: "sdklib",
|
||||
srcs: ["a.java"],
|
||||
static_libs: ["util"],
|
||||
min_sdk_version: "30",
|
||||
unsafe_ignore_missing_latest_api: true,
|
||||
}
|
||||
|
||||
java_library {
|
||||
name: "util",
|
||||
srcs: ["a.java"],
|
||||
static_libs: ["another_util"],
|
||||
min_sdk_version: "30",
|
||||
}
|
||||
|
||||
java_library {
|
||||
name: "another_util",
|
||||
srcs: ["a.java"],
|
||||
min_sdk_version: "31",
|
||||
}
|
||||
`)
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue