Extract class files from dep_api_srcs instead of java files
Currently, stub java files are extracted from srcjar file provided from dep_api_srcs in java_api_library module generated in java_sdk_library per api scope. However, compiling the java files may lead to difference in the content of the generated class files even if the stub java files are equivalent, as javac may arbitrarily add overridden methods. Thus, create a stub jar file instead of creating a stub srcjar file and compiling it, in order to guarantee stub jar files content equivalence and thus enable hiddenapi during from-text stub build. Note that this change does not fully resolve differences between the full api surface csv and the per sdk_library csv. Instead, it removes the difference caused by methods arbitrarily added by javac. This change also renames dep_api_srcs to full_api_surface_stubs to be more intuitive. Test: rebase on top of aosp/2617274 and `m --build-from-text-stub` Bug: 275570206 Change-Id: I22b6d56624633681f5c3b000370b5782655c7b8d
This commit is contained in:
96
java/java.go
96
java/java.go
@@ -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 {
|
||||
|
Reference in New Issue
Block a user