Merge "Differentiate between exported and internal sdk members"
This commit is contained in:
@@ -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 {
|
||||||
|
32
sdk/sdk.go
32
sdk/sdk.go
@@ -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)
|
||||||
|
@@ -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 {
|
||||||
|
Reference in New Issue
Block a user