diff --git a/java/hiddenapi_modular.go b/java/hiddenapi_modular.go index eef032099..bed11fe39 100644 --- a/java/hiddenapi_modular.go +++ b/java/hiddenapi_modular.go @@ -20,7 +20,7 @@ import ( // Contains support for processing hiddenAPI in a modular fashion. -// hiddenAPIAugmentationInfo contains paths to the files that can be used to augment the information +// HiddenAPIAugmentationProperties contains paths to the files that can be used to augment the information // obtained from annotations within the source code in order to create the complete set of flags // that should be applied to the dex implementation jars on the bootclasspath. // @@ -31,31 +31,142 @@ import ( // The Unsupported_packages property contains a list of paths, each of which is a plain text file // with one Java package per line. All members of all classes within that package (but not nested // packages) will be updated in a property specific way. -type hiddenAPIAugmentationInfo struct { +type HiddenAPIAugmentationProperties struct { // Marks each signature in the referenced files as being unsupported. - Unsupported android.Paths + Unsupported []string `android:"path"` // Marks each signature in the referenced files as being unsupported because it has been removed. // Any conflicts with other flags are ignored. - Removed android.Paths + Removed []string `android:"path"` // Marks each signature in the referenced files as being supported only for targetSdkVersion <= R // and low priority. - Max_target_r_low_priority android.Paths + Max_target_r_low_priority []string `android:"path"` // Marks each signature in the referenced files as being supported only for targetSdkVersion <= Q. - Max_target_q android.Paths + Max_target_q []string `android:"path"` // Marks each signature in the referenced files as being supported only for targetSdkVersion <= P. - Max_target_p android.Paths + Max_target_p []string `android:"path"` // Marks each signature in the referenced files as being supported only for targetSdkVersion <= O // and low priority. Any conflicts with other flags are ignored. - Max_target_o_low_priority android.Paths + Max_target_o_low_priority []string `android:"path"` // Marks each signature in the referenced files as being blocked. - Blocked android.Paths + Blocked []string `android:"path"` // Marks each signature in every package in the referenced files as being unsupported. + Unsupported_packages []string `android:"path"` +} + +func (p *HiddenAPIAugmentationProperties) hiddenAPIAugmentationInfo(ctx android.ModuleContext) hiddenAPIAugmentationInfo { + paths := func(paths []string) android.Paths { return android.PathsForModuleSrc(ctx, paths) } + return hiddenAPIAugmentationInfo{ + Unsupported: paths(p.Unsupported), + Removed: paths(p.Removed), + Max_target_r_low_priority: paths(p.Max_target_r_low_priority), + Max_target_q: paths(p.Max_target_q), + Max_target_p: paths(p.Max_target_p), + Max_target_o_low_priority: paths(p.Max_target_o_low_priority), + Blocked: paths(p.Blocked), + Unsupported_packages: paths(p.Unsupported_packages), + } +} + +// hiddenAPIAugmentationInfo contains paths resolved from HiddenAPIAugmentationProperties +type hiddenAPIAugmentationInfo struct { + // See HiddenAPIAugmentationProperties.Unsupported + Unsupported android.Paths + + // See HiddenAPIAugmentationProperties.Removed + Removed android.Paths + + // See HiddenAPIAugmentationProperties.Max_target_r_low_priority + Max_target_r_low_priority android.Paths + + // See HiddenAPIAugmentationProperties.Max_target_q + Max_target_q android.Paths + + // See HiddenAPIAugmentationProperties.Max_target_p + Max_target_p android.Paths + + // See HiddenAPIAugmentationProperties.Max_target_o_low_priority + Max_target_o_low_priority android.Paths + + // See HiddenAPIAugmentationProperties.Blocked + Blocked android.Paths + + // See HiddenAPIAugmentationProperties.Unsupported_packages Unsupported_packages android.Paths } + +// ruleToGenerateHiddenApiFlags creates a rule to create the monolithic hidden API flags from the +// flags from all the modules, the stub flags, augmented with some additional configuration files. +// +// baseFlagsPath is the path to the flags file containing all the information from the stubs plus +// an entry for every single member in the dex implementation jars of the individual modules. Every +// signature in any of the other files MUST be included in this file. +// +// moduleSpecificFlagsPaths are the paths to the flags files generated by each module using +// information from the baseFlagsPath as well as from annotations within the source. +// +// augmentationInfo is a struct containing paths to files that augment the information provided by +// the moduleSpecificFlagsPaths. +// ruleToGenerateHiddenApiFlags creates a rule to create the monolithic hidden API flags from the +// flags from all the modules, the stub flags, augmented with some additional configuration files. +// +// baseFlagsPath is the path to the flags file containing all the information from the stubs plus +// an entry for every single member in the dex implementation jars of the individual modules. Every +// signature in any of the other files MUST be included in this file. +// +// moduleSpecificFlagsPaths are the paths to the flags files generated by each module using +// information from the baseFlagsPath as well as from annotations within the source. +// +// augmentationInfo is a struct containing paths to files that augment the information provided by +// the moduleSpecificFlagsPaths. +func ruleToGenerateHiddenApiFlags(ctx android.BuilderContext, outputPath android.WritablePath, baseFlagsPath android.Path, moduleSpecificFlagsPaths android.Paths, augmentationInfo hiddenAPIAugmentationInfo) { + tempPath := android.PathForOutput(ctx, outputPath.Rel()+".tmp") + rule := android.NewRuleBuilder(pctx, ctx) + command := rule.Command(). + BuiltTool("generate_hiddenapi_lists"). + FlagWithInput("--csv ", baseFlagsPath). + Inputs(moduleSpecificFlagsPaths). + FlagWithOutput("--output ", tempPath) + + for _, path := range augmentationInfo.Unsupported { + command.FlagWithInput("--unsupported ", path) + } + + for _, path := range augmentationInfo.Removed { + command.FlagWithInput("--unsupported ", path).Flag("--ignore-conflicts ").FlagWithArg("--tag ", "removed") + } + + for _, path := range augmentationInfo.Max_target_r_low_priority { + command.FlagWithInput("--max-target-r ", path).FlagWithArg("--tag ", "lo-prio") + } + + for _, path := range augmentationInfo.Max_target_q { + command.FlagWithInput("--max-target-q ", path) + } + + for _, path := range augmentationInfo.Max_target_p { + command.FlagWithInput("--max-target-p ", path) + } + + for _, path := range augmentationInfo.Max_target_o_low_priority { + command.FlagWithInput("--max-target-o ", path).Flag("--ignore-conflicts ").FlagWithArg("--tag ", "lo-prio") + } + + for _, path := range augmentationInfo.Blocked { + command.FlagWithInput("--blocked ", path) + } + + for _, path := range augmentationInfo.Unsupported_packages { + command.FlagWithInput("--unsupported ", path).Flag("--packages ") + } + + commitChangeForRestat(rule, tempPath, outputPath) + + rule.Build("hiddenAPIFlagsFile", "hiddenapi flags") +} diff --git a/java/hiddenapi_singleton.go b/java/hiddenapi_singleton.go index 341381ae9..641e19f60 100644 --- a/java/hiddenapi_singleton.go +++ b/java/hiddenapi_singleton.go @@ -18,7 +18,6 @@ import ( "fmt" "android/soong/android" - "android/soong/genrule" ) func init() { @@ -321,109 +320,13 @@ func prebuiltFlagsRule(ctx android.SingletonContext) android.Path { return outputPath } -// flagsRule creates a rule to build hiddenapi-flags.csv out of flags.csv files generated for boot image modules and -// the unsupported API. +// flagsRule is a placeholder that simply returns the location of the file, the generation of the +// ninja rules is done in generateHiddenAPIBuildActions. func flagsRule(ctx android.SingletonContext) android.Path { - var flagsCSV android.Paths - var combinedRemovedApis android.Path - - ctx.VisitAllModules(func(module android.Module) { - if h, ok := module.(hiddenAPIIntf); ok { - if csv := h.flagsCSV(); csv != nil { - flagsCSV = append(flagsCSV, csv) - } - } else if g, ok := module.(*genrule.Module); ok { - if ctx.ModuleName(module) == "combined-removed-dex" { - if len(g.GeneratedSourceFiles()) != 1 || combinedRemovedApis != nil { - ctx.Errorf("Expected 1 combined-removed-dex module that generates 1 output file.") - } - combinedRemovedApis = g.GeneratedSourceFiles()[0] - } - } - }) - - if combinedRemovedApis == nil { - ctx.Errorf("Failed to find combined-removed-dex.") - } - outputPath := hiddenAPISingletonPaths(ctx).flags - - stubFlags := hiddenAPISingletonPaths(ctx).stubFlags - - pathsForSource := func(paths ...string) android.Paths { return android.PathsForSource(ctx, paths) } - - ruleToGenerateHiddenApiFlags(ctx, outputPath, stubFlags, flagsCSV, hiddenAPIAugmentationInfo{ - Unsupported: pathsForSource("frameworks/base/boot/hiddenapi/hiddenapi-unsupported.txt"), - Removed: android.Paths{combinedRemovedApis}, - Max_target_r_low_priority: pathsForSource("frameworks/base/boot/hiddenapi/hiddenapi-max-target-r-loprio.txt"), - Max_target_q: pathsForSource("frameworks/base/boot/hiddenapi/hiddenapi-max-target-q.txt"), - Max_target_p: pathsForSource("frameworks/base/boot/hiddenapi/hiddenapi-max-target-p.txt"), - Max_target_o_low_priority: pathsForSource("frameworks/base/boot/hiddenapi/hiddenapi-max-target-o.txt"), - Blocked: pathsForSource("frameworks/base/boot/hiddenapi/hiddenapi-force-blocked.txt"), - Unsupported_packages: pathsForSource("frameworks/base/boot/hiddenapi/hiddenapi-unsupported-packages.txt"), - }) - return outputPath } -// ruleToGenerateHiddenApiFlags creates a rule to create the monolithic hidden API flags from the -// flags from all the modules, the stub flags, augmented with some additional configuration files. -// -// baseFlagsPath is the path to the flags file containing all the information from the stubs plus -// an entry for every single member in the dex implementation jars of the individual modules. Every -// signature in any of the other files MUST be included in this file. -// -// moduleSpecificFlagsPaths are the paths to the flags files generated by each module using -// information from the baseFlagsPath as well as from annotations within the source. -// -// augmentationInfo is a struct containing paths to files that augment the information provided by -// the moduleSpecificFlagsPaths. -func ruleToGenerateHiddenApiFlags(ctx android.BuilderContext, outputPath android.WritablePath, baseFlagsPath android.Path, moduleSpecificFlagsPaths android.Paths, augmentationInfo hiddenAPIAugmentationInfo) { - tempPath := android.PathForOutput(ctx, outputPath.Rel()+".tmp") - rule := android.NewRuleBuilder(pctx, ctx) - command := rule.Command(). - BuiltTool("generate_hiddenapi_lists"). - FlagWithInput("--csv ", baseFlagsPath). - Inputs(moduleSpecificFlagsPaths). - FlagWithOutput("--output ", tempPath) - - for _, path := range augmentationInfo.Unsupported { - command.FlagWithInput("--unsupported ", path) - } - - for _, path := range augmentationInfo.Removed { - command.FlagWithInput("--unsupported ", path).Flag("--ignore-conflicts ").FlagWithArg("--tag ", "removed") - } - - for _, path := range augmentationInfo.Max_target_r_low_priority { - command.FlagWithInput("--max-target-r ", path).FlagWithArg("--tag ", "lo-prio") - } - - for _, path := range augmentationInfo.Max_target_q { - command.FlagWithInput("--max-target-q ", path) - } - - for _, path := range augmentationInfo.Max_target_p { - command.FlagWithInput("--max-target-p ", path) - } - - for _, path := range augmentationInfo.Max_target_o_low_priority { - command.FlagWithInput("--max-target-o ", path).Flag("--ignore-conflicts ").FlagWithArg("--tag ", "lo-prio") - } - - for _, path := range augmentationInfo.Blocked { - command.FlagWithInput("--blocked ", path) - } - - for _, path := range augmentationInfo.Unsupported_packages { - command.FlagWithInput("--unsupported ", path).Flag("--packages ") - } - - commitChangeForRestat(rule, tempPath, outputPath) - - rule.Build("hiddenAPIFlagsFile", "hiddenapi flags") -} - // emptyFlagsRule creates a rule to build an empty hiddenapi-flags.csv, which is needed by master-art-host builds that // have a partial manifest without frameworks/base but still need to build a boot image. func emptyFlagsRule(ctx android.SingletonContext) android.Path { diff --git a/java/platform_bootclasspath.go b/java/platform_bootclasspath.go index 95d19b96e..e292d8057 100644 --- a/java/platform_bootclasspath.go +++ b/java/platform_bootclasspath.go @@ -84,10 +84,11 @@ type ApexVariantReference struct { } type platformBootclasspathProperties struct { - // The names of the bootclasspath_fragment modules that form part of this // platform_bootclasspath. Fragments []ApexVariantReference + + Hidden_api HiddenAPIAugmentationProperties } func platformBootclasspathFactory() android.Module { @@ -191,6 +192,8 @@ func (b *platformBootclasspathModule) GenerateAndroidBuildActions(ctx android.Mo } }) + b.generateHiddenAPIBuildActions(ctx, b.configuredModules) + // Nothing to do if skipping the dexpreopt of boot image jars. if SkipDexpreoptBootJars(ctx) { return @@ -215,3 +218,24 @@ func (b *platformBootclasspathModule) GenerateAndroidBuildActions(ctx android.Mo func (b *platformBootclasspathModule) getImageConfig(ctx android.EarlyModuleContext) *bootImageConfig { return defaultBootImageConfig(ctx) } + +// generateHiddenAPIBuildActions generates all the hidden API related build rules. +func (b *platformBootclasspathModule) generateHiddenAPIBuildActions(ctx android.ModuleContext, modules []android.Module) { + + moduleSpecificFlagsPaths := android.Paths{} + for _, module := range modules { + if h, ok := module.(hiddenAPIIntf); ok { + if csv := h.flagsCSV(); csv != nil { + moduleSpecificFlagsPaths = append(moduleSpecificFlagsPaths, csv) + } + } else { + ctx.ModuleErrorf("module %s of type %s does not implement hiddenAPIIntf", module, ctx.OtherModuleType(module)) + } + } + + augmentationInfo := b.properties.Hidden_api.hiddenAPIAugmentationInfo(ctx) + + outputPath := hiddenAPISingletonPaths(ctx).flags + baseFlagsPath := hiddenAPISingletonPaths(ctx).stubFlags + ruleToGenerateHiddenApiFlags(ctx, outputPath, baseFlagsPath, moduleSpecificFlagsPaths, augmentationInfo) +}