Generate snapshot member list properties from dependencies
Previously, the snapshot member list properties were simply copied from
the sdk variants. That worked because the snapshot member list
properties must include all exported (i.e. visible outside the sdk
snaphot) members and only members explicitly specified in the sdk
member list properties were exported. However, a preceding change
allowed members that were transitively added (and so not explicitly
specified on the sdk) to be exported.
This change ensures that those exported members are added to the
snapshot member properties which means that they will now work properly
with the sdk version mutators.
This does not add tests for this because no existing SdkMemberType
exports its transitive dependencies and there is currently no way to
register an SdkMemberType for testing only. A following change will
exercise this functionality.
Bug: 186290299
Test: m nothing
Change-Id: Iadbdd86f6dcdd183fa99f647222a43d412271501
diff --git a/sdk/update.go b/sdk/update.go
index 43ec926..3668b46 100644
--- a/sdk/update.go
+++ b/sdk/update.go
@@ -131,7 +131,7 @@
s.multilibUsages = s.multilibUsages.addArchType(child.Target().Arch.ArchType)
export := memberTag.ExportMember()
- s.memberVariantDeps = append(s.memberVariantDeps, sdkMemberVariantDep{memberType, child.(android.SdkAware), export})
+ s.memberVariantDeps = append(s.memberVariantDeps, sdkMemberVariantDep{s, memberType, child.(android.SdkAware), export})
// If the member type supports transitive sdk members then recurse down into
// its dependencies, otherwise exit traversal.
@@ -368,7 +368,7 @@
addHostDeviceSupportedProperties(s.ModuleBase.DeviceSupported(), s.ModuleBase.HostSupported(), snapshotModule)
- combinedPropertiesList := s.collateSnapshotModuleInfo(sdkVariants)
+ combinedPropertiesList := s.collateSnapshotModuleInfo(ctx, sdkVariants, memberVariantDeps)
commonCombinedProperties := s.optimizeSnapshotModuleProperties(ctx, combinedPropertiesList)
s.addSnapshotPropertiesToPropertySet(builder, snapshotModule, commonCombinedProperties)
@@ -476,20 +476,44 @@
}
// collateSnapshotModuleInfo collates all the snapshot module info from supplied sdk variants.
-func (s *sdk) collateSnapshotModuleInfo(sdkVariants []*sdk) []*combinedSnapshotModuleProperties {
+func (s *sdk) collateSnapshotModuleInfo(ctx android.BaseModuleContext, sdkVariants []*sdk, memberVariantDeps []sdkMemberVariantDep) []*combinedSnapshotModuleProperties {
+ sdkVariantToCombinedProperties := map[*sdk]*combinedSnapshotModuleProperties{}
var list []*combinedSnapshotModuleProperties
for _, sdkVariant := range sdkVariants {
staticProperties := &snapshotModuleStaticProperties{
Compile_multilib: sdkVariant.multilibUsages.String(),
}
- dynamicProperties := sdkVariant.dynamicMemberTypeListProperties
+ dynamicProperties := s.dynamicSdkMemberTypes.createMemberListProperties()
- list = append(list, &combinedSnapshotModuleProperties{
+ combinedProperties := &combinedSnapshotModuleProperties{
sdkVariant: sdkVariant,
staticProperties: staticProperties,
dynamicProperties: dynamicProperties,
- })
+ }
+ sdkVariantToCombinedProperties[sdkVariant] = combinedProperties
+
+ list = append(list, combinedProperties)
}
+
+ for _, memberVariantDep := range memberVariantDeps {
+ // If the member dependency is internal then do not add the dependency to the snapshot member
+ // list properties.
+ if !memberVariantDep.export {
+ continue
+ }
+
+ combined := sdkVariantToCombinedProperties[memberVariantDep.sdkVariant]
+ memberTypeProperty := s.memberListProperty(memberVariantDep.memberType)
+ memberName := ctx.OtherModuleName(memberVariantDep.variant)
+
+ // Append the member to the appropriate list, if it is not already present in the list.
+ memberList := memberTypeProperty.getter(combined.dynamicProperties)
+ if !android.InList(memberName, memberList) {
+ memberList = append(memberList, memberName)
+ }
+ memberTypeProperty.setter(combined.dynamicProperties, memberList)
+ }
+
return list
}
@@ -943,6 +967,8 @@
// sdkMemberVariantDep represents a dependency from an sdk variant onto a member variant.
type sdkMemberVariantDep struct {
+ // The sdk variant that depends (possibly indirectly) on the member variant.
+ sdkVariant *sdk
memberType android.SdkMemberType
variant android.SdkAware
export bool