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:
Paul Duffin 2021-06-23 09:18:26 +00:00 committed by Automerger Merge Worker
commit 19bef03853
6 changed files with 109 additions and 26 deletions

View File

@ -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{

View File

@ -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{}

View File

@ -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)

View File

@ -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
} }

View File

@ -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)
} }

View File

@ -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),
) )