Merge changes Ifbe123d1,Ie2e738a6 into main am: 8298134503

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

Change-Id: I007f8627939a5c65231fcfe7796e869d6a3db50c
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Treehugger Robot
2024-05-20 18:02:51 +00:00
committed by Automerger Merge Worker
9 changed files with 164 additions and 93 deletions

View File

@@ -37,11 +37,7 @@ var (
// Accessible via `ctx.Provider(android.ApexInfoProvider).(android.ApexInfo)`
type ApexInfo struct {
// Name of the apex variation that this module (i.e. the apex variant of the module) is
// mutated into, or "" for a platform (i.e. non-APEX) variant. Note that this name and the
// Soong module name of the APEX can be different. That happens when there is
// `override_apex` that overrides `apex`. In that case, both Soong modules have the same
// apex variation name which usually is `com.android.foo`. This name is also the `name`
// in the path `/apex/<name>` where this apex is activated on at runtime.
// mutated into, or "" for a platform (i.e. non-APEX) variant.
//
// Also note that a module can be included in multiple APEXes, in which case, the module is
// mutated into one or more variants, each of which is for an APEX. The variants then can

View File

@@ -137,10 +137,6 @@ type apexBundleProperties struct {
// Rust binaries with prefer_rlib:true add unnecessary dependencies.
Unwanted_transitive_deps []string
// The minimum SDK version that this APEX must support at minimum. This is usually set to
// the SDK version that the APEX was first introduced.
Min_sdk_version *string
// Whether this APEX is considered updatable or not. When set to true, this will enforce
// additional rules for making sure that the APEX is truly updatable. To be updatable,
// min_sdk_version should be set as well. This will also disable the size optimizations like
@@ -388,6 +384,10 @@ type overridableProperties struct {
// Trim against a specific Dynamic Common Lib APEX
Trim_against *string
// The minimum SDK version that this APEX must support at minimum. This is usually set to
// the SDK version that the APEX was first introduced.
Min_sdk_version *string
}
type apexBundle struct {
@@ -1035,6 +1035,11 @@ func (a *apexBundle) ApexInfoMutator(mctx android.TopDownMutatorContext) {
// be built for this apexBundle.
apexVariationName := mctx.ModuleName() // could be com.android.foo
if overridable, ok := mctx.Module().(android.OverridableModule); ok && overridable.GetOverriddenBy() != "" {
// use the overridden name com.mycompany.android.foo
apexVariationName = overridable.GetOverriddenBy()
}
a.properties.ApexVariationName = apexVariationName
testApexes := []string{}
if a.testApex {
@@ -1099,7 +1104,7 @@ func apexStrictUpdatibilityLintMutator(mctx android.TopDownMutatorContext) {
if !mctx.Module().Enabled(mctx) {
return
}
if apex, ok := mctx.Module().(*apexBundle); ok && apex.checkStrictUpdatabilityLinting() {
if apex, ok := mctx.Module().(*apexBundle); ok && apex.checkStrictUpdatabilityLinting(mctx) {
mctx.WalkDeps(func(child, parent android.Module) bool {
// b/208656169 Do not propagate strict updatability linting to libcore/
// These libs are available on the classpath during compilation
@@ -1193,8 +1198,9 @@ var (
}
)
func (a *apexBundle) checkStrictUpdatabilityLinting() bool {
return a.Updatable() && !android.InList(a.ApexVariationName(), skipStrictUpdatabilityLintAllowlist)
func (a *apexBundle) checkStrictUpdatabilityLinting(mctx android.TopDownMutatorContext) bool {
// The allowlist contains the base apex name, so use that instead of the ApexVariationName
return a.Updatable() && !android.InList(mctx.ModuleName(), skipStrictUpdatabilityLintAllowlist)
}
// apexUniqueVariationsMutator checks if any dependencies use unique apex variations. If so, use
@@ -1295,13 +1301,12 @@ type apexTransitionMutator struct{}
func (a *apexTransitionMutator) Split(ctx android.BaseModuleContext) []string {
// apexBundle itself is mutated so that it and its dependencies have the same apex variant.
if ai, ok := ctx.Module().(ApexInfoMutator); ok && apexModuleTypeRequiresVariant(ai) {
return []string{ai.ApexVariationName()}
} else if o, ok := ctx.Module().(*OverrideApex); ok {
apexBundleName := o.GetOverriddenModuleName()
if apexBundleName == "" {
ctx.ModuleErrorf("base property is not set")
if overridable, ok := ctx.Module().(android.OverridableModule); ok && overridable.GetOverriddenBy() != "" {
return []string{overridable.GetOverriddenBy()}
}
return []string{apexBundleName}
return []string{ai.ApexVariationName()}
} else if _, ok := ctx.Module().(*OverrideApex); ok {
return []string{ctx.ModuleName()}
}
return []string{""}
}
@@ -1314,9 +1319,12 @@ func (a *apexTransitionMutator) IncomingTransition(ctx android.IncomingTransitio
if am, ok := ctx.Module().(android.ApexModule); ok && am.CanHaveApexVariants() {
return android.IncomingApexTransition(ctx, incomingVariation)
} else if ai, ok := ctx.Module().(ApexInfoMutator); ok {
if overridable, ok := ctx.Module().(android.OverridableModule); ok && overridable.GetOverriddenBy() != "" {
return overridable.GetOverriddenBy()
}
return ai.ApexVariationName()
} else if o, ok := ctx.Module().(*OverrideApex); ok {
return o.GetOverriddenModuleName()
} else if _, ok := ctx.Module().(*OverrideApex); ok {
return ctx.Module().Name()
}
return ""
@@ -2652,7 +2660,7 @@ func (a *apexBundle) minSdkVersionValue(ctx android.EarlyModuleContext) string {
// Only override the minSdkVersion value on Apexes which already specify
// a min_sdk_version (it's optional for non-updatable apexes), and that its
// min_sdk_version value is lower than the one to override with.
minApiLevel := android.MinSdkVersionFromValue(ctx, proptools.String(a.properties.Min_sdk_version))
minApiLevel := android.MinSdkVersionFromValue(ctx, proptools.String(a.overridableProperties.Min_sdk_version))
if minApiLevel.IsNone() {
return ""
}

View File

@@ -6476,7 +6476,7 @@ func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
}
overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_bar").Rule("apexManifestRule")
overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
@@ -6856,7 +6856,7 @@ func TestOverrideApex(t *testing.T) {
`, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Module().(android.OverridableModule)
overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
if originalVariant.GetOverriddenBy() != "" {
t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
}
@@ -6864,7 +6864,7 @@ func TestOverrideApex(t *testing.T) {
t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
}
module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex")
module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
apexRule := module.Rule("apexRule")
copyCmds := apexRule.Args["copy_commands"]
@@ -8956,7 +8956,7 @@ func TestAllowedFiles(t *testing.T) {
t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
}
rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Rule("diffApexContentRule")
rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
}
@@ -11294,7 +11294,7 @@ func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
variation := func(moduleName string) string {
ret := "android_common_com.android.foo"
if moduleName == "com.google.android.foo" {
ret = "android_common_com.google.android.foo_com.android.foo"
ret = "android_common_com.google.android.foo_com.google.android.foo"
}
return ret
}
@@ -11598,3 +11598,79 @@ func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
}
func TestApexMinSdkVersionOverride(t *testing.T) {
checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
args := module.Rule("apexRule").Args
optFlags := args["opt_flags"]
if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
}
}
checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
t.Helper()
found := false
ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
if dep == wantDep {
found = true
}
})
if !found {
t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
}
}
ctx := testApex(t, `
apex {
name: "com.android.apex30",
min_sdk_version: "30",
key: "apex30.key",
java_libs: ["javalib"],
}
java_library {
name: "javalib",
srcs: ["A.java"],
apex_available: ["com.android.apex30"],
min_sdk_version: "30",
sdk_version: "current",
}
override_apex {
name: "com.mycompany.android.apex30",
base: "com.android.apex30",
}
override_apex {
name: "com.mycompany.android.apex31",
base: "com.android.apex30",
min_sdk_version: "31",
}
apex_key {
name: "apex30.key",
public_key: "testkey.avbpubkey",
private_key: "testkey.pem",
}
`, android.FixtureMergeMockFs(android.MockFS{
"system/sepolicy/apex/com.android.apex30-file_contexts": nil,
}),
)
baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
checkMinSdkVersion(t, baseModule, "30")
// Override module, but uses same min_sdk_version
overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
// Override module, uses different min_sdk_version
overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
}

View File

@@ -338,23 +338,12 @@ func (a *AndroidApp) GenerateAndroidBuildActions(ctx android.ModuleContext) {
a.generateJavaUsedByApex(ctx)
}
func (a *AndroidApp) MinSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel {
defaultMinSdkVersion := a.Module.MinSdkVersion(ctx)
if proptools.Bool(a.appProperties.Updatable) {
overrideApiLevel := android.MinSdkVersionFromValue(ctx, ctx.DeviceConfig().ApexGlobalMinSdkVersionOverride())
if !overrideApiLevel.IsNone() && overrideApiLevel.CompareTo(defaultMinSdkVersion) > 0 {
return overrideApiLevel
}
}
return defaultMinSdkVersion
}
func (a *AndroidApp) checkAppSdkVersions(ctx android.ModuleContext) {
if a.Updatable() {
if !a.SdkVersion(ctx).Stable() {
ctx.PropertyErrorf("sdk_version", "Updatable apps must use stable SDKs, found %v", a.SdkVersion(ctx))
}
if String(a.deviceProperties.Min_sdk_version) == "" {
if String(a.overridableProperties.Min_sdk_version) == "" {
ctx.PropertyErrorf("updatable", "updatable apps must set min_sdk_version.")
}

View File

@@ -4322,52 +4322,6 @@ func TestPrivappAllowlistAndroidMk(t *testing.T) {
)
}
func TestApexGlobalMinSdkVersionOverride(t *testing.T) {
result := android.GroupFixturePreparers(
PrepareForTestWithJavaDefaultModules,
android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
variables.ApexGlobalMinSdkVersionOverride = proptools.StringPtr("Tiramisu")
}),
).RunTestWithBp(t, `
android_app {
name: "com.android.bar",
srcs: ["a.java"],
sdk_version: "current",
}
android_app {
name: "com.android.foo",
srcs: ["a.java"],
sdk_version: "current",
min_sdk_version: "S",
updatable: true,
}
override_android_app {
name: "com.android.go.foo",
base: "com.android.foo",
}
`)
foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer")
fooOverride := result.ModuleForTests("com.android.foo", "android_common_com.android.go.foo").Rule("manifestFixer")
bar := result.ModuleForTests("com.android.bar", "android_common").Rule("manifestFixer")
android.AssertStringDoesContain(t,
"expected manifest fixer to set com.android.bar minSdkVersion to S",
bar.BuildParams.Args["args"],
"--minSdkVersion S",
)
android.AssertStringDoesContain(t,
"com.android.foo: expected manifest fixer to set minSdkVersion to T",
foo.BuildParams.Args["args"],
"--minSdkVersion T",
)
android.AssertStringDoesContain(t,
"com.android.go.foo: expected manifest fixer to set minSdkVersion to T",
fooOverride.BuildParams.Args["args"],
"--minSdkVersion T",
)
}
func TestAppFlagsPackages(t *testing.T) {
ctx := testApp(t, `
android_app {
@@ -4492,3 +4446,36 @@ func TestAppStem(t *testing.T) {
t.Errorf("Module output does not contain expected apk %s", "foo-new.apk")
}
}
func TestAppMinSdkVersionOverride(t *testing.T) {
result := android.GroupFixturePreparers(
PrepareForTestWithJavaDefaultModules,
).RunTestWithBp(t, `
android_app {
name: "com.android.foo",
srcs: ["a.java"],
sdk_version: "current",
min_sdk_version: "31",
updatable: true,
}
override_android_app {
name: "com.android.go.foo",
base: "com.android.foo",
min_sdk_version: "33",
}
`)
foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer")
fooOverride := result.ModuleForTests("com.android.foo", "android_common_com.android.go.foo").Rule("manifestFixer")
android.AssertStringDoesContain(t,
"com.android.foo: expected manifest fixer to set minSdkVersion to T",
foo.BuildParams.Args["args"],
"--minSdkVersion 31",
)
android.AssertStringDoesContain(t,
"com.android.go.foo: expected manifest fixer to set minSdkVersion to T",
fooOverride.BuildParams.Args["args"],
"--minSdkVersion 33",
)
}

View File

@@ -229,10 +229,6 @@ type DeviceProperties struct {
// If the SDK kind is empty, it will be set to public.
Sdk_version *string
// if not blank, set the minimum version of the sdk that the compiled artifacts will run against.
// Defaults to sdk_version if not set. See sdk_version for possible values.
Min_sdk_version *string
// if not blank, set the maximum version of the sdk that the compiled artifacts will run against.
// Defaults to empty string "". See sdk_version for possible values.
Max_sdk_version *string
@@ -312,6 +308,10 @@ type OverridableProperties struct {
// Otherwise, both the overridden and the overriding modules will have the same output name, which
// can cause the duplicate output error.
Stem *string
// if not blank, set the minimum version of the sdk that the compiled artifacts will run against.
// Defaults to sdk_version if not set. See sdk_version for possible values.
Min_sdk_version *string
}
// Functionality common to Module and Import
@@ -738,8 +738,8 @@ func (j *Module) SystemModules() string {
}
func (j *Module) MinSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel {
if j.deviceProperties.Min_sdk_version != nil {
return android.ApiLevelFrom(ctx, *j.deviceProperties.Min_sdk_version)
if j.overridableProperties.Min_sdk_version != nil {
return android.ApiLevelFrom(ctx, *j.overridableProperties.Min_sdk_version)
}
return j.SdkVersion(ctx).ApiLevel
}

View File

@@ -262,6 +262,20 @@ func (d *dexpreopter) dexpreoptDisabled(ctx android.BaseModuleContext, libName s
if !isApexSystemServerJar {
return true
}
ai, _ := android.ModuleProvider(ctx, android.ApexInfoProvider)
allApexInfos := []android.ApexInfo{}
if allApexInfosProvider, ok := android.ModuleProvider(ctx, android.AllApexInfoProvider); ok {
allApexInfos = allApexInfosProvider.ApexInfos
}
if len(allApexInfos) > 0 && !ai.MinSdkVersion.EqualTo(allApexInfos[0].MinSdkVersion) {
// Apex system server jars are dexpreopted and installed on to the system image.
// Since we can have BigAndroid and Go variants of system server jar providing apexes,
// and these two variants can have different min_sdk_versions, hide one of the apex variants
// from make to prevent collisions.
//
// Unlike cc, min_sdk_version does not have an effect on the build actions of java libraries.
ctx.Module().MakeUninstallable()
}
} else {
// Don't preopt the platform variant of an APEX system server jar to avoid conflicts.
if isApexSystemServerJar {
@@ -502,7 +516,7 @@ func (d *dexpreopter) dexpreopt(ctx android.ModuleContext, libName string, dexJa
// Prebuilts are active, do not copy the dexpreopt'd source javalib to out/soong/system_server_dexjars
// The javalib from the deapexed prebuilt will be copied to this location.
// TODO (b/331665856): Implement a principled solution for this.
copyApexSystemServerJarDex := !disableSourceApexVariant(ctx)
copyApexSystemServerJarDex := !disableSourceApexVariant(ctx) && !ctx.Module().IsHideFromMake()
dexpreoptRule, err := dexpreopt.GenerateDexpreoptRule(
ctx, globalSoong, global, dexpreoptConfig, appProductPackages, copyApexSystemServerJarDex)
if err != nil {

View File

@@ -908,7 +908,7 @@ func (j *Library) GenerateAndroidBuildActions(ctx android.ModuleContext) {
// Check min_sdk_version of the transitive dependencies if this module is created from
// java_sdk_library.
if j.deviceProperties.Min_sdk_version != nil && j.SdkLibraryName() != nil {
if j.overridableProperties.Min_sdk_version != nil && j.SdkLibraryName() != nil {
j.CheckDepsMinSdkVersion(ctx)
}
@@ -1096,7 +1096,7 @@ func (p *librarySdkMemberProperties) PopulateFromVariant(ctx android.SdkMemberCo
// If the min_sdk_version was set then add the canonical representation of the API level to the
// snapshot.
if j.deviceProperties.Min_sdk_version != nil {
if j.overridableProperties.Min_sdk_version != nil {
canonical, err := android.ReplaceFinalizedCodenames(ctx.SdkModuleContext().Config(), j.minSdkVersion.String())
if err != nil {
ctx.ModuleErrorf("%s", err)

View File

@@ -1842,6 +1842,7 @@ func (module *SdkLibrary) createImplLibrary(mctx android.DefaultableHookContext)
&module.dexProperties,
&module.dexpreoptProperties,
&module.linter.properties,
&module.overridableProperties,
&props,
module.sdkComponentPropertiesForChildLibrary(),
}