Merge "Propagate flags_packages to static reverse dependencies" into main

This commit is contained in:
Treehugger Robot
2024-06-17 18:21:26 +00:00
committed by Gerrit Code Review
4 changed files with 121 additions and 12 deletions

View File

@@ -831,12 +831,13 @@ func (a *AndroidLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext)
if a.usesLibrary.shouldDisableDexpreopt {
a.dexpreopter.disableDexpreopt()
}
aconfigTextFilePaths := getAconfigFilePaths(ctx)
a.aapt.buildActions(ctx,
aaptBuildActionOptions{
sdkContext: android.SdkContext(a),
classLoaderContexts: a.classLoaderContexts,
enforceDefaultTargetSdkVersion: false,
aconfigTextFiles: getAconfigFilePaths(ctx),
aconfigTextFiles: aconfigTextFilePaths,
usesLibrary: &a.usesLibrary,
},
)
@@ -906,6 +907,10 @@ func (a *AndroidLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext)
JniPackages: prebuiltJniPackages,
})
}
android.SetProvider(ctx, FlagsPackagesProvider, FlagsPackages{
AconfigTextFiles: aconfigTextFilePaths,
})
}
func (a *AndroidLibrary) IDEInfo(dpInfo *android.IdeInfo) {

View File

@@ -47,6 +47,13 @@ var (
}, "packageName")
)
type FlagsPackages struct {
// Paths to the aconfig dump output text files that are consumed by aapt2
AconfigTextFiles android.Paths
}
var FlagsPackagesProvider = blueprint.NewProvider[FlagsPackages]()
func RegisterAppBuildComponents(ctx android.RegistrationContext) {
ctx.RegisterModuleType("android_app", AndroidAppFactory)
ctx.RegisterModuleType("android_test", AndroidTestFactory)
@@ -478,18 +485,27 @@ func (a *AndroidApp) renameResourcesPackage() bool {
}
func getAconfigFilePaths(ctx android.ModuleContext) (aconfigTextFilePaths android.Paths) {
ctx.VisitDirectDepsWithTag(aconfigDeclarationTag, func(dep android.Module) {
if provider, ok := android.OtherModuleProvider(ctx, dep, android.AconfigDeclarationsProviderKey); ok {
aconfigTextFilePaths = append(aconfigTextFilePaths, provider.IntermediateDumpOutputPath)
} else {
ctx.ModuleErrorf("Only aconfig_declarations module type is allowed for "+
"flags_packages property, but %s is not aconfig_declarations module type",
dep.Name(),
)
ctx.VisitDirectDeps(func(dep android.Module) {
tag := ctx.OtherModuleDependencyTag(dep)
switch tag {
case staticLibTag:
if flagPackages, ok := android.OtherModuleProvider(ctx, dep, FlagsPackagesProvider); ok {
aconfigTextFilePaths = append(aconfigTextFilePaths, flagPackages.AconfigTextFiles...)
}
case aconfigDeclarationTag:
if provider, ok := android.OtherModuleProvider(ctx, dep, android.AconfigDeclarationsProviderKey); ok {
aconfigTextFilePaths = append(aconfigTextFilePaths, provider.IntermediateDumpOutputPath)
} else {
ctx.ModuleErrorf("Only aconfig_declarations module type is allowed for "+
"flags_packages property, but %s is not aconfig_declarations module type",
dep.Name(),
)
}
}
})
return aconfigTextFilePaths
return android.FirstUniquePaths(aconfigTextFilePaths)
}
func (a *AndroidApp) aaptBuildActions(ctx android.ModuleContext) {
@@ -544,6 +560,9 @@ func (a *AndroidApp) aaptBuildActions(ctx android.ModuleContext) {
// Use non final ids if we are doing optimized shrinking and are using R8.
nonFinalIds := a.dexProperties.optimizedResourceShrinkingEnabled(ctx) && a.dexer.effectiveOptimizeEnabled()
aconfigTextFilePaths := getAconfigFilePaths(ctx)
a.aapt.buildActions(ctx,
aaptBuildActionOptions{
sdkContext: android.SdkContext(a),
@@ -552,13 +571,17 @@ func (a *AndroidApp) aaptBuildActions(ctx android.ModuleContext) {
enforceDefaultTargetSdkVersion: a.enforceDefaultTargetSdkVersion(),
forceNonFinalResourceIDs: nonFinalIds,
extraLinkFlags: aaptLinkFlags,
aconfigTextFiles: getAconfigFilePaths(ctx),
aconfigTextFiles: aconfigTextFilePaths,
usesLibrary: &a.usesLibrary,
},
)
// apps manifests are handled by aapt, don't let Module see them
a.properties.Manifest = nil
android.SetProvider(ctx, FlagsPackagesProvider, FlagsPackages{
AconfigTextFiles: aconfigTextFilePaths,
})
}
func (a *AndroidApp) proguardBuildActions(ctx android.ModuleContext) {

View File

@@ -4369,6 +4369,82 @@ func TestAppFlagsPackages(t *testing.T) {
)
}
func TestAppFlagsPackagesPropagation(t *testing.T) {
ctx := testApp(t, `
aconfig_declarations {
name: "foo",
package: "com.example.package.foo",
container: "com.android.foo",
srcs: [
"foo.aconfig",
],
}
aconfig_declarations {
name: "bar",
package: "com.example.package.bar",
container: "com.android.bar",
srcs: [
"bar.aconfig",
],
}
aconfig_declarations {
name: "baz",
package: "com.example.package.baz",
container: "com.android.baz",
srcs: [
"baz.aconfig",
],
}
android_library {
name: "foo_lib",
srcs: ["a.java"],
sdk_version: "current",
flags_packages: [
"foo",
],
}
android_library {
name: "bar_lib",
srcs: ["a.java"],
sdk_version: "current",
flags_packages: [
"bar",
],
}
android_app {
name: "baz_app",
srcs: ["a.java"],
sdk_version: "current",
flags_packages: [
"baz",
],
static_libs: [
"bar_lib",
],
libs: [
"foo_lib",
],
}
`)
bazApp := ctx.ModuleForTests("baz_app", "android_common")
// android_app module depends on aconfig_declarations listed in flags_packages
// and that of static libs, but not libs
aapt2LinkRule := bazApp.Rule("android/soong/java.aapt2Link")
linkInFlags := aapt2LinkRule.Args["inFlags"]
android.AssertStringDoesContain(t,
"aapt2 link command expected to pass feature flags arguments of flags_packages and that of its static libs",
linkInFlags,
"--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt",
)
android.AssertStringDoesNotContain(t,
"aapt2 link command expected to not pass feature flags arguments of flags_packages of its libs",
linkInFlags,
"--feature-flags @out/soong/.intermediates/foo/intermediate.txt",
)
}
// Test that dexpreopt is disabled if an optional_uses_libs exists, but does not provide an implementation.
func TestNoDexpreoptOptionalUsesLibDoesNotHaveImpl(t *testing.T) {
bp := `

View File

@@ -150,12 +150,13 @@ func (r *RuntimeResourceOverlay) GenerateAndroidBuildActions(ctx android.ModuleC
aaptLinkFlags = append(aaptLinkFlags,
"--rename-overlay-category "+*r.overridableProperties.Category)
}
aconfigTextFilePaths := getAconfigFilePaths(ctx)
r.aapt.buildActions(ctx,
aaptBuildActionOptions{
sdkContext: r,
enforceDefaultTargetSdkVersion: false,
extraLinkFlags: aaptLinkFlags,
aconfigTextFiles: getAconfigFilePaths(ctx),
aconfigTextFiles: aconfigTextFilePaths,
},
)
@@ -176,6 +177,10 @@ func (r *RuntimeResourceOverlay) GenerateAndroidBuildActions(ctx android.ModuleC
partition := rroPartition(ctx)
r.installDir = android.PathForModuleInPartitionInstall(ctx, partition, "overlay", String(r.properties.Theme))
ctx.InstallFile(r.installDir, r.outputFile.Base(), r.outputFile)
android.SetProvider(ctx, FlagsPackagesProvider, FlagsPackages{
AconfigTextFiles: aconfigTextFilePaths,
})
}
func (r *RuntimeResourceOverlay) SdkVersion(ctx android.EarlyModuleContext) android.SdkSpec {