Fix monolithic hidden API processing with prebuilts am: 2a999332ef
Original change: https://googleplex-android-review.googlesource.com/c/platform/build/soong/+/15063347 Change-Id: I0d71dd747b1305f43cec8fe0ad36f8b6f2b3ea10
This commit is contained in:
commit
19bef03853
|
@ -4416,11 +4416,13 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
checkHiddenAPIIndexInputs := func(t *testing.T, ctx *android.TestContext, expectedInputs string) {
|
checkHiddenAPIIndexInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
|
platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
|
||||||
indexRule := platformBootclasspath.Rule("monolithic_hidden_API_index")
|
var rule android.TestingBuildParams
|
||||||
java.CheckHiddenAPIRuleInputs(t, "index", expectedInputs, indexRule)
|
|
||||||
|
rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
|
||||||
|
java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
|
||||||
}
|
}
|
||||||
|
|
||||||
fragment := java.ApexVariantReference{
|
fragment := java.ApexVariantReference{
|
||||||
|
|
|
@ -524,7 +524,7 @@ func (i *HiddenAPIFlagInput) gatherStubLibInfo(ctx android.ModuleContext, conten
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.VisitDirectDepsIf(isActiveModule, func(module android.Module) {
|
ctx.VisitDirectDeps(func(module android.Module) {
|
||||||
tag := ctx.OtherModuleDependencyTag(module)
|
tag := ctx.OtherModuleDependencyTag(module)
|
||||||
if hiddenAPIStubsTag, ok := tag.(hiddenAPIStubsDependencyTag); ok {
|
if hiddenAPIStubsTag, ok := tag.(hiddenAPIStubsDependencyTag); ok {
|
||||||
kind := hiddenAPIStubsTag.sdkKind
|
kind := hiddenAPIStubsTag.sdkKind
|
||||||
|
@ -634,7 +634,7 @@ func pathForValidation(ctx android.PathContext, path android.WritablePath) andro
|
||||||
// hiddenAPIInfo is a struct containing paths to files that augment the information provided by
|
// hiddenAPIInfo is a struct containing paths to files that augment the information provided by
|
||||||
// the annotationFlags.
|
// the annotationFlags.
|
||||||
func buildRuleToGenerateHiddenApiFlags(ctx android.BuilderContext, name, desc string,
|
func buildRuleToGenerateHiddenApiFlags(ctx android.BuilderContext, name, desc string,
|
||||||
outputPath android.WritablePath, baseFlagsPath android.Path, annotationFlags android.Path,
|
outputPath android.WritablePath, baseFlagsPath android.Path, annotationFlagPaths android.Paths,
|
||||||
flagFilesByCategory FlagFilesByCategory, allFlagsPaths android.Paths, generatedRemovedDexSignatures android.OptionalPath) {
|
flagFilesByCategory FlagFilesByCategory, allFlagsPaths android.Paths, generatedRemovedDexSignatures android.OptionalPath) {
|
||||||
|
|
||||||
// The file which is used to record that the flags file is valid.
|
// The file which is used to record that the flags file is valid.
|
||||||
|
@ -665,7 +665,7 @@ func buildRuleToGenerateHiddenApiFlags(ctx android.BuilderContext, name, desc st
|
||||||
command := rule.Command().
|
command := rule.Command().
|
||||||
BuiltTool("generate_hiddenapi_lists").
|
BuiltTool("generate_hiddenapi_lists").
|
||||||
FlagWithInput("--csv ", baseFlagsPath).
|
FlagWithInput("--csv ", baseFlagsPath).
|
||||||
Input(annotationFlags).
|
Inputs(annotationFlagPaths).
|
||||||
FlagWithOutput("--output ", tempPath)
|
FlagWithOutput("--output ", tempPath)
|
||||||
|
|
||||||
// Add the options for the different categories of flag files.
|
// Add the options for the different categories of flag files.
|
||||||
|
@ -747,7 +747,7 @@ func hiddenAPIRulesForBootclasspathFragment(ctx android.ModuleContext, contents
|
||||||
// Generate the all-flags.csv which are the flags that will, in future, be encoded into the dex
|
// Generate the all-flags.csv which are the flags that will, in future, be encoded into the dex
|
||||||
// files.
|
// files.
|
||||||
allFlagsCSV := android.PathForModuleOut(ctx, hiddenApiSubDir, "all-flags.csv")
|
allFlagsCSV := android.PathForModuleOut(ctx, hiddenApiSubDir, "all-flags.csv")
|
||||||
buildRuleToGenerateHiddenApiFlags(ctx, "modularHiddenApiAllFlags", "modular hiddenapi all flags", allFlagsCSV, stubFlagsCSV, annotationFlagsCSV, input.FlagFilesByCategory, nil, removedDexSignatures)
|
buildRuleToGenerateHiddenApiFlags(ctx, "modularHiddenApiAllFlags", "modular hiddenapi all flags", allFlagsCSV, stubFlagsCSV, android.Paths{annotationFlagsCSV}, input.FlagFilesByCategory, nil, removedDexSignatures)
|
||||||
|
|
||||||
// Encode the flags into the boot dex files.
|
// Encode the flags into the boot dex files.
|
||||||
encodedBootDexJarsByModule := map[string]android.Path{}
|
encodedBootDexJarsByModule := map[string]android.Path{}
|
||||||
|
|
|
@ -68,6 +68,14 @@ func newMonolithicHiddenAPIInfo(ctx android.ModuleContext, flagFilesByCategory F
|
||||||
if ctx.OtherModuleHasProvider(fragment, HiddenAPIInfoProvider) {
|
if ctx.OtherModuleHasProvider(fragment, HiddenAPIInfoProvider) {
|
||||||
info := ctx.OtherModuleProvider(fragment, HiddenAPIInfoProvider).(HiddenAPIInfo)
|
info := ctx.OtherModuleProvider(fragment, HiddenAPIInfoProvider).(HiddenAPIInfo)
|
||||||
monolithicInfo.append(&info)
|
monolithicInfo.append(&info)
|
||||||
|
|
||||||
|
// If the bootclasspath fragment actually perform hidden API processing itself then use the
|
||||||
|
// CSV files it provides and do not bother processing the classesJars files. This ensures
|
||||||
|
// consistent behavior between source and prebuilt as prebuilt modules do not provide
|
||||||
|
// classesJars.
|
||||||
|
if info.AllFlagsPath != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
classesJars = extractClassesJarsFromModules(e.Contents)
|
classesJars = extractClassesJarsFromModules(e.Contents)
|
||||||
|
|
|
@ -303,28 +303,48 @@ func (b *platformBootclasspathModule) generateHiddenAPIBuildActions(ctx android.
|
||||||
rule.Build("platform-bootclasspath-monolithic-hiddenapi-stub-flags", "monolithic hidden API stub flags")
|
rule.Build("platform-bootclasspath-monolithic-hiddenapi-stub-flags", "monolithic hidden API stub flags")
|
||||||
|
|
||||||
// Generate the annotation-flags.csv file from all the module annotations.
|
// Generate the annotation-flags.csv file from all the module annotations.
|
||||||
annotationFlags := android.PathForModuleOut(ctx, "hiddenapi-monolithic", "annotation-flags.csv")
|
annotationFlags := android.PathForModuleOut(ctx, "hiddenapi-monolithic", "annotation-flags-from-classes.csv")
|
||||||
buildRuleToGenerateAnnotationFlags(ctx, "monolithic hiddenapi flags", classesJars, stubFlags, annotationFlags)
|
buildRuleToGenerateAnnotationFlags(ctx, "intermediate hidden API flags", classesJars, stubFlags, annotationFlags)
|
||||||
|
|
||||||
// Generate the monotlithic hiddenapi-flags.csv file.
|
// Generate the monolithic hiddenapi-flags.csv file.
|
||||||
|
//
|
||||||
|
// Use annotation flags generated directly from the classes jars as well as annotation flag files
|
||||||
|
// provided by prebuilts.
|
||||||
|
allAnnotationFlagFiles := android.Paths{annotationFlags}
|
||||||
|
allAnnotationFlagFiles = append(allAnnotationFlagFiles, monolithicInfo.AnnotationFlagsPaths...)
|
||||||
allFlags := hiddenAPISingletonPaths(ctx).flags
|
allFlags := hiddenAPISingletonPaths(ctx).flags
|
||||||
buildRuleToGenerateHiddenApiFlags(ctx, "hiddenAPIFlagsFile", "hiddenapi flags", allFlags, stubFlags, annotationFlags, monolithicInfo.FlagsFilesByCategory, monolithicInfo.AllFlagsPaths, android.OptionalPath{})
|
buildRuleToGenerateHiddenApiFlags(ctx, "hiddenAPIFlagsFile", "monolithic hidden API flags", allFlags, stubFlags, allAnnotationFlagFiles, monolithicInfo.FlagsFilesByCategory, monolithicInfo.AllFlagsPaths, android.OptionalPath{})
|
||||||
|
|
||||||
// Generate an intermediate monolithic hiddenapi-metadata.csv file directly from the annotations
|
// Generate an intermediate monolithic hiddenapi-metadata.csv file directly from the annotations
|
||||||
// in the source code.
|
// in the source code.
|
||||||
intermediateMetadataCSV := android.PathForModuleOut(ctx, "hiddenapi-monolithic", "intermediate-metadata.csv")
|
intermediateMetadataCSV := android.PathForModuleOut(ctx, "hiddenapi-monolithic", "metadata-from-classes.csv")
|
||||||
buildRuleToGenerateMetadata(ctx, "monolithic hidden API metadata", classesJars, stubFlags, intermediateMetadataCSV)
|
buildRuleToGenerateMetadata(ctx, "intermediate hidden API metadata", classesJars, stubFlags, intermediateMetadataCSV)
|
||||||
|
|
||||||
// Reformat the intermediate file to add | quotes just in case that is important for the tools
|
// Generate the monolithic hiddenapi-metadata.csv file.
|
||||||
// that consume the metadata file.
|
//
|
||||||
// TODO(b/179354495): Investigate whether it is possible to remove this reformatting step.
|
// Use metadata files generated directly from the classes jars as well as metadata files provided
|
||||||
|
// by prebuilts.
|
||||||
|
//
|
||||||
|
// This has the side effect of ensuring that the output file uses | quotes just in case that is
|
||||||
|
// important for the tools that consume the metadata file.
|
||||||
|
allMetadataFlagFiles := android.Paths{intermediateMetadataCSV}
|
||||||
|
allMetadataFlagFiles = append(allMetadataFlagFiles, monolithicInfo.MetadataPaths...)
|
||||||
metadataCSV := hiddenAPISingletonPaths(ctx).metadata
|
metadataCSV := hiddenAPISingletonPaths(ctx).metadata
|
||||||
b.buildRuleMergeCSV(ctx, "reformat monolithic hidden API metadata", android.Paths{intermediateMetadataCSV}, metadataCSV)
|
b.buildRuleMergeCSV(ctx, "monolithic hidden API metadata", allMetadataFlagFiles, metadataCSV)
|
||||||
|
|
||||||
// Generate the monolithic hiddenapi-index.csv file directly from the CSV files in the classes
|
// Generate an intermediate monolithic hiddenapi-index.csv file directly from the CSV files in the
|
||||||
// jars.
|
// classes jars.
|
||||||
|
intermediateIndexCSV := android.PathForModuleOut(ctx, "hiddenapi-monolithic", "index-from-classes.csv")
|
||||||
|
buildRuleToGenerateIndex(ctx, "intermediate hidden API index", classesJars, intermediateIndexCSV)
|
||||||
|
|
||||||
|
// Generate the monolithic hiddenapi-index.csv file.
|
||||||
|
//
|
||||||
|
// Use index files generated directly from the classes jars as well as index files provided
|
||||||
|
// by prebuilts.
|
||||||
|
allIndexFlagFiles := android.Paths{intermediateIndexCSV}
|
||||||
|
allIndexFlagFiles = append(allIndexFlagFiles, monolithicInfo.IndexPaths...)
|
||||||
indexCSV := hiddenAPISingletonPaths(ctx).index
|
indexCSV := hiddenAPISingletonPaths(ctx).index
|
||||||
buildRuleToGenerateIndex(ctx, "monolithic hidden API index", classesJars, indexCSV)
|
b.buildRuleMergeCSV(ctx, "monolithic hidden API index", allIndexFlagFiles, indexCSV)
|
||||||
|
|
||||||
return bootDexJarByModule
|
return bootDexJarByModule
|
||||||
}
|
}
|
||||||
|
|
|
@ -318,10 +318,41 @@ func TestPlatformBootclasspath_HiddenAPIMonolithicFiles(t *testing.T) {
|
||||||
// Make sure that the foo-hiddenapi-annotations.jar is included in the inputs to the rules that
|
// Make sure that the foo-hiddenapi-annotations.jar is included in the inputs to the rules that
|
||||||
// creates the index.csv file.
|
// creates the index.csv file.
|
||||||
platformBootclasspath := result.ModuleForTests("myplatform-bootclasspath", "android_common")
|
platformBootclasspath := result.ModuleForTests("myplatform-bootclasspath", "android_common")
|
||||||
indexRule := platformBootclasspath.Rule("monolithic_hidden_API_index")
|
|
||||||
CheckHiddenAPIRuleInputs(t, "index", `
|
var rule android.TestingBuildParams
|
||||||
out/soong/.intermediates/bar/android_common/javac/bar.jar
|
|
||||||
out/soong/.intermediates/foo-hiddenapi-annotations/android_common/javac/foo-hiddenapi-annotations.jar
|
// All the intermediate rules use the same inputs.
|
||||||
out/soong/.intermediates/foo/android_common/javac/foo.jar
|
expectedIntermediateInputs := `
|
||||||
`, indexRule)
|
out/soong/.intermediates/bar/android_common/javac/bar.jar
|
||||||
|
out/soong/.intermediates/foo-hiddenapi-annotations/android_common/javac/foo-hiddenapi-annotations.jar
|
||||||
|
out/soong/.intermediates/foo/android_common/javac/foo.jar
|
||||||
|
`
|
||||||
|
|
||||||
|
// Check flags output.
|
||||||
|
rule = platformBootclasspath.Output("hiddenapi-monolithic/annotation-flags-from-classes.csv")
|
||||||
|
CheckHiddenAPIRuleInputs(t, "intermediate flags", expectedIntermediateInputs, rule)
|
||||||
|
|
||||||
|
rule = platformBootclasspath.Output("out/soong/hiddenapi/hiddenapi-flags.csv")
|
||||||
|
CheckHiddenAPIRuleInputs(t, "monolithic flags", `
|
||||||
|
out/soong/.intermediates/myplatform-bootclasspath/android_common/hiddenapi-monolithic/annotation-flags-from-classes.csv
|
||||||
|
out/soong/hiddenapi/hiddenapi-stub-flags.txt
|
||||||
|
`, rule)
|
||||||
|
|
||||||
|
// Check metadata output.
|
||||||
|
rule = platformBootclasspath.Output("hiddenapi-monolithic/metadata-from-classes.csv")
|
||||||
|
CheckHiddenAPIRuleInputs(t, "intermediate metadata", expectedIntermediateInputs, rule)
|
||||||
|
|
||||||
|
rule = platformBootclasspath.Output("out/soong/hiddenapi/hiddenapi-unsupported.csv")
|
||||||
|
CheckHiddenAPIRuleInputs(t, "monolithic metadata", `
|
||||||
|
out/soong/.intermediates/myplatform-bootclasspath/android_common/hiddenapi-monolithic/metadata-from-classes.csv
|
||||||
|
`, rule)
|
||||||
|
|
||||||
|
// Check index output.
|
||||||
|
rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
|
||||||
|
CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
|
||||||
|
|
||||||
|
rule = platformBootclasspath.Output("out/soong/hiddenapi/hiddenapi-index.csv")
|
||||||
|
CheckHiddenAPIRuleInputs(t, "monolithic index", `
|
||||||
|
out/soong/.intermediates/myplatform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
|
||||||
|
`, rule)
|
||||||
}
|
}
|
||||||
|
|
|
@ -484,6 +484,28 @@ sdk_snapshot {
|
||||||
.intermediates/mycoreplatform.stubs.source/android_common/metalava/mycoreplatform.stubs.source_removed.txt -> sdk_library/public/mycoreplatform-removed.txt
|
.intermediates/mycoreplatform.stubs.source/android_common/metalava/mycoreplatform.stubs.source_removed.txt -> sdk_library/public/mycoreplatform-removed.txt
|
||||||
`),
|
`),
|
||||||
snapshotTestPreparer(checkSnapshotWithoutSource, preparerForSnapshot),
|
snapshotTestPreparer(checkSnapshotWithoutSource, preparerForSnapshot),
|
||||||
|
snapshotTestChecker(checkSnapshotWithoutSource, func(t *testing.T, result *android.TestResult) {
|
||||||
|
module := result.ModuleForTests("platform-bootclasspath", "android_common")
|
||||||
|
var rule android.TestingBuildParams
|
||||||
|
rule = module.Output("out/soong/hiddenapi/hiddenapi-flags.csv")
|
||||||
|
java.CheckHiddenAPIRuleInputs(t, "monolithic flags", `
|
||||||
|
out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/annotation-flags-from-classes.csv
|
||||||
|
out/soong/hiddenapi/hiddenapi-stub-flags.txt
|
||||||
|
snapshot/hiddenapi/annotation-flags.csv
|
||||||
|
`, rule)
|
||||||
|
|
||||||
|
rule = module.Output("out/soong/hiddenapi/hiddenapi-unsupported.csv")
|
||||||
|
java.CheckHiddenAPIRuleInputs(t, "monolithic metadata", `
|
||||||
|
out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/metadata-from-classes.csv
|
||||||
|
snapshot/hiddenapi/metadata.csv
|
||||||
|
`, rule)
|
||||||
|
|
||||||
|
rule = module.Output("out/soong/hiddenapi/hiddenapi-index.csv")
|
||||||
|
java.CheckHiddenAPIRuleInputs(t, "monolithic index", `
|
||||||
|
out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
|
||||||
|
snapshot/hiddenapi/index.csv
|
||||||
|
`, rule)
|
||||||
|
}),
|
||||||
snapshotTestPreparer(checkSnapshotWithSourcePreferred, preparerForSnapshot),
|
snapshotTestPreparer(checkSnapshotWithSourcePreferred, preparerForSnapshot),
|
||||||
snapshotTestPreparer(checkSnapshotPreferredWithSource, preparerForSnapshot),
|
snapshotTestPreparer(checkSnapshotPreferredWithSource, preparerForSnapshot),
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue