|
@@ -297,7 +297,7 @@ func hiddenAPIRetrieveDexJarBuildPath(ctx android.ModuleContext, module android.
|
|
|
//
|
|
|
// The rule is initialized but not built so that the caller can modify it and select an appropriate
|
|
|
// name.
|
|
|
-func buildRuleToGenerateHiddenAPIStubFlagsFile(ctx android.BuilderContext, name, desc string, outputPath android.WritablePath, bootDexJars android.Paths, input HiddenAPIFlagInput, moduleStubFlagsPaths android.Paths) {
|
|
|
+func buildRuleToGenerateHiddenAPIStubFlagsFile(ctx android.BuilderContext, name, desc string, outputPath android.WritablePath, bootDexJars android.Paths, input HiddenAPIFlagInput, stubFlagSubsets SignatureCsvSubsets) {
|
|
|
// Singleton rule which applies hiddenapi on all boot class path dex files.
|
|
|
rule := android.NewRuleBuilder(pctx, ctx)
|
|
|
|
|
@@ -317,7 +317,7 @@ func buildRuleToGenerateHiddenAPIStubFlagsFile(ctx android.BuilderContext, name,
|
|
|
|
|
|
// If no module stub flags paths are provided then this must be being called for a
|
|
|
// bootclasspath_fragment and not the whole platform_bootclasspath.
|
|
|
- if moduleStubFlagsPaths == nil {
|
|
|
+ if stubFlagSubsets == nil {
|
|
|
// This is being run on a fragment of the bootclasspath.
|
|
|
command.Flag("--fragment")
|
|
|
}
|
|
@@ -342,8 +342,8 @@ func buildRuleToGenerateHiddenAPIStubFlagsFile(ctx android.BuilderContext, name,
|
|
|
|
|
|
// If there are stub flag files that have been generated by fragments on which this depends then
|
|
|
// use them to validate the stub flag file generated by the rules created by this method.
|
|
|
- if len(moduleStubFlagsPaths) > 0 {
|
|
|
- validFile := buildRuleValidateOverlappingCsvFiles(ctx, name, desc, outputPath, moduleStubFlagsPaths)
|
|
|
+ if len(stubFlagSubsets) > 0 {
|
|
|
+ validFile := buildRuleValidateOverlappingCsvFiles(ctx, name, desc, outputPath, stubFlagSubsets)
|
|
|
|
|
|
// Add the file that indicates that the file generated by this is valid.
|
|
|
//
|
|
@@ -546,6 +546,20 @@ func (i *HiddenAPIInfo) mergeFromFragmentDeps(ctx android.ModuleContext, fragmen
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+// StubFlagSubset returns a SignatureCsvSubset that contains a path to a stub-flags.csv file and a
|
|
|
+// path to a signature-patterns.csv file that defines a subset of the monolithic stub flags file,
|
|
|
+// i.e. out/soong/hiddenapi/hiddenapi-stub-flags.txt, against which it will be compared.
|
|
|
+func (i *HiddenAPIInfo) StubFlagSubset() SignatureCsvSubset {
|
|
|
+ return SignatureCsvSubset{i.StubFlagsPath, i.SignaturePatternsPath}
|
|
|
+}
|
|
|
+
|
|
|
+// FlagSubset returns a SignatureCsvSubset that contains a path to an all-flags.csv file and a
|
|
|
+// path to a signature-patterns.csv file that defines a subset of the monolithic flags file, i.e.
|
|
|
+// out/soong/hiddenapi/hiddenapi-flags.csv, against which it will be compared.
|
|
|
+func (i *HiddenAPIInfo) FlagSubset() SignatureCsvSubset {
|
|
|
+ return SignatureCsvSubset{i.AllFlagsPath, i.SignaturePatternsPath}
|
|
|
+}
|
|
|
+
|
|
|
var HiddenAPIInfoProvider = blueprint.NewProvider(HiddenAPIInfo{})
|
|
|
|
|
|
// ModuleStubDexJars contains the stub dex jars provided by a single module.
|
|
@@ -782,6 +796,10 @@ type HiddenAPIFlagOutput struct {
|
|
|
|
|
|
// The path to the generated all-flags.csv file.
|
|
|
AllFlagsPath android.Path
|
|
|
+
|
|
|
+ // The path to the generated signature-patterns.txt file which defines the subset of the
|
|
|
+ // monolithic hidden API files provided in this.
|
|
|
+ SignaturePatternsPath android.Path
|
|
|
}
|
|
|
|
|
|
// bootDexJarByModule is a map from base module name (without prebuilt_ prefix) to the boot dex
|
|
@@ -848,7 +866,7 @@ func pathForValidation(ctx android.PathContext, path android.WritablePath) andro
|
|
|
// the annotationFlags.
|
|
|
func buildRuleToGenerateHiddenApiFlags(ctx android.BuilderContext, name, desc string,
|
|
|
outputPath android.WritablePath, baseFlagsPath android.Path, annotationFlagPaths android.Paths,
|
|
|
- flagFilesByCategory FlagFilesByCategory, allFlagsPaths android.Paths, generatedRemovedDexSignatures android.OptionalPath) {
|
|
|
+ flagFilesByCategory FlagFilesByCategory, flagSubsets SignatureCsvSubsets, generatedRemovedDexSignatures android.OptionalPath) {
|
|
|
|
|
|
// Create the rule that will generate the flag files.
|
|
|
tempPath := tempPathForRestat(ctx, outputPath)
|
|
@@ -877,8 +895,8 @@ func buildRuleToGenerateHiddenApiFlags(ctx android.BuilderContext, name, desc st
|
|
|
|
|
|
// If there are flag files that have been generated by fragments on which this depends then use
|
|
|
// them to validate the flag file generated by the rules created by this method.
|
|
|
- if len(allFlagsPaths) > 0 {
|
|
|
- validFile := buildRuleValidateOverlappingCsvFiles(ctx, name, desc, outputPath, allFlagsPaths)
|
|
|
+ if len(flagSubsets) > 0 {
|
|
|
+ validFile := buildRuleValidateOverlappingCsvFiles(ctx, name, desc, outputPath, flagSubsets)
|
|
|
|
|
|
// Add the file that indicates that the file generated by this is valid.
|
|
|
//
|
|
@@ -890,20 +908,66 @@ func buildRuleToGenerateHiddenApiFlags(ctx android.BuilderContext, name, desc st
|
|
|
rule.Build(name, desc)
|
|
|
}
|
|
|
|
|
|
+// SignatureCsvSubset describes a subset of a monolithic flags file, i.e. either
|
|
|
+// out/soong/hiddenapi/hiddenapi-stub-flags.txt or out/soong/hiddenapi/hiddenapi-flags.csv
|
|
|
+type SignatureCsvSubset struct {
|
|
|
+ // The path to the CSV file containing hidden API flags.
|
|
|
+ //
|
|
|
+ // It has the dex member signature as the first column, with flags, one per column, in the
|
|
|
+ // subsequent columns.
|
|
|
+ CsvFile android.Path
|
|
|
+
|
|
|
+ // The path to the CSV file containing the signature patterns.
|
|
|
+ //
|
|
|
+ // It is a single column CSV file with the column containing a signature pattern.
|
|
|
+ SignaturePatternsFile android.Path
|
|
|
+}
|
|
|
+
|
|
|
+type SignatureCsvSubsets []SignatureCsvSubset
|
|
|
+
|
|
|
+func (s SignatureCsvSubsets) RelativeToTop() []string {
|
|
|
+ result := []string{}
|
|
|
+ for _, subset := range s {
|
|
|
+ result = append(result, fmt.Sprintf("%s:%s", subset.CsvFile.RelativeToTop(), subset.SignaturePatternsFile.RelativeToTop()))
|
|
|
+ }
|
|
|
+ return result
|
|
|
+}
|
|
|
+
|
|
|
+// buildRuleSignaturePatternsFile creates a rule to generate a file containing the set of signature
|
|
|
+// patterns that will select a subset of the monolithic flags.
|
|
|
+func buildRuleSignaturePatternsFile(ctx android.ModuleContext, flagsPath android.Path) android.Path {
|
|
|
+ patternsFile := android.PathForModuleOut(ctx, "modular-hiddenapi", "signature-patterns.csv")
|
|
|
+ // Create a rule to validate the output from the following rule.
|
|
|
+ rule := android.NewRuleBuilder(pctx, ctx)
|
|
|
+ rule.Command().
|
|
|
+ BuiltTool("signature_patterns").
|
|
|
+ FlagWithInput("--flags ", flagsPath).
|
|
|
+ FlagWithOutput("--output ", patternsFile)
|
|
|
+ rule.Build("hiddenAPISignaturePatterns", "hidden API signature patterns")
|
|
|
+
|
|
|
+ return patternsFile
|
|
|
+}
|
|
|
+
|
|
|
// buildRuleValidateOverlappingCsvFiles checks that the modular CSV files, i.e. the files generated
|
|
|
// by the individual bootclasspath_fragment modules are subsets of the monolithic CSV file.
|
|
|
-func buildRuleValidateOverlappingCsvFiles(ctx android.BuilderContext, name string, desc string, monolithicFilePath android.WritablePath, modularFilePaths android.Paths) android.WritablePath {
|
|
|
+func buildRuleValidateOverlappingCsvFiles(ctx android.BuilderContext, name string, desc string, monolithicFilePath android.WritablePath, csvSubsets SignatureCsvSubsets) android.WritablePath {
|
|
|
// The file which is used to record that the flags file is valid.
|
|
|
validFile := pathForValidation(ctx, monolithicFilePath)
|
|
|
|
|
|
// Create a rule to validate the output from the following rule.
|
|
|
rule := android.NewRuleBuilder(pctx, ctx)
|
|
|
- rule.Command().
|
|
|
+ command := rule.Command().
|
|
|
BuiltTool("verify_overlaps").
|
|
|
- Input(monolithicFilePath).
|
|
|
- Inputs(modularFilePaths).
|
|
|
- // If validation passes then update the file that records that.
|
|
|
- Text("&& touch").Output(validFile)
|
|
|
+ Input(monolithicFilePath)
|
|
|
+
|
|
|
+ for _, subset := range csvSubsets {
|
|
|
+ command.
|
|
|
+ Textf("%s:%s", subset.CsvFile, subset.SignaturePatternsFile).
|
|
|
+ Implicit(subset.CsvFile).Implicit(subset.SignaturePatternsFile)
|
|
|
+ }
|
|
|
+
|
|
|
+ // If validation passes then update the file that records that.
|
|
|
+ command.Text("&& touch").Output(validFile)
|
|
|
rule.Build(name+"Validation", desc+" validation")
|
|
|
|
|
|
return validFile
|