Generate hidden API flags for a bootclasspath_fragment am: 2fef136885
am: c23b7e4d5b
Original change: https://android-review.googlesource.com/c/platform/build/soong/+/1705308 Change-Id: I6a5f1667db83ce176179b520621eb47b074d326b
This commit is contained in:
@@ -120,6 +120,15 @@ type BootclasspathFragmentModule struct {
|
|||||||
properties bootclasspathFragmentProperties
|
properties bootclasspathFragmentProperties
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// commonBootclasspathFragment defines the methods that are implemented by both source and prebuilt
|
||||||
|
// bootclasspath fragment modules.
|
||||||
|
type commonBootclasspathFragment interface {
|
||||||
|
// produceHiddenAPIAllFlagsFile produces the all-flags.csv and intermediate files.
|
||||||
|
//
|
||||||
|
// Updates the supplied flagFileInfo with the paths to the generated files set.
|
||||||
|
produceHiddenAPIAllFlagsFile(ctx android.ModuleContext, contents []android.Module, stubJarsByKind map[android.SdkKind]android.Paths, flagFileInfo *hiddenAPIFlagFileInfo)
|
||||||
|
}
|
||||||
|
|
||||||
func bootclasspathFragmentFactory() android.Module {
|
func bootclasspathFragmentFactory() android.Module {
|
||||||
m := &BootclasspathFragmentModule{}
|
m := &BootclasspathFragmentModule{}
|
||||||
m.AddProperties(&m.properties)
|
m.AddProperties(&m.properties)
|
||||||
@@ -381,7 +390,7 @@ func (b *BootclasspathFragmentModule) GenerateAndroidBuildActions(ctx android.Mo
|
|||||||
})
|
})
|
||||||
|
|
||||||
// Perform hidden API processing.
|
// Perform hidden API processing.
|
||||||
b.generateHiddenAPIBuildActions(ctx)
|
b.generateHiddenAPIBuildActions(ctx, contents)
|
||||||
|
|
||||||
// Construct the boot image info from the config.
|
// Construct the boot image info from the config.
|
||||||
info := BootclasspathFragmentApexContentInfo{
|
info := BootclasspathFragmentApexContentInfo{
|
||||||
@@ -441,12 +450,7 @@ func (b *BootclasspathFragmentModule) getImageConfig(ctx android.EarlyModuleCont
|
|||||||
}
|
}
|
||||||
|
|
||||||
// generateHiddenAPIBuildActions generates all the hidden API related build rules.
|
// generateHiddenAPIBuildActions generates all the hidden API related build rules.
|
||||||
func (b *BootclasspathFragmentModule) generateHiddenAPIBuildActions(ctx android.ModuleContext) {
|
func (b *BootclasspathFragmentModule) generateHiddenAPIBuildActions(ctx android.ModuleContext, contents []android.Module) {
|
||||||
// Resolve the properties to paths.
|
|
||||||
flagFileInfo := b.properties.Hidden_api.hiddenAPIFlagFileInfo(ctx)
|
|
||||||
|
|
||||||
// Store the information for use by platform_bootclasspath.
|
|
||||||
ctx.SetProvider(hiddenAPIFlagFileInfoProvider, flagFileInfo)
|
|
||||||
|
|
||||||
// Convert the kind specific lists of modules into kind specific lists of jars.
|
// Convert the kind specific lists of modules into kind specific lists of jars.
|
||||||
stubJarsByKind := hiddenAPIGatherStubLibDexJarPaths(ctx)
|
stubJarsByKind := hiddenAPIGatherStubLibDexJarPaths(ctx)
|
||||||
@@ -454,6 +458,33 @@ func (b *BootclasspathFragmentModule) generateHiddenAPIBuildActions(ctx android.
|
|||||||
// Store the information for use by other modules.
|
// Store the information for use by other modules.
|
||||||
bootclasspathApiInfo := bootclasspathApiInfo{stubJarsByKind: stubJarsByKind}
|
bootclasspathApiInfo := bootclasspathApiInfo{stubJarsByKind: stubJarsByKind}
|
||||||
ctx.SetProvider(bootclasspathApiInfoProvider, bootclasspathApiInfo)
|
ctx.SetProvider(bootclasspathApiInfoProvider, bootclasspathApiInfo)
|
||||||
|
|
||||||
|
// Resolve the properties to paths.
|
||||||
|
flagFileInfo := b.properties.Hidden_api.hiddenAPIFlagFileInfo(ctx)
|
||||||
|
|
||||||
|
// Delegate the production of the hidden API all flags file to a module type specific method.
|
||||||
|
common := ctx.Module().(commonBootclasspathFragment)
|
||||||
|
common.produceHiddenAPIAllFlagsFile(ctx, contents, stubJarsByKind, &flagFileInfo)
|
||||||
|
|
||||||
|
// Store the information for use by platform_bootclasspath.
|
||||||
|
ctx.SetProvider(hiddenAPIFlagFileInfoProvider, flagFileInfo)
|
||||||
|
}
|
||||||
|
|
||||||
|
// produceHiddenAPIAllFlagsFile produces the hidden API all-flags.csv file (and supporting files)
|
||||||
|
// for the fragment.
|
||||||
|
func (b *BootclasspathFragmentModule) produceHiddenAPIAllFlagsFile(ctx android.ModuleContext, contents []android.Module, stubJarsByKind map[android.SdkKind]android.Paths, flagFileInfo *hiddenAPIFlagFileInfo) {
|
||||||
|
// If no stubs have been provided then don't perform hidden API processing. This is a temporary
|
||||||
|
// workaround to avoid existing bootclasspath_fragments that do not provide stubs breaking the
|
||||||
|
// build.
|
||||||
|
// TODO(b/179354495): Remove this workaround.
|
||||||
|
if len(stubJarsByKind) == 0 {
|
||||||
|
// Nothing to do.
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate the rules to create the hidden API flags and update the supplied flagFileInfo with the
|
||||||
|
// paths to the created files.
|
||||||
|
hiddenAPIGenerateAllFlagsForBootclasspathFragment(ctx, contents, stubJarsByKind, flagFileInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
// generateBootImageBuildActions generates ninja rules to create the boot image if required for this
|
// generateBootImageBuildActions generates ninja rules to create the boot image if required for this
|
||||||
@@ -534,6 +565,32 @@ type bootclasspathFragmentSdkMemberProperties struct {
|
|||||||
|
|
||||||
// Flag files by *hiddenAPIFlagFileCategory
|
// Flag files by *hiddenAPIFlagFileCategory
|
||||||
Flag_files_by_category map[*hiddenAPIFlagFileCategory]android.Paths
|
Flag_files_by_category map[*hiddenAPIFlagFileCategory]android.Paths
|
||||||
|
|
||||||
|
// The path to the generated stub-flags.csv file.
|
||||||
|
Stub_flags_path android.OptionalPath
|
||||||
|
|
||||||
|
// The path to the generated annotation-flags.csv file.
|
||||||
|
Annotation_flags_path android.OptionalPath
|
||||||
|
|
||||||
|
// The path to the generated metadata.csv file.
|
||||||
|
Metadata_path android.OptionalPath
|
||||||
|
|
||||||
|
// The path to the generated index.csv file.
|
||||||
|
Index_path android.OptionalPath
|
||||||
|
|
||||||
|
// The path to the generated all-flags.csv file.
|
||||||
|
All_flags_path android.OptionalPath
|
||||||
|
}
|
||||||
|
|
||||||
|
func pathsToOptionalPath(paths android.Paths) android.OptionalPath {
|
||||||
|
switch len(paths) {
|
||||||
|
case 0:
|
||||||
|
return android.OptionalPath{}
|
||||||
|
case 1:
|
||||||
|
return android.OptionalPathForPath(paths[0])
|
||||||
|
default:
|
||||||
|
panic(fmt.Errorf("expected 0 or 1 paths, found %q", paths))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *bootclasspathFragmentSdkMemberProperties) PopulateFromVariant(ctx android.SdkMemberContext, variant android.Module) {
|
func (b *bootclasspathFragmentSdkMemberProperties) PopulateFromVariant(ctx android.SdkMemberContext, variant android.Module) {
|
||||||
@@ -547,6 +604,13 @@ func (b *bootclasspathFragmentSdkMemberProperties) PopulateFromVariant(ctx andro
|
|||||||
flagFileInfo := mctx.OtherModuleProvider(module, hiddenAPIFlagFileInfoProvider).(hiddenAPIFlagFileInfo)
|
flagFileInfo := mctx.OtherModuleProvider(module, hiddenAPIFlagFileInfoProvider).(hiddenAPIFlagFileInfo)
|
||||||
b.Flag_files_by_category = flagFileInfo.categoryToPaths
|
b.Flag_files_by_category = flagFileInfo.categoryToPaths
|
||||||
|
|
||||||
|
// Copy all the generated file paths.
|
||||||
|
b.Stub_flags_path = pathsToOptionalPath(flagFileInfo.StubFlagsPaths)
|
||||||
|
b.Annotation_flags_path = pathsToOptionalPath(flagFileInfo.AnnotationFlagsPaths)
|
||||||
|
b.Metadata_path = pathsToOptionalPath(flagFileInfo.MetadataPaths)
|
||||||
|
b.Index_path = pathsToOptionalPath(flagFileInfo.IndexPaths)
|
||||||
|
b.All_flags_path = pathsToOptionalPath(flagFileInfo.AllFlagsPaths)
|
||||||
|
|
||||||
// Copy stub_libs properties.
|
// Copy stub_libs properties.
|
||||||
b.Stub_libs = module.properties.Api.Stub_libs
|
b.Stub_libs = module.properties.Api.Stub_libs
|
||||||
b.Core_platform_stub_libs = module.properties.Core_platform_api.Stub_libs
|
b.Core_platform_stub_libs = module.properties.Core_platform_api.Stub_libs
|
||||||
@@ -573,14 +637,17 @@ func (b *bootclasspathFragmentSdkMemberProperties) AddToPropertySet(ctx android.
|
|||||||
corePlatformApiPropertySet.AddPropertyWithTag("stub_libs", b.Core_platform_stub_libs, requiredMemberDependency)
|
corePlatformApiPropertySet.AddPropertyWithTag("stub_libs", b.Core_platform_stub_libs, requiredMemberDependency)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hiddenAPISet := propertySet.AddPropertySet("hidden_api")
|
||||||
|
hiddenAPIDir := "hiddenapi"
|
||||||
|
|
||||||
|
// Copy manually curated flag files specified on the bootclasspath_fragment.
|
||||||
if b.Flag_files_by_category != nil {
|
if b.Flag_files_by_category != nil {
|
||||||
hiddenAPISet := propertySet.AddPropertySet("hidden_api")
|
|
||||||
for _, category := range hiddenAPIFlagFileCategories {
|
for _, category := range hiddenAPIFlagFileCategories {
|
||||||
paths := b.Flag_files_by_category[category]
|
paths := b.Flag_files_by_category[category]
|
||||||
if len(paths) > 0 {
|
if len(paths) > 0 {
|
||||||
dests := []string{}
|
dests := []string{}
|
||||||
for _, p := range paths {
|
for _, p := range paths {
|
||||||
dest := filepath.Join("hiddenapi", p.Base())
|
dest := filepath.Join(hiddenAPIDir, p.Base())
|
||||||
builder.CopyToSnapshot(p, dest)
|
builder.CopyToSnapshot(p, dest)
|
||||||
dests = append(dests, dest)
|
dests = append(dests, dest)
|
||||||
}
|
}
|
||||||
@@ -588,10 +655,47 @@ func (b *bootclasspathFragmentSdkMemberProperties) AddToPropertySet(ctx android.
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
copyOptionalPath := func(path android.OptionalPath, property string) {
|
||||||
|
if path.Valid() {
|
||||||
|
p := path.Path()
|
||||||
|
dest := filepath.Join(hiddenAPIDir, p.Base())
|
||||||
|
builder.CopyToSnapshot(p, dest)
|
||||||
|
hiddenAPISet.AddProperty(property, dest)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy all the generated files, if available.
|
||||||
|
copyOptionalPath(b.Stub_flags_path, "stub_flags")
|
||||||
|
copyOptionalPath(b.Annotation_flags_path, "annotation_flags")
|
||||||
|
copyOptionalPath(b.Metadata_path, "metadata")
|
||||||
|
copyOptionalPath(b.Index_path, "index")
|
||||||
|
copyOptionalPath(b.All_flags_path, "all_flags")
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ android.SdkMemberType = (*bootclasspathFragmentMemberType)(nil)
|
var _ android.SdkMemberType = (*bootclasspathFragmentMemberType)(nil)
|
||||||
|
|
||||||
|
// prebuiltBootclasspathFragmentProperties contains additional prebuilt_bootclasspath_fragment
|
||||||
|
// specific properties.
|
||||||
|
type prebuiltBootclasspathFragmentProperties struct {
|
||||||
|
Hidden_api struct {
|
||||||
|
// The path to the stub-flags.csv file created by the bootclasspath_fragment.
|
||||||
|
Stub_flags *string `android:"path"`
|
||||||
|
|
||||||
|
// The path to the annotation-flags.csv file created by the bootclasspath_fragment.
|
||||||
|
Annotation_flags *string `android:"path"`
|
||||||
|
|
||||||
|
// The path to the metadata.csv file created by the bootclasspath_fragment.
|
||||||
|
Metadata *string `android:"path"`
|
||||||
|
|
||||||
|
// The path to the index.csv file created by the bootclasspath_fragment.
|
||||||
|
Index *string `android:"path"`
|
||||||
|
|
||||||
|
// The path to the all-flags.csv file created by the bootclasspath_fragment.
|
||||||
|
All_flags *string `android:"path"`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// A prebuilt version of the bootclasspath_fragment module.
|
// A prebuilt version of the bootclasspath_fragment module.
|
||||||
//
|
//
|
||||||
// At the moment this is basically just a bootclasspath_fragment module that can be used as a
|
// At the moment this is basically just a bootclasspath_fragment module that can be used as a
|
||||||
@@ -600,6 +704,9 @@ var _ android.SdkMemberType = (*bootclasspathFragmentMemberType)(nil)
|
|||||||
type prebuiltBootclasspathFragmentModule struct {
|
type prebuiltBootclasspathFragmentModule struct {
|
||||||
BootclasspathFragmentModule
|
BootclasspathFragmentModule
|
||||||
prebuilt android.Prebuilt
|
prebuilt android.Prebuilt
|
||||||
|
|
||||||
|
// Additional prebuilt specific properties.
|
||||||
|
prebuiltProperties prebuiltBootclasspathFragmentProperties
|
||||||
}
|
}
|
||||||
|
|
||||||
func (module *prebuiltBootclasspathFragmentModule) Prebuilt() *android.Prebuilt {
|
func (module *prebuiltBootclasspathFragmentModule) Prebuilt() *android.Prebuilt {
|
||||||
@@ -610,9 +717,29 @@ func (module *prebuiltBootclasspathFragmentModule) Name() string {
|
|||||||
return module.prebuilt.Name(module.ModuleBase.Name())
|
return module.prebuilt.Name(module.ModuleBase.Name())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// produceHiddenAPIAllFlagsFile returns a path to the prebuilt all-flags.csv or nil if none is
|
||||||
|
// specified.
|
||||||
|
func (module *prebuiltBootclasspathFragmentModule) produceHiddenAPIAllFlagsFile(ctx android.ModuleContext, _ []android.Module, _ map[android.SdkKind]android.Paths, flagFileInfo *hiddenAPIFlagFileInfo) {
|
||||||
|
pathsForOptionalSrc := func(src *string) android.Paths {
|
||||||
|
if src == nil {
|
||||||
|
// TODO(b/179354495): Fail if this is not provided once prebuilts have been updated.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return android.Paths{android.PathForModuleSrc(ctx, *src)}
|
||||||
|
}
|
||||||
|
|
||||||
|
flagFileInfo.StubFlagsPaths = pathsForOptionalSrc(module.prebuiltProperties.Hidden_api.Stub_flags)
|
||||||
|
flagFileInfo.AnnotationFlagsPaths = pathsForOptionalSrc(module.prebuiltProperties.Hidden_api.Annotation_flags)
|
||||||
|
flagFileInfo.MetadataPaths = pathsForOptionalSrc(module.prebuiltProperties.Hidden_api.Metadata)
|
||||||
|
flagFileInfo.IndexPaths = pathsForOptionalSrc(module.prebuiltProperties.Hidden_api.Index)
|
||||||
|
flagFileInfo.AllFlagsPaths = pathsForOptionalSrc(module.prebuiltProperties.Hidden_api.All_flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ commonBootclasspathFragment = (*prebuiltBootclasspathFragmentModule)(nil)
|
||||||
|
|
||||||
func prebuiltBootclasspathFragmentFactory() android.Module {
|
func prebuiltBootclasspathFragmentFactory() android.Module {
|
||||||
m := &prebuiltBootclasspathFragmentModule{}
|
m := &prebuiltBootclasspathFragmentModule{}
|
||||||
m.AddProperties(&m.properties)
|
m.AddProperties(&m.properties, &m.prebuiltProperties)
|
||||||
// This doesn't actually have any prebuilt files of its own so pass a placeholder for the srcs
|
// This doesn't actually have any prebuilt files of its own so pass a placeholder for the srcs
|
||||||
// array.
|
// array.
|
||||||
android.InitPrebuiltModule(m, &[]string{"placeholder"})
|
android.InitPrebuiltModule(m, &[]string{"placeholder"})
|
||||||
|
@@ -166,7 +166,7 @@ var sdkKindToHiddenapiListOption = map[android.SdkKind]string{
|
|||||||
//
|
//
|
||||||
// The rule is initialized but not built so that the caller can modify it and select an appropriate
|
// The rule is initialized but not built so that the caller can modify it and select an appropriate
|
||||||
// name.
|
// name.
|
||||||
func ruleToGenerateHiddenAPIStubFlagsFile(ctx android.BuilderContext, outputPath android.OutputPath, bootDexJars android.Paths, sdkKindToPathList map[android.SdkKind]android.Paths) *android.RuleBuilder {
|
func ruleToGenerateHiddenAPIStubFlagsFile(ctx android.BuilderContext, outputPath android.WritablePath, bootDexJars android.Paths, sdkKindToPathList map[android.SdkKind]android.Paths) *android.RuleBuilder {
|
||||||
// Singleton rule which applies hiddenapi on all boot class path dex files.
|
// Singleton rule which applies hiddenapi on all boot class path dex files.
|
||||||
rule := android.NewRuleBuilder(pctx, ctx)
|
rule := android.NewRuleBuilder(pctx, ctx)
|
||||||
|
|
||||||
@@ -338,23 +338,49 @@ var hiddenAPIFlagFileCategories = []*hiddenAPIFlagFileCategory{
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
// hiddenAPIFlagFileInfo contains paths resolved from HiddenAPIFlagFileProperties
|
// hiddenAPIFlagFileInfo contains paths resolved from HiddenAPIFlagFileProperties and also generated
|
||||||
|
// by hidden API processing.
|
||||||
|
//
|
||||||
|
// This is used both for an individual bootclasspath_fragment to provide it to other modules and
|
||||||
|
// for a module to collate the files from the fragments it depends upon. That is why the fields are
|
||||||
|
// all Paths even though they are initialized with a single path.
|
||||||
type hiddenAPIFlagFileInfo struct {
|
type hiddenAPIFlagFileInfo struct {
|
||||||
// categoryToPaths maps from the flag file category to the paths containing information for that
|
// categoryToPaths maps from the flag file category to the paths containing information for that
|
||||||
// category.
|
// category.
|
||||||
categoryToPaths map[*hiddenAPIFlagFileCategory]android.Paths
|
categoryToPaths map[*hiddenAPIFlagFileCategory]android.Paths
|
||||||
|
|
||||||
|
// The paths to the generated stub-flags.csv files.
|
||||||
|
StubFlagsPaths android.Paths
|
||||||
|
|
||||||
|
// The paths to the generated annotation-flags.csv files.
|
||||||
|
AnnotationFlagsPaths android.Paths
|
||||||
|
|
||||||
|
// The paths to the generated metadata.csv files.
|
||||||
|
MetadataPaths android.Paths
|
||||||
|
|
||||||
|
// The paths to the generated index.csv files.
|
||||||
|
IndexPaths android.Paths
|
||||||
|
|
||||||
|
// The paths to the generated all-flags.csv files.
|
||||||
|
AllFlagsPaths android.Paths
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *hiddenAPIFlagFileInfo) append(other hiddenAPIFlagFileInfo) {
|
func (i *hiddenAPIFlagFileInfo) append(other hiddenAPIFlagFileInfo) {
|
||||||
for _, category := range hiddenAPIFlagFileCategories {
|
for _, category := range hiddenAPIFlagFileCategories {
|
||||||
i.categoryToPaths[category] = append(i.categoryToPaths[category], other.categoryToPaths[category]...)
|
i.categoryToPaths[category] = append(i.categoryToPaths[category], other.categoryToPaths[category]...)
|
||||||
}
|
}
|
||||||
|
i.StubFlagsPaths = append(i.StubFlagsPaths, other.StubFlagsPaths...)
|
||||||
|
i.AnnotationFlagsPaths = append(i.AnnotationFlagsPaths, other.AnnotationFlagsPaths...)
|
||||||
|
i.MetadataPaths = append(i.MetadataPaths, other.MetadataPaths...)
|
||||||
|
i.IndexPaths = append(i.IndexPaths, other.IndexPaths...)
|
||||||
|
i.AllFlagsPaths = append(i.AllFlagsPaths, other.AllFlagsPaths...)
|
||||||
}
|
}
|
||||||
|
|
||||||
var hiddenAPIFlagFileInfoProvider = blueprint.NewProvider(hiddenAPIFlagFileInfo{})
|
var hiddenAPIFlagFileInfoProvider = blueprint.NewProvider(hiddenAPIFlagFileInfo{})
|
||||||
|
|
||||||
// ruleToGenerateHiddenApiFlags creates a rule to create the monolithic hidden API flags from the
|
// buildRuleToGenerateHiddenApiFlags creates a rule to create the monolithic hidden API flags from
|
||||||
// flags from all the modules, the stub flags, augmented with some additional configuration files.
|
// 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
|
// 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
|
// an entry for every single member in the dex implementation jars of the individual modules. Every
|
||||||
@@ -365,19 +391,7 @@ var hiddenAPIFlagFileInfoProvider = blueprint.NewProvider(hiddenAPIFlagFileInfo{
|
|||||||
//
|
//
|
||||||
// augmentationInfo is a struct containing paths to files that augment the information provided by
|
// augmentationInfo is a struct containing paths to files that augment the information provided by
|
||||||
// the moduleSpecificFlagsPaths.
|
// the moduleSpecificFlagsPaths.
|
||||||
// ruleToGenerateHiddenApiFlags creates a rule to create the monolithic hidden API flags from the
|
func buildRuleToGenerateHiddenApiFlags(ctx android.BuilderContext, name, desc string, outputPath android.WritablePath, baseFlagsPath android.Path, moduleSpecificFlagsPaths android.Paths, flagFileInfo *hiddenAPIFlagFileInfo) {
|
||||||
// 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 hiddenAPIFlagFileInfo) {
|
|
||||||
tempPath := tempPathForRestat(ctx, outputPath)
|
tempPath := tempPathForRestat(ctx, outputPath)
|
||||||
rule := android.NewRuleBuilder(pctx, ctx)
|
rule := android.NewRuleBuilder(pctx, ctx)
|
||||||
command := rule.Command().
|
command := rule.Command().
|
||||||
@@ -388,7 +402,7 @@ func ruleToGenerateHiddenApiFlags(ctx android.BuilderContext, outputPath android
|
|||||||
|
|
||||||
// Add the options for the different categories of flag files.
|
// Add the options for the different categories of flag files.
|
||||||
for _, category := range hiddenAPIFlagFileCategories {
|
for _, category := range hiddenAPIFlagFileCategories {
|
||||||
paths := augmentationInfo.categoryToPaths[category]
|
paths := flagFileInfo.categoryToPaths[category]
|
||||||
for _, path := range paths {
|
for _, path := range paths {
|
||||||
category.commandMutator(command, path)
|
category.commandMutator(command, path)
|
||||||
}
|
}
|
||||||
@@ -396,5 +410,103 @@ func ruleToGenerateHiddenApiFlags(ctx android.BuilderContext, outputPath android
|
|||||||
|
|
||||||
commitChangeForRestat(rule, tempPath, outputPath)
|
commitChangeForRestat(rule, tempPath, outputPath)
|
||||||
|
|
||||||
rule.Build("hiddenAPIFlagsFile", "hiddenapi flags")
|
rule.Build(name, desc)
|
||||||
|
}
|
||||||
|
|
||||||
|
// hiddenAPIGenerateAllFlagsForBootclasspathFragment will generate all the flags for a fragment
|
||||||
|
// of the bootclasspath.
|
||||||
|
//
|
||||||
|
// It takes:
|
||||||
|
// * Map from android.SdkKind to stub dex jar paths defining the API for that sdk kind.
|
||||||
|
// * The list of modules that are the contents of the fragment.
|
||||||
|
// * The additional manually curated flag files to use.
|
||||||
|
//
|
||||||
|
// It generates:
|
||||||
|
// * stub-flags.csv
|
||||||
|
// * annotation-flags.csv
|
||||||
|
// * metadata.csv
|
||||||
|
// * index.csv
|
||||||
|
// * all-flags.csv
|
||||||
|
func hiddenAPIGenerateAllFlagsForBootclasspathFragment(ctx android.ModuleContext, contents []android.Module, stubJarsByKind map[android.SdkKind]android.Paths, flagFileInfo *hiddenAPIFlagFileInfo) {
|
||||||
|
|
||||||
|
hiddenApiSubDir := "modular-hiddenapi"
|
||||||
|
|
||||||
|
bootDexJars := android.Paths{}
|
||||||
|
classesJars := android.Paths{}
|
||||||
|
for _, module := range contents {
|
||||||
|
if hiddenAPI, ok := module.(hiddenAPIIntf); ok {
|
||||||
|
classesJars = append(classesJars, hiddenAPI.classesJars()...)
|
||||||
|
bootDexJar := hiddenAPI.bootDexJar()
|
||||||
|
if bootDexJar == nil {
|
||||||
|
ctx.ModuleErrorf("module %s does not provide a dex jar", module)
|
||||||
|
} else {
|
||||||
|
bootDexJars = append(bootDexJars, bootDexJar)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ctx.ModuleErrorf("module %s does not implement hiddenAPIIntf", module)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate the stub-flags.csv.
|
||||||
|
stubFlagsCSV := android.PathForModuleOut(ctx, hiddenApiSubDir, "stub-flags.csv")
|
||||||
|
rule := ruleToGenerateHiddenAPIStubFlagsFile(ctx, stubFlagsCSV, bootDexJars, stubJarsByKind)
|
||||||
|
rule.Build("modularHiddenAPIStubFlagsFile", "modular hiddenapi stub flags")
|
||||||
|
|
||||||
|
// Generate the set of flags from the annotations in the source code.
|
||||||
|
annotationFlagsCSV := android.PathForModuleOut(ctx, hiddenApiSubDir, "annotation-flags.csv")
|
||||||
|
ctx.Build(pctx, android.BuildParams{
|
||||||
|
Rule: hiddenAPIGenerateCSVRule,
|
||||||
|
Description: "modular hiddenapi annotation flags",
|
||||||
|
Inputs: classesJars,
|
||||||
|
Output: annotationFlagsCSV,
|
||||||
|
Implicit: stubFlagsCSV,
|
||||||
|
Args: map[string]string{
|
||||||
|
"outFlag": "--write-flags-csv",
|
||||||
|
"stubAPIFlags": stubFlagsCSV.String(),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
// Generate the metadata from the annotations in the source code.
|
||||||
|
metadataCSV := android.PathForModuleOut(ctx, hiddenApiSubDir, "metadata.csv")
|
||||||
|
ctx.Build(pctx, android.BuildParams{
|
||||||
|
Rule: hiddenAPIGenerateCSVRule,
|
||||||
|
Description: "modular hiddenapi metadata",
|
||||||
|
Inputs: classesJars,
|
||||||
|
Output: metadataCSV,
|
||||||
|
Implicit: stubFlagsCSV,
|
||||||
|
Args: map[string]string{
|
||||||
|
"outFlag": "--write-metadata-csv",
|
||||||
|
"stubAPIFlags": stubFlagsCSV.String(),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
// Generate the index file from the annotations in the source code.
|
||||||
|
indexCSV := android.PathForModuleOut(ctx, hiddenApiSubDir, "index.csv")
|
||||||
|
rule = android.NewRuleBuilder(pctx, ctx)
|
||||||
|
rule.Command().
|
||||||
|
BuiltTool("merge_csv").
|
||||||
|
Flag("--zip_input").
|
||||||
|
Flag("--key_field signature").
|
||||||
|
FlagWithOutput("--output=", indexCSV).
|
||||||
|
Inputs(classesJars)
|
||||||
|
rule.Build("modular-hiddenapi-index", "modular hiddenapi index")
|
||||||
|
|
||||||
|
// Removed APIs need to be marked and in order to do that the flagFileInfo needs to specify files
|
||||||
|
// containing dex signatures of all the removed APIs. In the monolithic files that is done by
|
||||||
|
// manually combining all the removed.txt files for each API and then converting them to dex
|
||||||
|
// signatures, see the combined-removed-dex module. That will all be done automatically in future.
|
||||||
|
// For now removed APIs are ignored.
|
||||||
|
// TODO(b/179354495): handle removed apis automatically.
|
||||||
|
|
||||||
|
// Generate the all-flags.csv which are the flags that will, in future, be encoded into the dex
|
||||||
|
// files.
|
||||||
|
outputPath := android.PathForModuleOut(ctx, hiddenApiSubDir, "all-flags.csv")
|
||||||
|
buildRuleToGenerateHiddenApiFlags(ctx, "modularHiddenApiAllFlags", "modular hiddenapi all flags", outputPath, stubFlagsCSV, android.Paths{annotationFlagsCSV}, flagFileInfo)
|
||||||
|
|
||||||
|
// Store the paths in the info for use by other modules and sdk snapshot generation.
|
||||||
|
flagFileInfo.StubFlagsPaths = android.Paths{stubFlagsCSV}
|
||||||
|
flagFileInfo.AnnotationFlagsPaths = android.Paths{annotationFlagsCSV}
|
||||||
|
flagFileInfo.MetadataPaths = android.Paths{metadataCSV}
|
||||||
|
flagFileInfo.IndexPaths = android.Paths{indexCSV}
|
||||||
|
flagFileInfo.AllFlagsPaths = android.Paths{outputPath}
|
||||||
}
|
}
|
||||||
|
@@ -364,7 +364,7 @@ func (b *platformBootclasspathModule) generateHiddenAPIBuildActions(ctx android.
|
|||||||
|
|
||||||
outputPath := hiddenAPISingletonPaths(ctx).flags
|
outputPath := hiddenAPISingletonPaths(ctx).flags
|
||||||
baseFlagsPath := hiddenAPISingletonPaths(ctx).stubFlags
|
baseFlagsPath := hiddenAPISingletonPaths(ctx).stubFlags
|
||||||
ruleToGenerateHiddenApiFlags(ctx, outputPath, baseFlagsPath, moduleSpecificFlagsPaths, flagFileInfo)
|
buildRuleToGenerateHiddenApiFlags(ctx, "hiddenAPIFlagsFile", "hiddenapi flags", outputPath, baseFlagsPath, moduleSpecificFlagsPaths, &flagFileInfo)
|
||||||
|
|
||||||
b.generateHiddenAPIStubFlagsRules(ctx, hiddenAPISupportingModules)
|
b.generateHiddenAPIStubFlagsRules(ctx, hiddenAPISupportingModules)
|
||||||
b.generateHiddenAPIIndexRules(ctx, hiddenAPISupportingModules)
|
b.generateHiddenAPIIndexRules(ctx, hiddenAPISupportingModules)
|
||||||
|
@@ -155,6 +155,8 @@ func TestPlatformBootclasspath(t *testing.T) {
|
|||||||
func TestPlatformBootclasspath_Fragments(t *testing.T) {
|
func TestPlatformBootclasspath_Fragments(t *testing.T) {
|
||||||
result := android.GroupFixturePreparers(
|
result := android.GroupFixturePreparers(
|
||||||
prepareForTestWithPlatformBootclasspath,
|
prepareForTestWithPlatformBootclasspath,
|
||||||
|
PrepareForTestWithJavaSdkLibraryFiles,
|
||||||
|
FixtureWithLastReleaseApis("foo"),
|
||||||
android.FixtureWithRootAndroidBp(`
|
android.FixtureWithRootAndroidBp(`
|
||||||
platform_bootclasspath {
|
platform_bootclasspath {
|
||||||
name: "platform-bootclasspath",
|
name: "platform-bootclasspath",
|
||||||
@@ -192,6 +194,9 @@ func TestPlatformBootclasspath_Fragments(t *testing.T) {
|
|||||||
bootclasspath_fragment {
|
bootclasspath_fragment {
|
||||||
name: "bar-fragment",
|
name: "bar-fragment",
|
||||||
contents: ["bar"],
|
contents: ["bar"],
|
||||||
|
api: {
|
||||||
|
stub_libs: ["foo"],
|
||||||
|
},
|
||||||
hidden_api: {
|
hidden_api: {
|
||||||
unsupported: [
|
unsupported: [
|
||||||
"bar-unsupported.txt",
|
"bar-unsupported.txt",
|
||||||
@@ -227,6 +232,15 @@ func TestPlatformBootclasspath_Fragments(t *testing.T) {
|
|||||||
sdk_version: "none",
|
sdk_version: "none",
|
||||||
compile_dex: true,
|
compile_dex: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
java_sdk_library {
|
||||||
|
name: "foo",
|
||||||
|
srcs: ["a.java"],
|
||||||
|
public: {
|
||||||
|
enabled: true,
|
||||||
|
},
|
||||||
|
compile_dex: true,
|
||||||
|
}
|
||||||
`),
|
`),
|
||||||
).RunTest(t)
|
).RunTest(t)
|
||||||
|
|
||||||
@@ -240,6 +254,12 @@ func TestPlatformBootclasspath_Fragments(t *testing.T) {
|
|||||||
expected := []string{fmt.Sprintf("%s.txt", filename), fmt.Sprintf("bar-%s.txt", filename)}
|
expected := []string{fmt.Sprintf("%s.txt", filename), fmt.Sprintf("bar-%s.txt", filename)}
|
||||||
android.AssertPathsRelativeToTopEquals(t, message, expected, info.categoryToPaths[category])
|
android.AssertPathsRelativeToTopEquals(t, message, expected, info.categoryToPaths[category])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
android.AssertPathsRelativeToTopEquals(t, "stub flags", []string{"out/soong/.intermediates/bar-fragment/android_common/modular-hiddenapi/stub-flags.csv"}, info.StubFlagsPaths)
|
||||||
|
android.AssertPathsRelativeToTopEquals(t, "annotation flags", []string{"out/soong/.intermediates/bar-fragment/android_common/modular-hiddenapi/annotation-flags.csv"}, info.AnnotationFlagsPaths)
|
||||||
|
android.AssertPathsRelativeToTopEquals(t, "metadata flags", []string{"out/soong/.intermediates/bar-fragment/android_common/modular-hiddenapi/metadata.csv"}, info.MetadataPaths)
|
||||||
|
android.AssertPathsRelativeToTopEquals(t, "index flags", []string{"out/soong/.intermediates/bar-fragment/android_common/modular-hiddenapi/index.csv"}, info.IndexPaths)
|
||||||
|
android.AssertPathsRelativeToTopEquals(t, "all flags", []string{"out/soong/.intermediates/bar-fragment/android_common/modular-hiddenapi/all-flags.csv"}, info.AllFlagsPaths)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPlatformBootclasspathVariant(t *testing.T) {
|
func TestPlatformBootclasspathVariant(t *testing.T) {
|
||||||
|
@@ -246,6 +246,13 @@ prebuilt_bootclasspath_fragment {
|
|||||||
core_platform_api: {
|
core_platform_api: {
|
||||||
stub_libs: ["mycoreplatform"],
|
stub_libs: ["mycoreplatform"],
|
||||||
},
|
},
|
||||||
|
hidden_api: {
|
||||||
|
stub_flags: "hiddenapi/stub-flags.csv",
|
||||||
|
annotation_flags: "hiddenapi/annotation-flags.csv",
|
||||||
|
metadata: "hiddenapi/metadata.csv",
|
||||||
|
index: "hiddenapi/index.csv",
|
||||||
|
all_flags: "hiddenapi/all-flags.csv",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
java_import {
|
java_import {
|
||||||
@@ -319,6 +326,13 @@ prebuilt_bootclasspath_fragment {
|
|||||||
core_platform_api: {
|
core_platform_api: {
|
||||||
stub_libs: ["mysdk_mycoreplatform@current"],
|
stub_libs: ["mysdk_mycoreplatform@current"],
|
||||||
},
|
},
|
||||||
|
hidden_api: {
|
||||||
|
stub_flags: "hiddenapi/stub-flags.csv",
|
||||||
|
annotation_flags: "hiddenapi/annotation-flags.csv",
|
||||||
|
metadata: "hiddenapi/metadata.csv",
|
||||||
|
index: "hiddenapi/index.csv",
|
||||||
|
all_flags: "hiddenapi/all-flags.csv",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
java_import {
|
java_import {
|
||||||
@@ -387,6 +401,11 @@ sdk_snapshot {
|
|||||||
}
|
}
|
||||||
`),
|
`),
|
||||||
checkAllCopyRules(`
|
checkAllCopyRules(`
|
||||||
|
.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/stub-flags.csv -> hiddenapi/stub-flags.csv
|
||||||
|
.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv
|
||||||
|
.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv
|
||||||
|
.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/index.csv -> hiddenapi/index.csv
|
||||||
|
.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/all-flags.csv -> hiddenapi/all-flags.csv
|
||||||
.intermediates/mybootlib/android_common/javac/mybootlib.jar -> java/mybootlib.jar
|
.intermediates/mybootlib/android_common/javac/mybootlib.jar -> java/mybootlib.jar
|
||||||
.intermediates/myothersdklibrary.stubs/android_common/javac/myothersdklibrary.stubs.jar -> sdk_library/public/myothersdklibrary-stubs.jar
|
.intermediates/myothersdklibrary.stubs/android_common/javac/myothersdklibrary.stubs.jar -> sdk_library/public/myothersdklibrary-stubs.jar
|
||||||
.intermediates/myothersdklibrary.stubs.source/android_common/metalava/myothersdklibrary.stubs.source_api.txt -> sdk_library/public/myothersdklibrary.txt
|
.intermediates/myothersdklibrary.stubs.source/android_common/metalava/myothersdklibrary.stubs.source_api.txt -> sdk_library/public/myothersdklibrary.txt
|
||||||
@@ -542,6 +561,11 @@ prebuilt_bootclasspath_fragment {
|
|||||||
max_target_o_low_priority: ["hiddenapi/my-max-target-o-low-priority.txt"],
|
max_target_o_low_priority: ["hiddenapi/my-max-target-o-low-priority.txt"],
|
||||||
blocked: ["hiddenapi/my-blocked.txt"],
|
blocked: ["hiddenapi/my-blocked.txt"],
|
||||||
unsupported_packages: ["hiddenapi/my-unsupported-packages.txt"],
|
unsupported_packages: ["hiddenapi/my-unsupported-packages.txt"],
|
||||||
|
stub_flags: "hiddenapi/stub-flags.csv",
|
||||||
|
annotation_flags: "hiddenapi/annotation-flags.csv",
|
||||||
|
metadata: "hiddenapi/metadata.csv",
|
||||||
|
index: "hiddenapi/index.csv",
|
||||||
|
all_flags: "hiddenapi/all-flags.csv",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -578,6 +602,11 @@ my-max-target-p.txt -> hiddenapi/my-max-target-p.txt
|
|||||||
my-max-target-o-low-priority.txt -> hiddenapi/my-max-target-o-low-priority.txt
|
my-max-target-o-low-priority.txt -> hiddenapi/my-max-target-o-low-priority.txt
|
||||||
my-blocked.txt -> hiddenapi/my-blocked.txt
|
my-blocked.txt -> hiddenapi/my-blocked.txt
|
||||||
my-unsupported-packages.txt -> hiddenapi/my-unsupported-packages.txt
|
my-unsupported-packages.txt -> hiddenapi/my-unsupported-packages.txt
|
||||||
|
.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/stub-flags.csv -> hiddenapi/stub-flags.csv
|
||||||
|
.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv
|
||||||
|
.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv
|
||||||
|
.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/index.csv -> hiddenapi/index.csv
|
||||||
|
.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/all-flags.csv -> hiddenapi/all-flags.csv
|
||||||
.intermediates/mybootlib/android_common/javac/mybootlib.jar -> java/mybootlib.jar
|
.intermediates/mybootlib/android_common/javac/mybootlib.jar -> java/mybootlib.jar
|
||||||
.intermediates/mysdklibrary.stubs/android_common/javac/mysdklibrary.stubs.jar -> sdk_library/public/mysdklibrary-stubs.jar
|
.intermediates/mysdklibrary.stubs/android_common/javac/mysdklibrary.stubs.jar -> sdk_library/public/mysdklibrary-stubs.jar
|
||||||
.intermediates/mysdklibrary.stubs.source/android_common/metalava/mysdklibrary.stubs.source_api.txt -> sdk_library/public/mysdklibrary.txt
|
.intermediates/mysdklibrary.stubs.source/android_common/metalava/mysdklibrary.stubs.source_api.txt -> sdk_library/public/mysdklibrary.txt
|
||||||
|
Reference in New Issue
Block a user