Improve module filtering in hiddenapi stubFlagsRule()
Previously, it ignored any module that was not a platform apex variant however that required every module that was referenced from the boot jars to have a platform variant which is not the case when building from prebuilts. This change switches it to explicitly check that the variant is for either the appropriate apex or the platform depending on what is configured in the BootJars or UpdatableBootJars. It partially duplicates some logic from the getBootImageJar() function. It intentionally does not refactor the getBootImageJar() to allow for reuse because coupling the hiddenapi and dexpreopt logic would make refactoring either of them more difficult. Any duplicated code will be deduped once they have both been refactored. Bug: 178361284 Test: m droid Change-Id: I4b4e0dc8ee40c1ba1713d7ef72df13d175e84af6
This commit is contained in:
@@ -435,6 +435,11 @@ func (d *dexpreoptBootJars) GenerateSingletonBuildActions(ctx android.SingletonC
|
||||
// Inspect this module to see if it contains a bootclasspath dex jar.
|
||||
// Note that the same jar may occur in multiple modules.
|
||||
// This logic is tested in the apex package to avoid import cycle apex <-> java.
|
||||
//
|
||||
// This is similar to logic in isModuleInConfiguredList() so any changes needed here are likely to
|
||||
// be needed there too.
|
||||
//
|
||||
// TODO(b/177892522): Avoid having to perform this type of check or if necessary dedup it.
|
||||
func getBootImageJar(ctx android.SingletonContext, image *bootImageConfig, module android.Module) (int, android.Path) {
|
||||
name := ctx.ModuleName(module)
|
||||
|
||||
|
@@ -213,6 +213,10 @@ func stubFlagsRule(ctx android.SingletonContext) {
|
||||
|
||||
var bootDexJars android.Paths
|
||||
|
||||
// Get the configured non-updatable and updatable boot jars.
|
||||
nonUpdatableBootJars := ctx.Config().NonUpdatableBootJars()
|
||||
updatableBootJars := ctx.Config().UpdatableBootJars()
|
||||
|
||||
ctx.VisitAllModules(func(module android.Module) {
|
||||
// Collect dex jar paths for the modules listed above.
|
||||
if j, ok := module.(Dependency); ok {
|
||||
@@ -227,11 +231,8 @@ func stubFlagsRule(ctx android.SingletonContext) {
|
||||
// Collect dex jar paths for modules that had hiddenapi encode called on them.
|
||||
if h, ok := module.(hiddenAPIIntf); ok {
|
||||
if jar := h.bootDexJar(); jar != nil {
|
||||
// For a java lib included in an APEX, only take the one built for
|
||||
// the platform variant, and skip the variants for APEXes.
|
||||
// Otherwise, the hiddenapi tool will complain about duplicated classes
|
||||
apexInfo := ctx.ModuleProvider(module, android.ApexInfoProvider).(android.ApexInfo)
|
||||
if !apexInfo.IsForPlatform() {
|
||||
if !isModuleInConfiguredList(ctx, module, nonUpdatableBootJars) &&
|
||||
!isModuleInConfiguredList(ctx, module, updatableBootJars) {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -280,6 +281,47 @@ func stubFlagsRule(ctx android.SingletonContext) {
|
||||
rule.Build("hiddenAPIStubFlagsFile", "hiddenapi stub flags")
|
||||
}
|
||||
|
||||
// Checks to see whether the supplied module variant is in the list of boot jars.
|
||||
//
|
||||
// This is similar to logic in getBootImageJar() so any changes needed here are likely to be needed
|
||||
// there too.
|
||||
//
|
||||
// TODO(b/179354495): Avoid having to perform this type of check or if necessary dedup it.
|
||||
func isModuleInConfiguredList(ctx android.SingletonContext, module android.Module, configuredBootJars android.ConfiguredJarList) bool {
|
||||
name := ctx.ModuleName(module)
|
||||
|
||||
// Strip a prebuilt_ prefix so that this can match a prebuilt module that has not been renamed.
|
||||
name = android.RemoveOptionalPrebuiltPrefix(name)
|
||||
|
||||
// Ignore any module that is not listed in the boot image configuration.
|
||||
index := configuredBootJars.IndexOfJar(name)
|
||||
if index == -1 {
|
||||
return false
|
||||
}
|
||||
|
||||
// It is an error if the module is not an ApexModule.
|
||||
if _, ok := module.(android.ApexModule); !ok {
|
||||
ctx.Errorf("module %q configured in boot jars does not support being added to an apex", module)
|
||||
return false
|
||||
}
|
||||
|
||||
apexInfo := ctx.ModuleProvider(module, android.ApexInfoProvider).(android.ApexInfo)
|
||||
|
||||
// Now match the apex part of the boot image configuration.
|
||||
requiredApex := configuredBootJars.Apex(index)
|
||||
if requiredApex == "platform" {
|
||||
if len(apexInfo.InApexes) != 0 {
|
||||
// A platform variant is required but this is for an apex so ignore it.
|
||||
return false
|
||||
}
|
||||
} else if !apexInfo.InApexByBaseName(requiredApex) {
|
||||
// An apex variant for a specific apex is required but this is the wrong apex.
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
func prebuiltFlagsRule(ctx android.SingletonContext) android.Path {
|
||||
outputPath := hiddenAPISingletonPaths(ctx).flags
|
||||
inputPath := android.PathForSource(ctx, ctx.Config().PrebuiltHiddenApiDir(ctx), "hiddenapi-flags.csv")
|
||||
|
Reference in New Issue
Block a user