diff --git a/sdk/sdk.go b/sdk/sdk.go
index 1c6002a..95a4930 100644
--- a/sdk/sdk.go
+++ b/sdk/sdk.go
@@ -101,6 +101,9 @@
 	// getter for the list of member names
 	getter func(properties interface{}) []string
 
+	// setter for the list of member names
+	setter func(properties interface{}, list []string)
+
 	// the type of member referenced in the list
 	memberType android.SdkMemberType
 
@@ -127,6 +130,8 @@
 
 	// Information about each of the member type specific list properties.
 	memberListProperties []*sdkMemberListProperty
+
+	memberTypeToProperty map[android.SdkMemberType]*sdkMemberListProperty
 }
 
 func (d *dynamicSdkMemberTypes) createMemberListProperties() interface{} {
@@ -160,6 +165,7 @@
 func createDynamicSdkMemberTypes(sdkMemberTypes []android.SdkMemberType) *dynamicSdkMemberTypes {
 
 	var listProperties []*sdkMemberListProperty
+	memberTypeToProperty := map[android.SdkMemberType]*sdkMemberListProperty{}
 	var fields []reflect.StructField
 
 	// Iterate over the member types creating StructField and sdkMemberListProperty objects.
@@ -191,12 +197,24 @@
 				return list
 			},
 
+			setter: func(properties interface{}, list []string) {
+				// The properties is expected to be of the following form (where
+				// <Module_types> is the name of an SdkMemberType.SdkPropertyName().
+				//     properties *struct {<Module_types> []string, ....}
+				//
+				// Although it accesses the field by index the following reflection code is equivalent to:
+				//    *properties.<Module_types> = list
+				//
+				reflect.ValueOf(properties).Elem().Field(fieldIndex).Set(reflect.ValueOf(list))
+			},
+
 			memberType: memberType,
 
 			// Dependencies added directly from member properties are always exported.
 			dependencyTag: android.DependencyTagForSdkMemberType(memberType, true),
 		}
 
+		memberTypeToProperty[memberType] = memberListProperty
 		listProperties = append(listProperties, memberListProperty)
 	}
 
@@ -205,6 +223,7 @@
 
 	return &dynamicSdkMemberTypes{
 		memberListProperties: listProperties,
+		memberTypeToProperty: memberTypeToProperty,
 		propertiesStructType: propertiesStructType,
 	}
 }
@@ -256,6 +275,10 @@
 	return s.dynamicSdkMemberTypes.memberListProperties
 }
 
+func (s *sdk) memberListProperty(memberType android.SdkMemberType) *sdkMemberListProperty {
+	return s.dynamicSdkMemberTypes.memberTypeToProperty[memberType]
+}
+
 func (s *sdk) snapshot() bool {
 	return s.properties.Snapshot
 }
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
