Align boot jar exclusion with apex_contributions
During trunk stable development, it is possible that a new boot jar is added to the source apex, but not available in prebuilt apex yet. Thefore we need to conditionally check the `contents` of the respective bootclasspath_fragment modules. https://r.android.com/2822393 did this using isActiveModule. This function relies on soong config namespaces to "hide" the source bootclasspath_fragment module when <module>.source_build is false. Soong config namespaces for mainline source vs prebuilt selection is no longer in use, so this CL replaces `isActiveModule`. The CL cleaves the implementation 1. For source builds, the check will run in the context of the bootclasspath_fragment module. `disableSourceApexVariant` will be used to skip the check if prebuilts are selected. 2. For prebuilt builds, the prebuilt bootclasspath_fragment module sets a provider, and the top-level apex will do the check. (2) is necessary to handle the edge case of multiple versioned mainline prebuilts and possible skew in apex boot jars across them. In case of prebuilt builds, the unselected mainline prebuilts will have HideFromMake called on them, so the check will only run on the apex that is actually used during the build. Bug: 328578801 Test: go test ./apex Change-Id: I6eec603397eea926f3a481b79ca938245064d809 Merged-In: I6eec603397eea926f3a481b79ca938245064d809
This commit is contained in:
@@ -590,13 +590,36 @@ func (b *BootclasspathFragmentModule) configuredJars(ctx android.ModuleContext)
|
||||
// So ignore it even if it is not in PRODUCT_APEX_BOOT_JARS.
|
||||
// TODO(b/202896428): Add better way to handle this.
|
||||
_, unknown = android.RemoveFromList("android.car-module", unknown)
|
||||
if isActiveModule(ctx, ctx.Module()) && len(unknown) > 0 {
|
||||
ctx.ModuleErrorf("%s in contents must also be declared in PRODUCT_APEX_BOOT_JARS", unknown)
|
||||
if isApexVariant(ctx) && len(unknown) > 0 {
|
||||
if android.IsModulePrebuilt(ctx.Module()) {
|
||||
// prebuilt bcpf. the validation of this will be done at the top-level apex
|
||||
providerClasspathFragmentValidationInfoProvider(ctx, unknown)
|
||||
} else if !disableSourceApexVariant(ctx) {
|
||||
// source bcpf, and prebuilt apex are not selected.
|
||||
ctx.ModuleErrorf("%s in contents must also be declared in PRODUCT_APEX_BOOT_JARS", unknown)
|
||||
}
|
||||
}
|
||||
}
|
||||
return jars
|
||||
}
|
||||
|
||||
var ClasspathFragmentValidationInfoProvider = blueprint.NewProvider[ClasspathFragmentValidationInfo]()
|
||||
|
||||
type ClasspathFragmentValidationInfo struct {
|
||||
ClasspathFragmentModuleName string
|
||||
UnknownJars []string
|
||||
}
|
||||
|
||||
// Set a provider with the list of jars that have not been added to PRODUCT_APEX_BOOT_JARS
|
||||
// The validation will be done in the ctx of the top-level _selected_ apex
|
||||
func providerClasspathFragmentValidationInfoProvider(ctx android.ModuleContext, unknown []string) {
|
||||
info := ClasspathFragmentValidationInfo{
|
||||
ClasspathFragmentModuleName: ctx.ModuleName(),
|
||||
UnknownJars: unknown,
|
||||
}
|
||||
android.SetProvider(ctx, ClasspathFragmentValidationInfoProvider, info)
|
||||
}
|
||||
|
||||
// generateHiddenAPIBuildActions generates all the hidden API related build rules.
|
||||
func (b *BootclasspathFragmentModule) generateHiddenAPIBuildActions(ctx android.ModuleContext, contents []android.Module, fragments []android.Module) *HiddenAPIOutput {
|
||||
|
||||
|
Reference in New Issue
Block a user