Merge "Differentiate between exported and internal sdk members"

This commit is contained in:
Treehugger Robot
2020-02-08 00:12:04 +00:00
committed by Gerrit Code Review
3 changed files with 144 additions and 19 deletions

View File

@@ -588,12 +588,13 @@ func TestSnapshotWithJavaSystemModules(t *testing.T) {
result := testSdkWithJava(t, ` result := testSdkWithJava(t, `
sdk { sdk {
name: "mysdk", name: "mysdk",
java_header_libs: ["exported-system-module"],
java_system_modules: ["my-system-modules"], java_system_modules: ["my-system-modules"],
} }
java_system_modules { java_system_modules {
name: "my-system-modules", name: "my-system-modules",
libs: ["system-module"], libs: ["system-module", "exported-system-module"],
} }
java_library { java_library {
@@ -602,42 +603,73 @@ func TestSnapshotWithJavaSystemModules(t *testing.T) {
sdk_version: "none", sdk_version: "none",
system_modules: "none", system_modules: "none",
} }
java_library {
name: "exported-system-module",
srcs: ["Test.java"],
sdk_version: "none",
system_modules: "none",
}
`) `)
result.CheckSnapshot("mysdk", "android_common", "", result.CheckSnapshot("mysdk", "android_common", "",
checkAndroidBpContents(` checkAndroidBpContents(`
// This is auto-generated. DO NOT EDIT. // This is auto-generated. DO NOT EDIT.
java_import {
name: "mysdk_exported-system-module@current",
sdk_member_name: "exported-system-module",
jars: ["java/exported-system-module.jar"],
}
java_import {
name: "exported-system-module",
prefer: false,
jars: ["java/exported-system-module.jar"],
}
java_import { java_import {
name: "mysdk_system-module@current", name: "mysdk_system-module@current",
sdk_member_name: "system-module", sdk_member_name: "system-module",
visibility: ["//visibility:private"],
jars: ["java/system-module.jar"], jars: ["java/system-module.jar"],
} }
java_import { java_import {
name: "system-module", name: "mysdk_system-module",
prefer: false, prefer: false,
visibility: ["//visibility:private"],
jars: ["java/system-module.jar"], jars: ["java/system-module.jar"],
} }
java_system_modules_import { java_system_modules_import {
name: "mysdk_my-system-modules@current", name: "mysdk_my-system-modules@current",
sdk_member_name: "my-system-modules", sdk_member_name: "my-system-modules",
libs: ["mysdk_system-module@current"], libs: [
"mysdk_system-module@current",
"mysdk_exported-system-module@current",
],
} }
java_system_modules_import { java_system_modules_import {
name: "my-system-modules", name: "my-system-modules",
prefer: false, prefer: false,
libs: ["system-module"], libs: [
"mysdk_system-module",
"exported-system-module",
],
} }
sdk_snapshot { sdk_snapshot {
name: "mysdk@current", name: "mysdk@current",
java_header_libs: ["mysdk_exported-system-module@current"],
java_system_modules: ["mysdk_my-system-modules@current"], java_system_modules: ["mysdk_my-system-modules@current"],
} }
`), `),
checkAllCopyRules(".intermediates/system-module/android_common/turbine-combined/system-module.jar -> java/system-module.jar"), checkAllCopyRules(`
.intermediates/exported-system-module/android_common/turbine-combined/exported-system-module.jar -> java/exported-system-module.jar
.intermediates/system-module/android_common/turbine-combined/system-module.jar -> java/system-module.jar
`),
) )
} }
@@ -677,14 +709,16 @@ func TestHostSnapshotWithJavaSystemModules(t *testing.T) {
java_import { java_import {
name: "mysdk_system-module@current", name: "mysdk_system-module@current",
sdk_member_name: "system-module", sdk_member_name: "system-module",
visibility: ["//visibility:private"],
device_supported: false, device_supported: false,
host_supported: true, host_supported: true,
jars: ["java/system-module.jar"], jars: ["java/system-module.jar"],
} }
java_import { java_import {
name: "system-module", name: "mysdk_system-module",
prefer: false, prefer: false,
visibility: ["//visibility:private"],
device_supported: false, device_supported: false,
host_supported: true, host_supported: true,
jars: ["java/system-module.jar"], jars: ["java/system-module.jar"],
@@ -703,7 +737,7 @@ java_system_modules_import {
prefer: false, prefer: false,
device_supported: false, device_supported: false,
host_supported: true, host_supported: true,
libs: ["system-module"], libs: ["mysdk_system-module"],
} }
sdk_snapshot { sdk_snapshot {

View File

@@ -50,6 +50,9 @@ type sdk struct {
// list properties, e.g. java_libs. // list properties, e.g. java_libs.
dynamicMemberTypeListProperties interface{} dynamicMemberTypeListProperties interface{}
// The set of exported members.
exportedMembers map[string]struct{}
properties sdkProperties properties sdkProperties
snapshotFile android.OptionalPath snapshotFile android.OptionalPath
@@ -217,6 +220,33 @@ func SnapshotModuleFactory() android.Module {
return s return s
} }
func (s *sdk) memberListProperties() []*sdkMemberListProperty {
return s.dynamicSdkMemberTypes.memberListProperties
}
func (s *sdk) getExportedMembers() map[string]struct{} {
if s.exportedMembers == nil {
// Collect all the exported members.
s.exportedMembers = make(map[string]struct{})
for _, memberListProperty := range s.memberListProperties() {
names := memberListProperty.getter(s.dynamicMemberTypeListProperties)
// Every member specified explicitly in the properties is exported by the sdk.
for _, name := range names {
s.exportedMembers[name] = struct{}{}
}
}
}
return s.exportedMembers
}
func (s *sdk) isInternalMember(memberName string) bool {
_, ok := s.getExportedMembers()[memberName]
return !ok
}
func (s *sdk) snapshot() bool { func (s *sdk) snapshot() bool {
return s.properties.Snapshot return s.properties.Snapshot
} }
@@ -290,7 +320,7 @@ func (t sdkMemberVersionedDepTag) ExcludeFromVisibilityEnforcement() {}
// Step 1: create dependencies from an SDK module to its members. // Step 1: create dependencies from an SDK module to its members.
func memberMutator(mctx android.BottomUpMutatorContext) { func memberMutator(mctx android.BottomUpMutatorContext) {
if s, ok := mctx.Module().(*sdk); ok { if s, ok := mctx.Module().(*sdk); ok {
for _, memberListProperty := range s.dynamicSdkMemberTypes.memberListProperties { for _, memberListProperty := range s.memberListProperties() {
names := memberListProperty.getter(s.dynamicMemberTypeListProperties) names := memberListProperty.getter(s.dynamicMemberTypeListProperties)
tag := memberListProperty.dependencyTag tag := memberListProperty.dependencyTag
memberListProperty.memberType.AddDependencies(mctx, tag, names) memberListProperty.memberType.AddDependencies(mctx, tag, names)

View File

@@ -130,7 +130,9 @@ func (s *sdk) collectMembers(ctx android.ModuleContext) []*sdkMember {
byType[memberType] = append(byType[memberType], member) byType[memberType] = append(byType[memberType], member)
} }
member.variants = append(member.variants, child.(android.SdkAware)) // Only append new variants to the list. This is needed because a member can be both
// exported by the sdk and also be a transitive sdk member.
member.variants = appendUniqueVariants(member.variants, child.(android.SdkAware))
// If the member type supports transitive sdk members then recurse down into // If the member type supports transitive sdk members then recurse down into
// its dependencies, otherwise exit traversal. // its dependencies, otherwise exit traversal.
@@ -141,7 +143,7 @@ func (s *sdk) collectMembers(ctx android.ModuleContext) []*sdkMember {
}) })
var members []*sdkMember var members []*sdkMember
for _, memberListProperty := range s.dynamicSdkMemberTypes.memberListProperties { for _, memberListProperty := range s.memberListProperties() {
membersOfType := byType[memberListProperty.memberType] membersOfType := byType[memberListProperty.memberType]
members = append(members, membersOfType...) members = append(members, membersOfType...)
} }
@@ -149,6 +151,15 @@ func (s *sdk) collectMembers(ctx android.ModuleContext) []*sdkMember {
return members return members
} }
func appendUniqueVariants(variants []android.SdkAware, newVariant android.SdkAware) []android.SdkAware {
for _, v := range variants {
if v == newVariant {
return variants
}
}
return append(variants, newVariant)
}
// SDK directory structure // SDK directory structure
// <sdk_root>/ // <sdk_root>/
// Android.bp : definition of a 'sdk' module is here. This is a hand-made one. // Android.bp : definition of a 'sdk' module is here. This is a hand-made one.
@@ -203,17 +214,20 @@ func (s *sdk) buildSnapshot(ctx android.ModuleContext) android.OutputPath {
// Create a transformer that will transform an unversioned module into a versioned module. // Create a transformer that will transform an unversioned module into a versioned module.
unversionedToVersionedTransformer := unversionedToVersionedTransformation{builder: builder} unversionedToVersionedTransformer := unversionedToVersionedTransformation{builder: builder}
// Create a transformer that will transform an unversioned module by replacing any references
// to internal members with a unique module name and setting prefer: false.
unversionedTransformer := unversionedTransformation{builder: builder}
for _, unversioned := range builder.prebuiltOrder { for _, unversioned := range builder.prebuiltOrder {
// Copy the unversioned module so it can be modified to make it versioned. // Copy the unversioned module so it can be modified to make it versioned.
versioned := unversioned.deepCopy() versioned := unversioned.deepCopy()
// Transform the unversioned module into a versioned one. // Transform the unversioned module into a versioned one.
versioned.transform(unversionedToVersionedTransformer) versioned.transform(unversionedToVersionedTransformer)
bpFile.AddModule(versioned) bpFile.AddModule(versioned)
// Set prefer: false - this is not strictly required as that is the default. // Transform the unversioned module to make it suitable for use in the snapshot.
unversioned.insertAfter("name", "prefer", false) unversioned.transform(unversionedTransformer)
bpFile.AddModule(unversioned) bpFile.AddModule(unversioned)
} }
@@ -235,7 +249,7 @@ func (s *sdk) buildSnapshot(ctx android.ModuleContext) android.OutputPath {
} }
addHostDeviceSupportedProperties(&s.ModuleBase, snapshotModule) addHostDeviceSupportedProperties(&s.ModuleBase, snapshotModule)
for _, memberListProperty := range s.dynamicSdkMemberTypes.memberListProperties { for _, memberListProperty := range s.memberListProperties() {
names := memberListProperty.getter(s.dynamicMemberTypeListProperties) names := memberListProperty.getter(s.dynamicMemberTypeListProperties)
if len(names) > 0 { if len(names) > 0 {
snapshotModule.AddProperty(memberListProperty.propertyName(), builder.versionedSdkMemberNames(names)) snapshotModule.AddProperty(memberListProperty.propertyName(), builder.versionedSdkMemberNames(names))
@@ -319,6 +333,30 @@ func (t unversionedToVersionedTransformation) transformProperty(name string, val
} }
} }
type unversionedTransformation struct {
identityTransformation
builder *snapshotBuilder
}
func (t unversionedTransformation) transformModule(module *bpModule) *bpModule {
// If the module is an internal member then use a unique name for it.
name := module.getValue("name").(string)
module.setProperty("name", t.builder.unversionedSdkMemberName(name))
// Set prefer: false - this is not strictly required as that is the default.
module.insertAfter("name", "prefer", false)
return module
}
func (t unversionedTransformation) transformProperty(name string, value interface{}, tag android.BpPropertyTag) (interface{}, android.BpPropertyTag) {
if tag == sdkMemberReferencePropertyTag {
return t.builder.unversionedSdkMemberNames(value.([]string)), tag
} else {
return value, tag
}
}
func generateBpContents(contents *generatedContents, bpFile *bpFile) { func generateBpContents(contents *generatedContents, bpFile *bpFile) {
contents.Printfln("// This is auto-generated. DO NOT EDIT.") contents.Printfln("// This is auto-generated. DO NOT EDIT.")
for _, bpModule := range bpFile.order { for _, bpModule := range bpFile.order {
@@ -442,12 +480,18 @@ func (s *snapshotBuilder) AddPrebuiltModule(member android.SdkMember, moduleType
m := s.bpFile.newModule(moduleType) m := s.bpFile.newModule(moduleType)
m.AddProperty("name", name) m.AddProperty("name", name)
if s.sdk.isInternalMember(name) {
// An internal member is only referenced from the sdk snapshot which is in the
// same package so can be marked as private.
m.AddProperty("visibility", []string{"//visibility:private"})
} else {
// Extract visibility information from a member variant. All variants have the same // Extract visibility information from a member variant. All variants have the same
// visibility so it doesn't matter which one is used. // visibility so it doesn't matter which one is used.
visibility := android.EffectiveVisibilityRules(s.ctx, member.Variants()[0]) visibility := android.EffectiveVisibilityRules(s.ctx, member.Variants()[0])
if len(visibility) != 0 { if len(visibility) != 0 {
m.AddProperty("visibility", visibility) m.AddProperty("visibility", visibility)
} }
}
addHostDeviceSupportedProperties(&s.sdk.ModuleBase, m) addHostDeviceSupportedProperties(&s.sdk.ModuleBase, m)
@@ -482,6 +526,23 @@ func (s *snapshotBuilder) versionedSdkMemberNames(members []string) []string {
return references return references
} }
// Get an internal name unique to the sdk.
func (s *snapshotBuilder) unversionedSdkMemberName(unversionedName string) string {
if s.sdk.isInternalMember(unversionedName) {
return s.ctx.ModuleName() + "_" + unversionedName
} else {
return unversionedName
}
}
func (s *snapshotBuilder) unversionedSdkMemberNames(members []string) []string {
var references []string = nil
for _, m := range members {
references = append(references, s.unversionedSdkMemberName(m))
}
return references
}
var _ android.SdkMember = (*sdkMember)(nil) var _ android.SdkMember = (*sdkMember)(nil)
type sdkMember struct { type sdkMember struct {