Merge "Extract class files from dep_api_srcs instead of java files" am: 043893465c

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

Change-Id: I4d0ee0399f5262ae7a845497e13953ebd3aba877
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Treehugger Robot
2023-06-30 10:24:21 +00:00
committed by Automerger Merge Worker
4 changed files with 69 additions and 83 deletions

View File

@@ -1624,13 +1624,6 @@ func (ap *JavaApiContribution) GenerateAndroidBuildActions(ctx android.ModuleCon
})
}
type JavaApiLibraryDepsInfo struct {
JavaInfo
StubsSrcJar android.Path
}
var JavaApiLibraryDepsProvider = blueprint.NewProvider(JavaApiLibraryDepsInfo{})
type ApiLibrary struct {
android.ModuleBase
android.DefaultableModuleBase
@@ -1672,10 +1665,11 @@ type JavaApiLibraryProperties struct {
// merge zipped after metalava invocation
Static_libs []string
// Java Api library to provide the full API surface text files and jar file.
// If this property is set, the provided full API surface text files and
// jar file are passed to metalava invocation.
Dep_api_srcs *string
// Java Api library to provide the full API surface stub jar file.
// If this property is set, the stub jar of this module is created by
// extracting the compiled class files provided by the
// full_api_surface_stub module.
Full_api_surface_stub *string
}
func ApiLibraryFactory() android.Module {
@@ -1762,35 +1756,37 @@ func (al *ApiLibrary) stubsFlags(ctx android.ModuleContext, cmd *android.RuleBui
}
}
// This method extracts the stub java files from the srcjar file provided from dep_api_srcs module
// and replaces the java stubs generated by invoking metalava in this module.
// This method extracts the stub class files from the stub jar file provided
// from full_api_surface_stub module instead of compiling the srcjar generated from invoking metalava.
// This method is used because metalava can generate compilable from-text stubs only when
// the codebase encompasses all classes listed in the input API text file, but a class can extend
// the codebase encompasses all classes listed in the input API text file, and a class can extend
// a class that is not within the same API domain.
func (al *ApiLibrary) extractApiSrcs(ctx android.ModuleContext, rule *android.RuleBuilder, stubsDir android.OptionalPath, depApiSrcsSrcJar android.Path) {
generatedStubsList := android.PathForModuleOut(ctx, "metalava", "sources.txt")
func (al *ApiLibrary) extractApiSrcs(ctx android.ModuleContext, rule *android.RuleBuilder, stubsDir android.OptionalPath, fullApiSurfaceStubJar android.Path) {
classFilesList := android.PathForModuleOut(ctx, "metalava", "classes.txt")
unzippedSrcJarDir := android.PathForModuleOut(ctx, "metalava", "unzipDir")
rule.Command().
BuiltTool("list_files").
Text(stubsDir.String()).
FlagWithOutput("--out ", generatedStubsList).
FlagWithOutput("--out ", classFilesList).
FlagWithArg("--extensions ", ".java").
FlagWithArg("--root ", unzippedSrcJarDir.String())
FlagWithArg("--root ", unzippedSrcJarDir.String()).
Flag("--classes")
rule.Command().
Text("unzip").
Flag("-q").
Input(depApiSrcsSrcJar).
Input(fullApiSurfaceStubJar).
FlagWithArg("-d ", unzippedSrcJarDir.String())
rule.Command().
BuiltTool("soong_zip").
Flag("-srcjar").
Flag("-jar").
Flag("-write_if_changed").
Flag("-ignore_missing_files").
FlagWithArg("-C ", unzippedSrcJarDir.String()).
FlagWithInput("-l ", generatedStubsList).
FlagWithOutput("-o ", al.stubsSrcJar)
FlagWithInput("-l ", classFilesList).
FlagWithOutput("-o ", al.stubsJarWithoutStaticLibs)
}
func (al *ApiLibrary) DepsMutator(ctx android.BottomUpMutatorContext) {
@@ -1800,8 +1796,8 @@ func (al *ApiLibrary) DepsMutator(ctx android.BottomUpMutatorContext) {
}
ctx.AddVariationDependencies(nil, libTag, al.properties.Libs...)
ctx.AddVariationDependencies(nil, staticLibTag, al.properties.Static_libs...)
if al.properties.Dep_api_srcs != nil {
ctx.AddVariationDependencies(nil, depApiSrcsTag, String(al.properties.Dep_api_srcs))
if al.properties.Full_api_surface_stub != nil {
ctx.AddVariationDependencies(nil, depApiSrcsTag, String(al.properties.Full_api_surface_stub))
}
}
@@ -1823,7 +1819,7 @@ func (al *ApiLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
var srcFiles android.Paths
var classPaths android.Paths
var staticLibs android.Paths
var depApiSrcsStubsSrcJar android.Path
var depApiSrcsStubsJar android.Path
ctx.VisitDirectDeps(func(dep android.Module) {
tag := ctx.OtherModuleDependencyTag(dep)
switch tag {
@@ -1841,9 +1837,8 @@ func (al *ApiLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
provider := ctx.OtherModuleProvider(dep, JavaInfoProvider).(JavaInfo)
staticLibs = append(staticLibs, provider.HeaderJars...)
case depApiSrcsTag:
provider := ctx.OtherModuleProvider(dep, JavaApiLibraryDepsProvider).(JavaApiLibraryDepsInfo)
classPaths = append(classPaths, provider.HeaderJars...)
depApiSrcsStubsSrcJar = provider.StubsSrcJar
provider := ctx.OtherModuleProvider(dep, JavaInfoProvider).(JavaInfo)
depApiSrcsStubsJar = provider.HeaderJars[0]
}
})
@@ -1861,31 +1856,31 @@ func (al *ApiLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
al.stubsFlags(ctx, cmd, stubsDir)
al.stubsSrcJar = android.PathForModuleOut(ctx, "metalava", ctx.ModuleName()+"-"+"stubs.srcjar")
al.stubsJarWithoutStaticLibs = android.PathForModuleOut(ctx, "metalava", "stubs.jar")
al.stubsJar = android.PathForModuleOut(ctx, ctx.ModuleName(), fmt.Sprintf("%s.jar", ctx.ModuleName()))
if depApiSrcsStubsSrcJar != nil {
al.extractApiSrcs(ctx, rule, stubsDir, depApiSrcsStubsSrcJar)
} else {
rule.Command().
BuiltTool("soong_zip").
Flag("-write_if_changed").
Flag("-jar").
FlagWithOutput("-o ", al.stubsSrcJar).
FlagWithArg("-C ", stubsDir.String()).
FlagWithArg("-D ", stubsDir.String())
if depApiSrcsStubsJar != nil {
al.extractApiSrcs(ctx, rule, stubsDir, depApiSrcsStubsJar)
}
rule.Command().
BuiltTool("soong_zip").
Flag("-write_if_changed").
Flag("-jar").
FlagWithOutput("-o ", al.stubsSrcJar).
FlagWithArg("-C ", stubsDir.String()).
FlagWithArg("-D ", stubsDir.String())
rule.Build("metalava", "metalava merged")
al.stubsJarWithoutStaticLibs = android.PathForModuleOut(ctx, ctx.ModuleName(), "stubs.jar")
al.stubsJar = android.PathForModuleOut(ctx, ctx.ModuleName(), fmt.Sprintf("%s.jar", ctx.ModuleName()))
if depApiSrcsStubsJar == nil {
var flags javaBuilderFlags
flags.javaVersion = getStubsJavaVersion()
flags.javacFlags = strings.Join(al.properties.Javacflags, " ")
flags.classpath = classpath(classPaths)
var flags javaBuilderFlags
flags.javaVersion = getStubsJavaVersion()
flags.javacFlags = strings.Join(al.properties.Javacflags, " ")
flags.classpath = classpath(classPaths)
TransformJavaToClasses(ctx, al.stubsJarWithoutStaticLibs, 0, android.Paths{},
android.Paths{al.stubsSrcJar}, flags, android.Paths{})
TransformJavaToClasses(ctx, al.stubsJarWithoutStaticLibs, 0, android.Paths{},
android.Paths{al.stubsSrcJar}, flags, android.Paths{})
}
builder := android.NewRuleBuilder(pctx, ctx)
builder.Command().
@@ -1917,13 +1912,6 @@ func (al *ApiLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
ImplementationJars: android.PathsIfNonNil(al.stubsJar),
AidlIncludeDirs: android.Paths{},
})
ctx.SetProvider(JavaApiLibraryDepsProvider, JavaApiLibraryDepsInfo{
JavaInfo: JavaInfo{
HeaderJars: android.PathsIfNonNil(al.stubsJar),
},
StubsSrcJar: al.stubsSrcJar,
})
}
func (al *ApiLibrary) DexJarBuildPath() OptionalDexJarPath {

View File

@@ -2208,7 +2208,7 @@ func TestJavaApiLibraryStaticLibsLink(t *testing.T) {
}
}
func TestJavaApiLibraryDepApiSrcs(t *testing.T) {
func TestJavaApiLibraryFullApiSurfaceStub(t *testing.T) {
provider_bp_a := `
java_api_contribution {
name: "foo1",
@@ -2234,7 +2234,7 @@ func TestJavaApiLibraryDepApiSrcs(t *testing.T) {
name: "bar1",
api_surface: "public",
api_contributions: ["foo1"],
dep_api_srcs: "lib1",
full_api_surface_stub: "lib1",
}
`,
map[string][]byte{
@@ -2247,9 +2247,7 @@ func TestJavaApiLibraryDepApiSrcs(t *testing.T) {
manifest := m.Output("metalava.sbox.textproto")
sboxProto := android.RuleBuilderSboxProtoForTests(t, manifest)
manifestCommand := sboxProto.Commands[0].GetCommand()
android.AssertStringDoesContain(t, "Command expected to contain module srcjar file", manifestCommand, "bar1-stubs.srcjar")
android.AssertStringDoesContain(t, "Command expected to contain output files list text file flag", manifestCommand, "--out __SBOX_SANDBOX_DIR__/out/sources.txt")
android.AssertStringDoesContain(t, "Command expected to contain full_api_surface_stub output jar", manifestCommand, "lib1.jar")
}
func TestJavaApiLibraryFilegroupInput(t *testing.T) {

View File

@@ -1780,12 +1780,12 @@ func (module *SdkLibrary) createStubsSourcesAndApi(mctx android.DefaultableHookC
func (module *SdkLibrary) createApiLibrary(mctx android.DefaultableHookContext, apiScope *apiScope) {
props := struct {
Name *string
Visibility []string
Api_contributions []string
Libs []string
Static_libs []string
Dep_api_srcs *string
Name *string
Visibility []string
Api_contributions []string
Libs []string
Static_libs []string
Full_api_surface_stub *string
}{}
props.Name = proptools.StringPtr(module.apiLibraryModuleName(apiScope))
@@ -1807,12 +1807,12 @@ func (module *SdkLibrary) createApiLibrary(mctx android.DefaultableHookContext,
props.Libs = append(props.Libs, module.sdkLibraryProperties.Stub_only_libs...)
props.Libs = append(props.Libs, "stub-annotations")
props.Static_libs = module.sdkLibraryProperties.Stub_only_static_libs
props.Dep_api_srcs = proptools.StringPtr(apiScope.kind.DefaultJavaLibraryName() + ".from-text")
props.Full_api_surface_stub = proptools.StringPtr(apiScope.kind.DefaultJavaLibraryName() + ".from-text")
// android_module_lib_stubs_current.from-text only comprises api contributions from art, conscrypt and i18n.
// Thus, replace with android_module_lib_stubs_current_full.from-text, which comprises every api domains.
if apiScope.kind == android.SdkModule {
props.Dep_api_srcs = proptools.StringPtr(apiScope.kind.DefaultJavaLibraryName() + "_full.from-text")
props.Full_api_surface_stub = proptools.StringPtr(apiScope.kind.DefaultJavaLibraryName() + "_full.from-text")
}
mctx.CreateModule(ApiLibraryFactory, &props)

View File

@@ -1442,35 +1442,35 @@ func TestJavaSdkLibrary_ApiLibrary(t *testing.T) {
`)
testCases := []struct {
scope *apiScope
apiContributions []string
depApiSrcs string
scope *apiScope
apiContributions []string
fullApiSurfaceStub string
}{
{
scope: apiScopePublic,
apiContributions: []string{"foo.stubs.source.api.contribution"},
depApiSrcs: "android_stubs_current.from-text",
scope: apiScopePublic,
apiContributions: []string{"foo.stubs.source.api.contribution"},
fullApiSurfaceStub: "android_stubs_current.from-text",
},
{
scope: apiScopeSystem,
apiContributions: []string{"foo.stubs.source.system.api.contribution", "foo.stubs.source.api.contribution"},
depApiSrcs: "android_system_stubs_current.from-text",
scope: apiScopeSystem,
apiContributions: []string{"foo.stubs.source.system.api.contribution", "foo.stubs.source.api.contribution"},
fullApiSurfaceStub: "android_system_stubs_current.from-text",
},
{
scope: apiScopeTest,
apiContributions: []string{"foo.stubs.source.test.api.contribution", "foo.stubs.source.system.api.contribution", "foo.stubs.source.api.contribution"},
depApiSrcs: "android_test_stubs_current.from-text",
scope: apiScopeTest,
apiContributions: []string{"foo.stubs.source.test.api.contribution", "foo.stubs.source.system.api.contribution", "foo.stubs.source.api.contribution"},
fullApiSurfaceStub: "android_test_stubs_current.from-text",
},
{
scope: apiScopeModuleLib,
apiContributions: []string{"foo.stubs.source.module_lib.api.contribution", "foo.stubs.source.system.api.contribution", "foo.stubs.source.api.contribution"},
depApiSrcs: "android_module_lib_stubs_current_full.from-text",
scope: apiScopeModuleLib,
apiContributions: []string{"foo.stubs.source.module_lib.api.contribution", "foo.stubs.source.system.api.contribution", "foo.stubs.source.api.contribution"},
fullApiSurfaceStub: "android_module_lib_stubs_current_full.from-text",
},
}
for _, c := range testCases {
m := result.ModuleForTests(c.scope.apiLibraryModuleName("foo"), "android_common").Module().(*ApiLibrary)
android.AssertArrayString(t, "Module expected to contain api contributions", c.apiContributions, m.properties.Api_contributions)
android.AssertStringEquals(t, "Module expected to contain full api surface api library", c.depApiSrcs, *m.properties.Dep_api_srcs)
android.AssertStringEquals(t, "Module expected to contain full api surface api library", c.fullApiSurfaceStub, *m.properties.Full_api_surface_stub)
}
}