diff options
Diffstat (limited to 'java/platform_bootclasspath.go')
-rw-r--r-- | java/platform_bootclasspath.go | 144 |
1 files changed, 32 insertions, 112 deletions
diff --git a/java/platform_bootclasspath.go b/java/platform_bootclasspath.go index 5880e2f0a..c8fafede6 100644 --- a/java/platform_bootclasspath.go +++ b/java/platform_bootclasspath.go @@ -257,17 +257,6 @@ func (b *platformBootclasspathModule) getImageConfig(ctx android.EarlyModuleCont return defaultBootImageConfig(ctx) } -// hiddenAPISupportingModule encapsulates the information provided by any module that contributes to -// the hidden API processing. -type hiddenAPISupportingModule struct { - module android.Module - - bootDexJar android.Path - flagsCSV android.Path - indexCSV android.Path - metadataCSV android.Path -} - // generateHiddenAPIBuildActions generates all the hidden API related build rules. func (b *platformBootclasspathModule) generateHiddenAPIBuildActions(ctx android.ModuleContext, modules []android.Module, fragments []android.Module) { @@ -290,67 +279,6 @@ func (b *platformBootclasspathModule) generateHiddenAPIBuildActions(ctx android. return } - // nilPathHandler will check the supplied path and if it is nil then it will either immediately - // report an error, or it will defer the error reporting until it is actually used, depending - // whether missing dependencies are allowed. - var nilPathHandler func(path android.Path, name string, module android.Module) android.Path - if ctx.Config().AllowMissingDependencies() { - nilPathHandler = func(path android.Path, name string, module android.Module) android.Path { - if path == nil { - outputPath := android.PathForModuleOut(ctx, "missing", module.Name(), name) - path = outputPath - - // Create an error rule that pretends to create the output file but will actually fail if it - // is run. - ctx.Build(pctx, android.BuildParams{ - Rule: android.ErrorRule, - Output: outputPath, - Args: map[string]string{ - "error": fmt.Sprintf("missing hidden API file: %s for %s", name, module), - }, - }) - } - return path - } - } else { - nilPathHandler = func(path android.Path, name string, module android.Module) android.Path { - if path == nil { - ctx.ModuleErrorf("module %s does not provide a %s file", module, name) - } - return path - } - } - - hiddenAPISupportingModules := []hiddenAPISupportingModule{} - for _, module := range modules { - if h, ok := module.(hiddenAPIIntf); ok { - hiddenAPISupportingModule := hiddenAPISupportingModule{ - module: module, - bootDexJar: nilPathHandler(h.bootDexJar(), "bootDexJar", module), - flagsCSV: nilPathHandler(h.flagsCSV(), "flagsCSV", module), - indexCSV: nilPathHandler(h.indexCSV(), "indexCSV", module), - metadataCSV: nilPathHandler(h.metadataCSV(), "metadataCSV", module), - } - - // If any errors were reported when trying to populate the hiddenAPISupportingModule struct - // then don't add it to the list. - if ctx.Failed() { - continue - } - - hiddenAPISupportingModules = append(hiddenAPISupportingModules, hiddenAPISupportingModule) - } else if _, ok := module.(*DexImport); ok { - // Ignore this for the purposes of hidden API processing - } else { - ctx.ModuleErrorf("module %s of type %s does not support hidden API processing", module, ctx.OtherModuleType(module)) - } - } - - moduleSpecificFlagsPaths := android.Paths{} - for _, module := range hiddenAPISupportingModules { - moduleSpecificFlagsPaths = append(moduleSpecificFlagsPaths, module.flagsCSV) - } - flagFileInfo := b.properties.Hidden_api.hiddenAPIFlagFileInfo(ctx) for _, fragment := range fragments { if ctx.OtherModuleHasProvider(fragment, hiddenAPIFlagFileInfoProvider) { @@ -362,61 +290,53 @@ func (b *platformBootclasspathModule) generateHiddenAPIBuildActions(ctx android. // Store the information for testing. ctx.SetProvider(hiddenAPIFlagFileInfoProvider, flagFileInfo) - outputPath := hiddenAPISingletonPaths(ctx).flags - baseFlagsPath := hiddenAPISingletonPaths(ctx).stubFlags - buildRuleToGenerateHiddenApiFlags(ctx, "hiddenAPIFlagsFile", "hiddenapi flags", outputPath, baseFlagsPath, moduleSpecificFlagsPaths, &flagFileInfo) - - b.generateHiddenAPIStubFlagsRules(ctx, hiddenAPISupportingModules) - b.generateHiddenAPIIndexRules(ctx, hiddenAPISupportingModules) - b.generatedHiddenAPIMetadataRules(ctx, hiddenAPISupportingModules) -} - -func (b *platformBootclasspathModule) generateHiddenAPIStubFlagsRules(ctx android.ModuleContext, modules []hiddenAPISupportingModule) { - bootDexJars := android.Paths{} - for _, module := range modules { - bootDexJars = append(bootDexJars, module.bootDexJar) - } + hiddenAPIModules := gatherHiddenAPIModuleFromContents(ctx, modules) sdkKindToStubPaths := hiddenAPIGatherStubLibDexJarPaths(ctx, nil) - outputPath := hiddenAPISingletonPaths(ctx).stubFlags - rule := ruleToGenerateHiddenAPIStubFlagsFile(ctx, outputPath, bootDexJars, sdkKindToStubPaths) + // Generate the monolithic stub-flags.csv file. + bootDexJars := extractBootDexJarsFromHiddenAPIModules(ctx, hiddenAPIModules) + stubFlags := hiddenAPISingletonPaths(ctx).stubFlags + rule := ruleToGenerateHiddenAPIStubFlagsFile(ctx, stubFlags, bootDexJars, sdkKindToStubPaths) rule.Build("platform-bootclasspath-monolithic-hiddenapi-stub-flags", "monolithic hidden API stub flags") -} -func (b *platformBootclasspathModule) generateHiddenAPIIndexRules(ctx android.ModuleContext, modules []hiddenAPISupportingModule) { - indexes := android.Paths{} - for _, module := range modules { - indexes = append(indexes, module.indexCSV) - } + // Extract the classes jars from the contents. + classesJars := extractClassJarsFromHiddenAPIModules(ctx, hiddenAPIModules) - rule := android.NewRuleBuilder(pctx, ctx) - rule.Command(). - BuiltTool("merge_csv"). - Flag("--key_field signature"). - FlagWithArg("--header=", "signature,file,startline,startcol,endline,endcol,properties"). - FlagWithOutput("--output=", hiddenAPISingletonPaths(ctx).index). - Inputs(indexes) - rule.Build("platform-bootclasspath-monolithic-hiddenapi-index", "monolithic hidden API index") -} + // Generate the annotation-flags.csv file from all the module annotations. + annotationFlags := android.PathForModuleOut(ctx, "hiddenapi-monolithic", "annotation-flags.csv") + buildRuleToGenerateAnnotationFlags(ctx, "monolithic hiddenapi flags", classesJars, stubFlags, annotationFlags) -func (b *platformBootclasspathModule) generatedHiddenAPIMetadataRules(ctx android.ModuleContext, modules []hiddenAPISupportingModule) { - metadataCSVFiles := android.Paths{} - for _, module := range modules { - metadataCSVFiles = append(metadataCSVFiles, module.metadataCSV) - } + // Generate the monotlithic hiddenapi-flags.csv file. + allFlags := hiddenAPISingletonPaths(ctx).flags + buildRuleToGenerateHiddenApiFlags(ctx, "hiddenAPIFlagsFile", "hiddenapi flags", allFlags, stubFlags, annotationFlags, &flagFileInfo) - rule := android.NewRuleBuilder(pctx, ctx) + // Generate an intermediate monolithic hiddenapi-metadata.csv file directly from the annotations + // in the source code. + intermediateMetadataCSV := android.PathForModuleOut(ctx, "hiddenapi-monolithic", "intermediate-metadata.csv") + buildRuleToGenerateMetadata(ctx, "monolithic hidden API metadata", classesJars, stubFlags, intermediateMetadataCSV) + + // Reformat the intermediate file to add | quotes just in case that is important for the tools + // that consume the metadata file. + // TODO(b/179354495): Investigate whether it is possible to remove this reformatting step. + metadataCSV := hiddenAPISingletonPaths(ctx).metadata + b.buildRuleMergeCSV(ctx, "reformat monolithic hidden API metadata", android.Paths{intermediateMetadataCSV}, metadataCSV) - outputPath := hiddenAPISingletonPaths(ctx).metadata + // Generate the monolithic hiddenapi-index.csv file directly from the CSV files in the classes + // jars. + indexCSV := hiddenAPISingletonPaths(ctx).index + buildRuleToGenerateIndex(ctx, "monolithic hidden API index", classesJars, indexCSV) +} +func (b *platformBootclasspathModule) buildRuleMergeCSV(ctx android.ModuleContext, desc string, inputPaths android.Paths, outputPath android.WritablePath) { + rule := android.NewRuleBuilder(pctx, ctx) rule.Command(). BuiltTool("merge_csv"). Flag("--key_field signature"). FlagWithOutput("--output=", outputPath). - Inputs(metadataCSVFiles) + Inputs(inputPaths) - rule.Build("platform-bootclasspath-monolithic-hiddenapi-metadata", "monolithic hidden API metadata") + rule.Build(desc, desc) } // generateHiddenApiMakeVars generates make variables needed by hidden API related make rules, e.g. |