diff --git a/java/java_test.go b/java/java_test.go index 149f64b9b..ab6d88ed6 100644 --- a/java/java_test.go +++ b/java/java_test.go @@ -1157,6 +1157,16 @@ func TestJavaSdkLibrary(t *testing.T) { libs: ["foo", "bar.stubs"], sdk_version: "system_current", } + java_sdk_library { + name: "barney", + srcs: ["c.java"], + api_only: true, + } + java_sdk_library { + name: "betty", + srcs: ["c.java"], + shared_library: false, + } java_sdk_library_import { name: "quuz", public: { @@ -1169,10 +1179,17 @@ func TestJavaSdkLibrary(t *testing.T) { jars: ["b.jar"], }, } + java_sdk_library_import { + name: "wilma", + public: { + jars: ["b.jar"], + }, + shared_library: false, + } java_library { name: "qux", srcs: ["c.java"], - libs: ["baz", "fred", "quuz.stubs"], + libs: ["baz", "fred", "quuz.stubs", "wilma", "barney", "betty"], sdk_version: "system_current", } java_library { diff --git a/java/sdk_library.go b/java/sdk_library.go index 0334f80d3..2bdfe0d74 100644 --- a/java/sdk_library.go +++ b/java/sdk_library.go @@ -372,7 +372,10 @@ type sdkLibraryProperties struct { // Defaults to "api". Api_dir *string - // If set to true there is no runtime library. + // Determines whether a runtime implementation library is built; defaults to false. + // + // If true then it also prevents the module from being used as a shared module, i.e. + // it is as is shared_library: false, was set. Api_only *bool // local files that are used within user customized droiddoc options. @@ -532,6 +535,13 @@ type commonToSdkLibraryAndImportProperties struct { // // TODO(b/155480189) - Remove once naming inconsistencies have been resolved. Naming_scheme *string + + // Specifies whether this module can be used as an Android shared library; defaults + // to true. + // + // An Android shared library is one that can be referenced in a element + // in an AndroidManifest.xml. + Shared_library *bool } // Common code between sdk library and sdk library import @@ -542,7 +552,7 @@ type commonToSdkLibraryAndImport struct { namingScheme sdkLibraryComponentNamingScheme - commonProperties commonToSdkLibraryAndImportProperties + commonSdkLibraryProperties commonToSdkLibraryAndImportProperties // Functionality related to this being used as a component of a java_sdk_library. EmbeddableSdkLibraryComponent @@ -551,14 +561,14 @@ type commonToSdkLibraryAndImport struct { func (c *commonToSdkLibraryAndImport) initCommon(moduleBase *android.ModuleBase) { c.moduleBase = moduleBase - moduleBase.AddProperties(&c.commonProperties) + moduleBase.AddProperties(&c.commonSdkLibraryProperties) // Initialize this as an sdk library component. c.initSdkLibraryComponent(moduleBase) } func (c *commonToSdkLibraryAndImport) initCommonAfterDefaultsApplied(ctx android.DefaultableHookContext) bool { - schemeProperty := proptools.StringDefault(c.commonProperties.Naming_scheme, "default") + schemeProperty := proptools.StringDefault(c.commonSdkLibraryProperties.Naming_scheme, "default") switch schemeProperty { case "default": c.namingScheme = &defaultNamingScheme{} @@ -569,8 +579,11 @@ func (c *commonToSdkLibraryAndImport) initCommonAfterDefaultsApplied(ctx android return false } - // Use the name specified in the module definition as the owner. - c.sdkLibraryComponentProperties.SdkLibraryToImplicitlyTrack = proptools.StringPtr(c.moduleBase.BaseModuleName()) + // Only track this sdk library if this can be used as a shared library. + if c.sharedLibrary() { + // Use the name specified in the module definition as the owner. + c.sdkLibraryComponentProperties.SdkLibraryToImplicitlyTrack = proptools.StringPtr(c.moduleBase.BaseModuleName()) + } return true } @@ -740,17 +753,24 @@ func (c *commonToSdkLibraryAndImport) selectHeaderJarsForSdkVersion(ctx android. func (c *commonToSdkLibraryAndImport) sdkComponentPropertiesForChildLibrary() interface{} { componentProps := &struct { SdkLibraryToImplicitlyTrack *string - }{ + }{} + + if c.sharedLibrary() { // Mark the stubs library as being components of this java_sdk_library so that // any app that includes code which depends (directly or indirectly) on the stubs // library will have the appropriate invocation inserted into its // manifest if necessary. - SdkLibraryToImplicitlyTrack: proptools.StringPtr(c.moduleBase.BaseModuleName()), + componentProps.SdkLibraryToImplicitlyTrack = proptools.StringPtr(c.moduleBase.BaseModuleName()) } return componentProps } +// Check if this can be used as a shared library. +func (c *commonToSdkLibraryAndImport) sharedLibrary() bool { + return proptools.BoolDefault(c.commonSdkLibraryProperties.Shared_library, true) +} + // Properties related to the use of a module as an component of a java_sdk_library. type SdkLibraryComponentProperties struct { @@ -907,12 +927,15 @@ func (module *SdkLibrary) DepsMutator(ctx android.BottomUpMutatorContext) { } } - if !proptools.Bool(module.sdkLibraryProperties.Api_only) { - // Add dependency to the rule for generating the xml permissions file - ctx.AddDependency(module, xmlPermissionsFileTag, module.xmlFileName()) - } + if module.requiresRuntimeImplementationLibrary() { + if module.sharedLibrary() { + // Add dependency to the rule for generating the xml permissions file + ctx.AddDependency(module, xmlPermissionsFileTag, module.xmlFileName()) + } - module.Library.deps(ctx) + // Only add the deps for the library if it is actually going to be built. + module.Library.deps(ctx) + } } func (module *SdkLibrary) OutputFiles(tag string) (android.Paths, error) { @@ -925,8 +948,8 @@ func (module *SdkLibrary) OutputFiles(tag string) (android.Paths, error) { } func (module *SdkLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) { - // Don't build an implementation library if this is api only. - if !proptools.Bool(module.sdkLibraryProperties.Api_only) { + // Only build an implementation library if required. + if module.requiresRuntimeImplementationLibrary() { module.Library.GenerateAndroidBuildActions(ctx) } @@ -949,7 +972,7 @@ func (module *SdkLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) } func (module *SdkLibrary) AndroidMkEntries() []android.AndroidMkEntries { - if proptools.Bool(module.sdkLibraryProperties.Api_only) { + if !module.requiresRuntimeImplementationLibrary() { return nil } entriesList := module.Library.AndroidMkEntries() @@ -1387,9 +1410,12 @@ func (module *SdkLibrary) CreateInternalModules(mctx android.DefaultableHookCont module.createStubsLibrary(mctx, scope) } - if !proptools.Bool(module.sdkLibraryProperties.Api_only) { - // for runtime - module.createXmlFile(mctx) + if module.requiresRuntimeImplementationLibrary() { + // Only create an XML permissions file that declares the library as being usable + // as a shared library if required. + if module.sharedLibrary() { + module.createXmlFile(mctx) + } // record java_sdk_library modules so that they are exported to make javaSdkLibraries := javaSdkLibraries(mctx.Config()) @@ -1414,6 +1440,10 @@ func (module *SdkLibrary) InitSdkLibraryProperties() { module.deviceProperties.IsSDKLibrary = true } +func (module *SdkLibrary) requiresRuntimeImplementationLibrary() bool { + return !proptools.Bool(module.sdkLibraryProperties.Api_only) +} + // Defines how to name the individual component modules the sdk library creates. type sdkLibraryComponentNamingScheme interface { stubsLibraryModuleName(scope *apiScope, baseName string) string @@ -1492,6 +1522,18 @@ func SdkLibraryFactory() android.Module { android.AddVisibilityProperty(module, "stubs_source_visibility", &module.sdkLibraryProperties.Stubs_source_visibility) module.SetDefaultableHook(func(ctx android.DefaultableHookContext) { + // If no implementation is required then it cannot be used as a shared library + // either. + if !module.requiresRuntimeImplementationLibrary() { + // If shared_library has been explicitly set to true then it is incompatible + // with api_only: true. + if proptools.Bool(module.commonSdkLibraryProperties.Shared_library) { + ctx.PropertyErrorf("api_only/shared_library", "inconsistent settings, shared_library and api_only cannot both be true") + } + // Set shared_library: false. + module.commonSdkLibraryProperties.Shared_library = proptools.BoolPtr(false) + } + if module.initCommonAfterDefaultsApplied(ctx) { module.CreateInternalModules(ctx) } @@ -1916,7 +1958,7 @@ func (s *sdkLibrarySdkMemberProperties) PopulateFromVariant(ctx android.SdkMembe } s.Libs = sdk.properties.Libs - s.Naming_scheme = sdk.commonProperties.Naming_scheme + s.Naming_scheme = sdk.commonSdkLibraryProperties.Naming_scheme } func (s *sdkLibrarySdkMemberProperties) AddToPropertySet(ctx android.SdkMemberContext, propertySet android.BpPropertySet) {