Merge "Collect aconfig_declarations of the dependent java_aconfig_library modules" into main am: 033ffb9533 am: 1628b82c6f

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

Change-Id: I81e9d102c17bb5a1caf4400fc9d9513eb2be5c02
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Jihoon Kang 2024-04-11 18:03:02 +00:00 committed by Automerger Merge Worker
commit f4b835ccd9
6 changed files with 160 additions and 8 deletions

View file

@ -76,7 +76,7 @@ func (callbacks *JavaAconfigDeclarationsLibraryCallbacks) DepsMutator(module *ja
} }
} }
func (callbacks *JavaAconfigDeclarationsLibraryCallbacks) GenerateSourceJarBuildActions(module *java.GeneratedJavaLibraryModule, ctx android.ModuleContext) android.Path { func (callbacks *JavaAconfigDeclarationsLibraryCallbacks) GenerateSourceJarBuildActions(module *java.GeneratedJavaLibraryModule, ctx android.ModuleContext) (android.Path, android.Path) {
// Get the values that came from the global RELEASE_ACONFIG_VALUE_SETS flag // Get the values that came from the global RELEASE_ACONFIG_VALUE_SETS flag
declarationsModules := ctx.GetDirectDepsWithTag(declarationsTag) declarationsModules := ctx.GetDirectDepsWithTag(declarationsTag)
if len(declarationsModules) != 1 { if len(declarationsModules) != 1 {
@ -129,7 +129,11 @@ func (callbacks *JavaAconfigDeclarationsLibraryCallbacks) GenerateSourceJarBuild
}}, }},
}) })
return srcJarPath return srcJarPath, declarations.IntermediateCacheOutputPath
}
func (callbacks *JavaAconfigDeclarationsLibraryCallbacks) AconfigDeclarations() *string {
return proptools.StringPtr(callbacks.properties.Aconfig_declarations)
} }
func isModeSupported(mode string) bool { func isModeSupported(mode string) bool {

View file

@ -11412,3 +11412,121 @@ func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames) checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
} }
} }
func TestAconfifDeclarationsValidation(t *testing.T) {
aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
for _, moduleName := range moduleNames {
ret += fmt.Sprintf(`
aconfig_declarations {
name: "%[1]s",
package: "com.example.package",
srcs: [
"%[1]s.aconfig",
],
}
java_aconfig_library {
name: "%[1]s-lib",
aconfig_declarations: "%[1]s",
}
`, moduleName)
}
return ret
}
result := android.GroupFixturePreparers(
prepareForApexTest,
java.PrepareForTestWithJavaSdkLibraryFiles,
java.FixtureWithLastReleaseApis("foo"),
android.FixtureModifyConfig(func(config android.Config) {
config.SetApiLibraries([]string{"foo"})
}),
).RunTestWithBp(t, `
java_library {
name: "baz-java-lib",
static_libs: [
"baz-lib",
],
}
filegroup {
name: "qux-filegroup",
srcs: [
":qux-lib{.generated_srcjars}",
],
}
filegroup {
name: "qux-another-filegroup",
srcs: [
":qux-filegroup",
],
}
java_library {
name: "quux-java-lib",
srcs: [
"a.java",
],
libs: [
"quux-lib",
],
}
java_sdk_library {
name: "foo",
srcs: [
":qux-another-filegroup",
],
api_packages: ["foo"],
system: {
enabled: true,
},
module_lib: {
enabled: true,
},
test: {
enabled: true,
},
static_libs: [
"bar-lib",
],
libs: [
"baz-java-lib",
"quux-java-lib",
],
aconfig_declarations: [
"bar",
],
}
`+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
m := result.ModuleForTests("foo.stubs.source", "android_common")
outDir := "out/soong/.intermediates"
// Arguments passed to aconfig to retrieve the state of the flags defined in the
// textproto files
aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
// "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
// cache file provided by the associated aconfig_declarations module "bar" should be passed
// to aconfig.
android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
"passed as an input",
aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
// "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
// to metalava as classpath. Thus the cache file provided by the associated
// aconfig_declarations module "baz" should be passed to aconfig.
android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
"java_aconfig_library passed as an input",
aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
// "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
// the associated aconfig_declarations module "qux" should be passed to aconfig.
android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
"input",
aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
// "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
// statically depend on "quux-lib". Therefore, the cache file provided by the associated
// aconfig_declarations module "quux" should not be passed to aconfig.
android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
"depend on java_aconfig_library not passed as an input",
aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
}

View file

@ -197,6 +197,9 @@ type CommonProperties struct {
// Additional srcJars tacked in by GeneratedJavaLibraryModule // Additional srcJars tacked in by GeneratedJavaLibraryModule
Generated_srcjars []android.Path `android:"mutated"` Generated_srcjars []android.Path `android:"mutated"`
// intermediate aconfig cache file tacked in by GeneratedJavaLibraryModule
Aconfig_Cache_files []android.Path `android:"mutated"`
// If true, then only the headers are built and not the implementation jar. // If true, then only the headers are built and not the implementation jar.
Headers_only *bool Headers_only *bool
@ -541,6 +544,11 @@ type Module struct {
jarjarRenameRules map[string]string jarjarRenameRules map[string]string
stubsLinkType StubsLinkType stubsLinkType StubsLinkType
// Paths to the aconfig intermediate cache files that are provided by the
// java_aconfig_library or java_library modules that are statically linked
// to this module. Does not contain cache files from all transitive dependencies.
aconfigCacheFiles android.Paths
} }
func (j *Module) CheckStableSdkVersion(ctx android.BaseModuleContext) error { func (j *Module) CheckStableSdkVersion(ctx android.BaseModuleContext) error {
@ -1197,6 +1205,8 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath
// final R classes from the app. // final R classes from the app.
flags.classpath = append(android.CopyOf(extraClasspathJars), flags.classpath...) flags.classpath = append(android.CopyOf(extraClasspathJars), flags.classpath...)
j.aconfigCacheFiles = append(deps.aconfigProtoFiles, j.properties.Aconfig_Cache_files...)
// If compiling headers then compile them and skip the rest // If compiling headers then compile them and skip the rest
if proptools.Bool(j.properties.Headers_only) { if proptools.Bool(j.properties.Headers_only) {
if srcFiles.HasExt(".kt") { if srcFiles.HasExt(".kt") {
@ -1736,7 +1746,7 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath
ExportedPluginDisableTurbine: j.exportedDisableTurbine, ExportedPluginDisableTurbine: j.exportedDisableTurbine,
JacocoReportClassesFile: j.jacocoReportClassesFile, JacocoReportClassesFile: j.jacocoReportClassesFile,
StubsLinkType: j.stubsLinkType, StubsLinkType: j.stubsLinkType,
AconfigIntermediateCacheOutputPaths: deps.aconfigProtoFiles, AconfigIntermediateCacheOutputPaths: j.aconfigCacheFiles,
}) })
// Save the output file with no relative path so that it doesn't end up in a subdirectory when used as a resource // Save the output file with no relative path so that it doesn't end up in a subdirectory when used as a resource
@ -2350,7 +2360,10 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps {
deps.staticHeaderJars = append(deps.staticHeaderJars, dep.Srcs()...) deps.staticHeaderJars = append(deps.staticHeaderJars, dep.Srcs()...)
} }
} else if dep, ok := android.OtherModuleProvider(ctx, module, android.CodegenInfoProvider); ok { } else if dep, ok := android.OtherModuleProvider(ctx, module, android.CodegenInfoProvider); ok {
deps.aconfigProtoFiles = append(deps.aconfigProtoFiles, dep.IntermediateCacheOutputPaths...) switch tag {
case staticLibTag:
deps.aconfigProtoFiles = append(deps.aconfigProtoFiles, dep.IntermediateCacheOutputPaths...)
}
} else { } else {
switch tag { switch tag {
case bootClasspathTag: case bootClasspathTag:

View file

@ -391,12 +391,14 @@ func (j *Javadoc) collectDeps(ctx android.ModuleContext) deps {
} else if dep, ok := android.OtherModuleProvider(ctx, module, JavaInfoProvider); ok { } else if dep, ok := android.OtherModuleProvider(ctx, module, JavaInfoProvider); ok {
deps.classpath = append(deps.classpath, dep.HeaderJars...) deps.classpath = append(deps.classpath, dep.HeaderJars...)
deps.aidlIncludeDirs = append(deps.aidlIncludeDirs, dep.AidlIncludeDirs...) deps.aidlIncludeDirs = append(deps.aidlIncludeDirs, dep.AidlIncludeDirs...)
deps.aconfigProtoFiles = append(deps.aconfigProtoFiles, dep.AconfigIntermediateCacheOutputPaths...)
} else if dep, ok := module.(android.SourceFileProducer); ok { } else if dep, ok := module.(android.SourceFileProducer); ok {
checkProducesJars(ctx, dep) checkProducesJars(ctx, dep)
deps.classpath = append(deps.classpath, dep.Srcs()...) deps.classpath = append(deps.classpath, dep.Srcs()...)
} else { } else {
ctx.ModuleErrorf("depends on non-java module %q", otherName) ctx.ModuleErrorf("depends on non-java module %q", otherName)
} }
case java9LibTag: case java9LibTag:
if dep, ok := android.OtherModuleProvider(ctx, module, JavaInfoProvider); ok { if dep, ok := android.OtherModuleProvider(ctx, module, JavaInfoProvider); ok {
deps.java9Classpath = append(deps.java9Classpath, dep.HeaderJars...) deps.java9Classpath = append(deps.java9Classpath, dep.HeaderJars...)
@ -429,6 +431,19 @@ func (j *Javadoc) collectDeps(ctx android.ModuleContext) deps {
srcFiles := android.PathsForModuleSrcExcludes(ctx, j.properties.Srcs, j.properties.Exclude_srcs) srcFiles := android.PathsForModuleSrcExcludes(ctx, j.properties.Srcs, j.properties.Exclude_srcs)
j.implicits = append(j.implicits, srcFiles...) j.implicits = append(j.implicits, srcFiles...)
// Module can depend on a java_aconfig_library module using the ":module_name{.tag}" syntax.
// Find the corresponding aconfig_declarations module name for such case.
for _, src := range j.properties.Srcs {
if moduleName, tag := android.SrcIsModuleWithTag(src); moduleName != "" {
otherModule := android.GetModuleFromPathDep(ctx, moduleName, tag)
if otherModule != nil {
if dep, ok := android.OtherModuleProvider(ctx, otherModule, android.CodegenInfoProvider); ok {
deps.aconfigProtoFiles = append(deps.aconfigProtoFiles, dep.IntermediateCacheOutputPaths...)
}
}
}
}
filterByPackage := func(srcs []android.Path, filterPackages []string) []android.Path { filterByPackage := func(srcs []android.Path, filterPackages []string) []android.Path {
if filterPackages == nil { if filterPackages == nil {
return srcs return srcs

View file

@ -34,7 +34,7 @@ type GeneratedJavaLibraryCallbacks interface {
// Called from inside GenerateAndroidBuildActions. Add the build rules to // Called from inside GenerateAndroidBuildActions. Add the build rules to
// make the srcjar, and return the path to it. // make the srcjar, and return the path to it.
GenerateSourceJarBuildActions(module *GeneratedJavaLibraryModule, ctx android.ModuleContext) android.Path GenerateSourceJarBuildActions(module *GeneratedJavaLibraryModule, ctx android.ModuleContext) (android.Path, android.Path)
} }
// GeneratedJavaLibraryModuleFactory provides a utility for modules that are generated // GeneratedJavaLibraryModuleFactory provides a utility for modules that are generated
@ -103,8 +103,10 @@ func (module *GeneratedJavaLibraryModule) GenerateAndroidBuildActions(ctx androi
checkPropertyEmpty(ctx, module, "plugins", module.Library.properties.Plugins) checkPropertyEmpty(ctx, module, "plugins", module.Library.properties.Plugins)
checkPropertyEmpty(ctx, module, "exported_plugins", module.Library.properties.Exported_plugins) checkPropertyEmpty(ctx, module, "exported_plugins", module.Library.properties.Exported_plugins)
srcJarPath := module.callbacks.GenerateSourceJarBuildActions(module, ctx) srcJarPath, cacheOutputPath := module.callbacks.GenerateSourceJarBuildActions(module, ctx)
module.Library.properties.Generated_srcjars = append(module.Library.properties.Generated_srcjars, srcJarPath) module.Library.properties.Generated_srcjars = append(module.Library.properties.Generated_srcjars, srcJarPath)
module.Library.properties.Aconfig_Cache_files = append(module.Library.properties.Aconfig_Cache_files, cacheOutputPath)
module.Library.GenerateAndroidBuildActions(ctx) module.Library.GenerateAndroidBuildActions(ctx)
} }

View file

@ -36,8 +36,8 @@ type JavaGenLibTestCallbacks struct {
func (callbacks *JavaGenLibTestCallbacks) DepsMutator(module *GeneratedJavaLibraryModule, ctx android.BottomUpMutatorContext) { func (callbacks *JavaGenLibTestCallbacks) DepsMutator(module *GeneratedJavaLibraryModule, ctx android.BottomUpMutatorContext) {
} }
func (callbacks *JavaGenLibTestCallbacks) GenerateSourceJarBuildActions(module *GeneratedJavaLibraryModule, ctx android.ModuleContext) android.Path { func (callbacks *JavaGenLibTestCallbacks) GenerateSourceJarBuildActions(module *GeneratedJavaLibraryModule, ctx android.ModuleContext) (android.Path, android.Path) {
return android.PathForOutput(ctx, "blah.srcjar") return android.PathForOutput(ctx, "blah.srcjar"), android.PathForOutput(ctx, "blah.pb")
} }
func testGenLib(t *testing.T, errorHandler android.FixtureErrorHandler, bp string) *android.TestResult { func testGenLib(t *testing.T, errorHandler android.FixtureErrorHandler, bp string) *android.TestResult {