Exclude unsupported libraries from sdk snapshot
When an sdk snapshot is targeted at release X then it cannot include bootclasspath fragment libraries which are not present in that build as otherwise it causes build failures. It should also not include any unsupported libraries, i.e. libraries that cannot work on that release. This change causes sdk snapshot to exclude libraries that have a min_sdk_version > target build release It also ensures that hidden API flags do not include any information from excluded libraries. Bug: 240406019 Test: BUILD_NUMBER=fixed packages/modules/common/build/mainline_modules_sdks.sh # Ran the previous command with and without this change to make # sure that this change excludes framework-connectivity-t library from the # tethering sdk snapshot for S, including from the hidden API flag files. Change-Id: I57969b85a12e9e5a3fc76c055b260cec5d5f7d7f
This commit is contained in:
@@ -211,11 +211,14 @@ func (s *sdk) collectMembers(ctx android.ModuleContext) {
|
||||
container = parent.(android.SdkAware)
|
||||
}
|
||||
|
||||
minApiLevel := android.MinApiLevelForSdkSnapshot(ctx, child)
|
||||
|
||||
export := memberTag.ExportMember()
|
||||
s.memberVariantDeps = append(s.memberVariantDeps, sdkMemberVariantDep{
|
||||
sdkVariant: s,
|
||||
memberType: memberType,
|
||||
variant: child.(android.SdkAware),
|
||||
minApiLevel: minApiLevel,
|
||||
container: container,
|
||||
export: export,
|
||||
exportedComponentsInfo: exportedComponentsInfo,
|
||||
@@ -332,10 +335,28 @@ const BUILD_NUMBER_FILE = "snapshot-creation-build-number.txt"
|
||||
// <arch>/lib/
|
||||
// libFoo.so : a stub library
|
||||
|
||||
func (s sdk) targetBuildRelease(ctx android.ModuleContext) *buildRelease {
|
||||
config := ctx.Config()
|
||||
targetBuildReleaseEnv := config.GetenvWithDefault("SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE", buildReleaseCurrent.name)
|
||||
targetBuildRelease, err := nameToRelease(targetBuildReleaseEnv)
|
||||
if err != nil {
|
||||
ctx.ModuleErrorf("invalid SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE: %s", err)
|
||||
targetBuildRelease = buildReleaseCurrent
|
||||
}
|
||||
|
||||
return targetBuildRelease
|
||||
}
|
||||
|
||||
// buildSnapshot is the main function in this source file. It creates rules to copy
|
||||
// the contents (header files, stub libraries, etc) into the zip file.
|
||||
func (s *sdk) buildSnapshot(ctx android.ModuleContext, sdkVariants []*sdk) {
|
||||
|
||||
targetBuildRelease := s.targetBuildRelease(ctx)
|
||||
targetApiLevel, err := android.ApiLevelFromUser(ctx, targetBuildRelease.name)
|
||||
if err != nil {
|
||||
targetApiLevel = android.FutureApiLevel
|
||||
}
|
||||
|
||||
// Aggregate all the sdkMemberVariantDep instances from all the sdk variants.
|
||||
hasLicenses := false
|
||||
var memberVariantDeps []sdkMemberVariantDep
|
||||
@@ -346,12 +367,18 @@ func (s *sdk) buildSnapshot(ctx android.ModuleContext, sdkVariants []*sdk) {
|
||||
// Filter out any sdkMemberVariantDep that is a component of another.
|
||||
memberVariantDeps = filterOutComponents(ctx, memberVariantDeps)
|
||||
|
||||
// Record the names of all the members, both explicitly specified and implicitly
|
||||
// included.
|
||||
// Record the names of all the members, both explicitly specified and implicitly included. Also,
|
||||
// record the names of any members that should be excluded from this snapshot.
|
||||
allMembersByName := make(map[string]struct{})
|
||||
exportedMembersByName := make(map[string]struct{})
|
||||
excludedMembersByName := make(map[string]struct{})
|
||||
|
||||
addMember := func(name string, export bool, exclude bool) {
|
||||
if exclude {
|
||||
excludedMembersByName[name] = struct{}{}
|
||||
return
|
||||
}
|
||||
|
||||
addMember := func(name string, export bool) {
|
||||
allMembersByName[name] = struct{}{}
|
||||
if export {
|
||||
exportedMembersByName[name] = struct{}{}
|
||||
@@ -362,11 +389,15 @@ func (s *sdk) buildSnapshot(ctx android.ModuleContext, sdkVariants []*sdk) {
|
||||
name := memberVariantDep.variant.Name()
|
||||
export := memberVariantDep.export
|
||||
|
||||
addMember(name, export)
|
||||
// If the minApiLevel of the member is greater than the target API level then exclude it from
|
||||
// this snapshot.
|
||||
exclude := memberVariantDep.minApiLevel.GreaterThan(targetApiLevel)
|
||||
|
||||
addMember(name, export, exclude)
|
||||
|
||||
// Add any components provided by the module.
|
||||
for _, component := range memberVariantDep.exportedComponentsInfo.Components {
|
||||
addMember(component, export)
|
||||
addMember(component, export, exclude)
|
||||
}
|
||||
|
||||
if memberVariantDep.memberType == android.LicenseModuleSdkMemberType {
|
||||
@@ -382,18 +413,9 @@ func (s *sdk) buildSnapshot(ctx android.ModuleContext, sdkVariants []*sdk) {
|
||||
modules: make(map[string]*bpModule),
|
||||
}
|
||||
|
||||
config := ctx.Config()
|
||||
|
||||
// Always add -current to the end
|
||||
snapshotFileSuffix := "-current"
|
||||
|
||||
targetBuildReleaseEnv := config.GetenvWithDefault("SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE", buildReleaseCurrent.name)
|
||||
targetBuildRelease, err := nameToRelease(targetBuildReleaseEnv)
|
||||
if err != nil {
|
||||
ctx.ModuleErrorf("invalid SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE: %s", err)
|
||||
targetBuildRelease = buildReleaseCurrent
|
||||
}
|
||||
|
||||
builder := &snapshotBuilder{
|
||||
ctx: ctx,
|
||||
sdk: s,
|
||||
@@ -404,6 +426,7 @@ func (s *sdk) buildSnapshot(ctx android.ModuleContext, sdkVariants []*sdk) {
|
||||
prebuiltModules: make(map[string]*bpModule),
|
||||
allMembersByName: allMembersByName,
|
||||
exportedMembersByName: exportedMembersByName,
|
||||
excludedMembersByName: excludedMembersByName,
|
||||
targetBuildRelease: targetBuildRelease,
|
||||
}
|
||||
s.builderForTests = builder
|
||||
@@ -437,6 +460,10 @@ be unnecessary as every module in the sdk already has its own licenses property.
|
||||
}
|
||||
|
||||
name := member.name
|
||||
if _, ok := excludedMembersByName[name]; ok {
|
||||
continue
|
||||
}
|
||||
|
||||
requiredTraits := traits[name]
|
||||
if requiredTraits == nil {
|
||||
requiredTraits = android.EmptySdkMemberTraitSet()
|
||||
@@ -1034,6 +1061,9 @@ type snapshotBuilder struct {
|
||||
// The set of exported members by name.
|
||||
exportedMembersByName map[string]struct{}
|
||||
|
||||
// The set of members which have been excluded from this snapshot; by name.
|
||||
excludedMembersByName map[string]struct{}
|
||||
|
||||
// The target build release for which the snapshot is to be generated.
|
||||
targetBuildRelease *buildRelease
|
||||
|
||||
@@ -1218,6 +1248,9 @@ func (s *snapshotBuilder) snapshotSdkMemberName(name string, required bool) stri
|
||||
func (s *snapshotBuilder) snapshotSdkMemberNames(members []string, required bool) []string {
|
||||
var references []string = nil
|
||||
for _, m := range members {
|
||||
if _, ok := s.excludedMembersByName[m]; ok {
|
||||
continue
|
||||
}
|
||||
references = append(references, s.snapshotSdkMemberName(m, required))
|
||||
}
|
||||
return references
|
||||
@@ -1260,6 +1293,9 @@ type sdkMemberVariantDep struct {
|
||||
|
||||
// The names of additional component modules provided by the variant.
|
||||
exportedComponentsInfo android.ExportedComponentsInfo
|
||||
|
||||
// The minimum API level on which this module is supported.
|
||||
minApiLevel android.ApiLevel
|
||||
}
|
||||
|
||||
var _ android.SdkMember = (*sdkMember)(nil)
|
||||
|
Reference in New Issue
Block a user