Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 26bd783d authored by Paul Duffin's avatar Paul Duffin Committed by Gerrit Code Review
Browse files

Merge "Move generation of global hidden API flags to platform_bootclasspath"

parents 690d5f2c 702210b8
Loading
Loading
Loading
Loading
+120 −9
Original line number Diff line number Diff line
@@ -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")
}
+2 −99
Original line number Diff line number Diff line
@@ -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 {
+25 −1
Original line number Diff line number Diff line
@@ -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)
}