diff --git a/java/bootclasspath_fragment.go b/java/bootclasspath_fragment.go index 10d2fe21e..fc8f5571e 100644 --- a/java/bootclasspath_fragment.go +++ b/java/bootclasspath_fragment.go @@ -140,7 +140,7 @@ type commonBootclasspathFragment interface { // produceHiddenAPIAllFlagsFile produces the all-flags.csv and intermediate files. // // Updates the supplied hiddenAPIInfo with the paths to the generated files set. - produceHiddenAPIAllFlagsFile(ctx android.ModuleContext, contents []hiddenAPIModule, input HiddenAPIFlagInput) *HiddenAPIFlagOutput + produceHiddenAPIAllFlagsFile(ctx android.ModuleContext, contents []android.Module, input HiddenAPIFlagInput) *HiddenAPIFlagOutput } var _ commonBootclasspathFragment = (*BootclasspathFragmentModule)(nil) @@ -465,7 +465,7 @@ func (b *BootclasspathFragmentModule) populateApexContentInfoDexJars(ctx android if unencodedDex == nil { // This is an error. Sometimes Soong will report the error directly, other times it will // defer the error reporting to happen only when trying to use the missing file in ninja. - // Either way it is handled by extractBootDexJarsFromHiddenAPIModules which must have been + // Either way it is handled by extractBootDexJarsFromModules which must have been // called before this as it generates the flags that are used to encode these files. continue } @@ -561,12 +561,9 @@ func (b *BootclasspathFragmentModule) generateHiddenAPIBuildActions(ctx android. // TODO(b/179354495): Stop hidden API processing being conditional once all bootclasspath_fragment // modules have been updated to support it. if input.canPerformHiddenAPIProcessing(ctx, b.properties) { - // Get the content modules that contribute to the hidden API processing. - hiddenAPIModules := gatherHiddenAPIModuleFromContents(ctx, contents) - // Delegate the production of the hidden API all-flags.csv file to a module type specific method. common := ctx.Module().(commonBootclasspathFragment) - output = common.produceHiddenAPIAllFlagsFile(ctx, hiddenAPIModules, input) + output = common.produceHiddenAPIAllFlagsFile(ctx, contents, input) } // Initialize a HiddenAPIInfo structure. @@ -620,7 +617,7 @@ func (b *BootclasspathFragmentModule) createHiddenAPIFlagInput(ctx android.Modul // produceHiddenAPIAllFlagsFile produces the hidden API all-flags.csv file (and supporting files) // for the fragment. -func (b *BootclasspathFragmentModule) produceHiddenAPIAllFlagsFile(ctx android.ModuleContext, contents []hiddenAPIModule, input HiddenAPIFlagInput) *HiddenAPIFlagOutput { +func (b *BootclasspathFragmentModule) produceHiddenAPIAllFlagsFile(ctx android.ModuleContext, contents []android.Module, input HiddenAPIFlagInput) *HiddenAPIFlagOutput { // Generate the rules to create the hidden API flags and update the supplied hiddenAPIInfo with the // paths to the created files. return hiddenAPIGenerateAllFlagsForBootclasspathFragment(ctx, contents, input) @@ -841,7 +838,7 @@ func (module *prebuiltBootclasspathFragmentModule) Name() string { // produceHiddenAPIAllFlagsFile returns a path to the prebuilt all-flags.csv or nil if none is // specified. -func (module *prebuiltBootclasspathFragmentModule) produceHiddenAPIAllFlagsFile(ctx android.ModuleContext, contents []hiddenAPIModule, _ HiddenAPIFlagInput) *HiddenAPIFlagOutput { +func (module *prebuiltBootclasspathFragmentModule) produceHiddenAPIAllFlagsFile(ctx android.ModuleContext, contents []android.Module, _ HiddenAPIFlagInput) *HiddenAPIFlagOutput { pathForOptionalSrc := func(src *string) android.Path { if src == nil { // TODO(b/179354495): Fail if this is not provided once prebuilts have been updated. diff --git a/java/hiddenapi_modular.go b/java/hiddenapi_modular.go index 5600645e3..643c5cba2 100644 --- a/java/hiddenapi_modular.go +++ b/java/hiddenapi_modular.go @@ -679,11 +679,11 @@ func buildRuleToGenerateHiddenApiFlags(ctx android.BuilderContext, name, desc st // * metadata.csv // * index.csv // * all-flags.csv -func hiddenAPIGenerateAllFlagsForBootclasspathFragment(ctx android.ModuleContext, contents []hiddenAPIModule, input HiddenAPIFlagInput) *HiddenAPIFlagOutput { +func hiddenAPIGenerateAllFlagsForBootclasspathFragment(ctx android.ModuleContext, contents []android.Module, input HiddenAPIFlagInput) *HiddenAPIFlagOutput { hiddenApiSubDir := "modular-hiddenapi" // Gather the dex files for the boot libraries provided by this fragment. - bootDexJars := extractBootDexJarsFromHiddenAPIModules(ctx, contents) + bootDexJars := extractBootDexJarsFromModules(ctx, contents) // Generate the stub-flags.csv. stubFlagsCSV := android.PathForModuleOut(ctx, hiddenApiSubDir, "stub-flags.csv") @@ -691,7 +691,7 @@ func hiddenAPIGenerateAllFlagsForBootclasspathFragment(ctx android.ModuleContext rule.Build("modularHiddenAPIStubFlagsFile", "modular hiddenapi stub flags") // Extract the classes jars from the contents. - classesJars := extractClassJarsFromHiddenAPIModules(ctx, contents) + classesJars := extractClassesJarsFromModules(contents) // Generate the set of flags from the annotations in the source code. annotationFlagsCSV := android.PathForModuleOut(ctx, hiddenApiSubDir, "annotation-flags.csv") @@ -746,26 +746,15 @@ func buildRuleToGenerateRemovedDexSignatures(ctx android.ModuleContext, removedT return android.OptionalPathForPath(output) } -// gatherHiddenAPIModuleFromContents gathers the hiddenAPIModule from the supplied contents. -func gatherHiddenAPIModuleFromContents(ctx android.ModuleContext, contents []android.Module) []hiddenAPIModule { - hiddenAPIModules := []hiddenAPIModule{} - for _, module := range contents { - if hiddenAPI, ok := module.(hiddenAPIModule); ok { - hiddenAPIModules = append(hiddenAPIModules, hiddenAPI) - } else if _, ok := module.(*DexImport); ok { - // Ignore this for the purposes of hidden API processing - } else { - ctx.ModuleErrorf("module %s does not implement hiddenAPIModule", module) - } - } - return hiddenAPIModules -} - -// extractBootDexJarsFromHiddenAPIModules extracts the boot dex jars from the supplied modules. -func extractBootDexJarsFromHiddenAPIModules(ctx android.ModuleContext, contents []hiddenAPIModule) android.Paths { +// extractBootDexJarsFromModules extracts the boot dex jars from the supplied modules. +func extractBootDexJarsFromModules(ctx android.ModuleContext, contents []android.Module) android.Paths { bootDexJars := android.Paths{} for _, module := range contents { - bootDexJar := module.bootDexJar() + hiddenAPIModule := hiddenAPIModuleFromModule(ctx, module) + if hiddenAPIModule == nil { + continue + } + bootDexJar := hiddenAPIModule.bootDexJar() if bootDexJar == nil { if ctx.Config().AlwaysUsePrebuiltSdks() { // TODO(b/179354495): Remove this workaround when it is unnecessary. @@ -793,15 +782,36 @@ func extractBootDexJarsFromHiddenAPIModules(ctx android.ModuleContext, contents return bootDexJars } -// extractClassJarsFromHiddenAPIModules extracts the class jars from the supplied modules. -func extractClassJarsFromHiddenAPIModules(ctx android.ModuleContext, contents []hiddenAPIModule) android.Paths { +func hiddenAPIModuleFromModule(ctx android.BaseModuleContext, module android.Module) hiddenAPIModule { + if hiddenAPIModule, ok := module.(hiddenAPIModule); ok { + return hiddenAPIModule + } else if _, ok := module.(*DexImport); ok { + // Ignore this for the purposes of hidden API processing + } else { + ctx.ModuleErrorf("module %s does not implement hiddenAPIModule", module) + } + + return nil +} + +// extractClassesJarsFromModules extracts the class jars from the supplied modules. +func extractClassesJarsFromModules(contents []android.Module) android.Paths { classesJars := android.Paths{} for _, module := range contents { - classesJars = append(classesJars, module.classesJars()...) + classesJars = append(classesJars, retrieveClassesJarsFromModule(module)...) } return classesJars } +// retrieveClassesJarsFromModule retrieves the classes jars from the supplied module. +func retrieveClassesJarsFromModule(module android.Module) android.Paths { + if hiddenAPIModule, ok := module.(hiddenAPIModule); ok { + return hiddenAPIModule.classesJars() + } + + return nil +} + // deferReportingMissingBootDexJar returns true if a missing boot dex jar should not be reported by // Soong but should instead only be reported in ninja if the file is actually built. func deferReportingMissingBootDexJar(ctx android.ModuleContext, module android.Module) bool { diff --git a/java/platform_bootclasspath.go b/java/platform_bootclasspath.go index a4beb8970..fba73d0c1 100644 --- a/java/platform_bootclasspath.go +++ b/java/platform_bootclasspath.go @@ -290,16 +290,14 @@ func (b *platformBootclasspathModule) generateHiddenAPIBuildActions(ctx android. // Use the flag files from this module and all the fragments. input.FlagFilesByCategory = monolithicInfo.FlagsFilesByCategory - hiddenAPIModules := gatherHiddenAPIModuleFromContents(ctx, modules) - // Generate the monolithic stub-flags.csv file. - bootDexJars := extractBootDexJarsFromHiddenAPIModules(ctx, hiddenAPIModules) + bootDexJars := extractBootDexJarsFromModules(ctx, modules) stubFlags := hiddenAPISingletonPaths(ctx).stubFlags rule := ruleToGenerateHiddenAPIStubFlagsFile(ctx, stubFlags, bootDexJars, input) rule.Build("platform-bootclasspath-monolithic-hiddenapi-stub-flags", "monolithic hidden API stub flags") // Extract the classes jars from the contents. - classesJars := extractClassJarsFromHiddenAPIModules(ctx, hiddenAPIModules) + classesJars := extractClassesJarsFromModules(modules) // Generate the annotation-flags.csv file from all the module annotations. annotationFlags := android.PathForModuleOut(ctx, "hiddenapi-monolithic", "annotation-flags.csv")