java_sdk_library: Control shared library use
Previously, all java_sdk_library instances were assumed to be usable as shared libraries, i.e. referenced from <uses-library> in Android manifest. However, that was not true for any instances that specified api_only: true and will not be true for many of the new Android modules. One consequence of this assumption is that use of one of the api_only instances could (but fortunately does not appear to) have lead to an invalid library being referenced in an app's manifest which would prevent the app from loading. That would have been done automatically by the implicit sdk library tracking and manifest fixing mechanism and there would have been nothing a developer could have done about it. Changes: 1) Prevents api_only instances from participating in the automatic tracking which will prevent them from being added to Android manifests and breaking apps. 2) Add a new shared_library property that can have the same effect as api_only while still creating a runtime implementation library. 3) Renamed commonProperties to commonSdkLibraryProperties to disambiguate it from the ModuleBase.commonProperties field. 4) Extracts requiresRuntimeImplementationLibrary() to remove duplicate code accessing the Api_only property. 5) Tests for the api_only and shared_library behaviours. Test: m nothing - added tests, tests broke, fixed code, tests passed. Bug: 156723295 Change-Id: Iccf509e808d5ff53522188541a4c54d8f9ada93c
This commit is contained in:
parent
859fe961b0
commit
dfa131e673
|
@ -1157,6 +1157,16 @@ func TestJavaSdkLibrary(t *testing.T) {
|
||||||
libs: ["foo", "bar.stubs"],
|
libs: ["foo", "bar.stubs"],
|
||||||
sdk_version: "system_current",
|
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 {
|
java_sdk_library_import {
|
||||||
name: "quuz",
|
name: "quuz",
|
||||||
public: {
|
public: {
|
||||||
|
@ -1169,10 +1179,17 @@ func TestJavaSdkLibrary(t *testing.T) {
|
||||||
jars: ["b.jar"],
|
jars: ["b.jar"],
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
java_sdk_library_import {
|
||||||
|
name: "wilma",
|
||||||
|
public: {
|
||||||
|
jars: ["b.jar"],
|
||||||
|
},
|
||||||
|
shared_library: false,
|
||||||
|
}
|
||||||
java_library {
|
java_library {
|
||||||
name: "qux",
|
name: "qux",
|
||||||
srcs: ["c.java"],
|
srcs: ["c.java"],
|
||||||
libs: ["baz", "fred", "quuz.stubs"],
|
libs: ["baz", "fred", "quuz.stubs", "wilma", "barney", "betty"],
|
||||||
sdk_version: "system_current",
|
sdk_version: "system_current",
|
||||||
}
|
}
|
||||||
java_library {
|
java_library {
|
||||||
|
|
|
@ -372,7 +372,10 @@ type sdkLibraryProperties struct {
|
||||||
// Defaults to "api".
|
// Defaults to "api".
|
||||||
Api_dir *string
|
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
|
Api_only *bool
|
||||||
|
|
||||||
// local files that are used within user customized droiddoc options.
|
// 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.
|
// TODO(b/155480189) - Remove once naming inconsistencies have been resolved.
|
||||||
Naming_scheme *string
|
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 <uses-library> element
|
||||||
|
// in an AndroidManifest.xml.
|
||||||
|
Shared_library *bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// Common code between sdk library and sdk library import
|
// Common code between sdk library and sdk library import
|
||||||
|
@ -542,7 +552,7 @@ type commonToSdkLibraryAndImport struct {
|
||||||
|
|
||||||
namingScheme sdkLibraryComponentNamingScheme
|
namingScheme sdkLibraryComponentNamingScheme
|
||||||
|
|
||||||
commonProperties commonToSdkLibraryAndImportProperties
|
commonSdkLibraryProperties commonToSdkLibraryAndImportProperties
|
||||||
|
|
||||||
// Functionality related to this being used as a component of a java_sdk_library.
|
// Functionality related to this being used as a component of a java_sdk_library.
|
||||||
EmbeddableSdkLibraryComponent
|
EmbeddableSdkLibraryComponent
|
||||||
|
@ -551,14 +561,14 @@ type commonToSdkLibraryAndImport struct {
|
||||||
func (c *commonToSdkLibraryAndImport) initCommon(moduleBase *android.ModuleBase) {
|
func (c *commonToSdkLibraryAndImport) initCommon(moduleBase *android.ModuleBase) {
|
||||||
c.moduleBase = moduleBase
|
c.moduleBase = moduleBase
|
||||||
|
|
||||||
moduleBase.AddProperties(&c.commonProperties)
|
moduleBase.AddProperties(&c.commonSdkLibraryProperties)
|
||||||
|
|
||||||
// Initialize this as an sdk library component.
|
// Initialize this as an sdk library component.
|
||||||
c.initSdkLibraryComponent(moduleBase)
|
c.initSdkLibraryComponent(moduleBase)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *commonToSdkLibraryAndImport) initCommonAfterDefaultsApplied(ctx android.DefaultableHookContext) bool {
|
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 {
|
switch schemeProperty {
|
||||||
case "default":
|
case "default":
|
||||||
c.namingScheme = &defaultNamingScheme{}
|
c.namingScheme = &defaultNamingScheme{}
|
||||||
|
@ -569,8 +579,11 @@ func (c *commonToSdkLibraryAndImport) initCommonAfterDefaultsApplied(ctx android
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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.
|
// Use the name specified in the module definition as the owner.
|
||||||
c.sdkLibraryComponentProperties.SdkLibraryToImplicitlyTrack = proptools.StringPtr(c.moduleBase.BaseModuleName())
|
c.sdkLibraryComponentProperties.SdkLibraryToImplicitlyTrack = proptools.StringPtr(c.moduleBase.BaseModuleName())
|
||||||
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
@ -740,17 +753,24 @@ func (c *commonToSdkLibraryAndImport) selectHeaderJarsForSdkVersion(ctx android.
|
||||||
func (c *commonToSdkLibraryAndImport) sdkComponentPropertiesForChildLibrary() interface{} {
|
func (c *commonToSdkLibraryAndImport) sdkComponentPropertiesForChildLibrary() interface{} {
|
||||||
componentProps := &struct {
|
componentProps := &struct {
|
||||||
SdkLibraryToImplicitlyTrack *string
|
SdkLibraryToImplicitlyTrack *string
|
||||||
}{
|
}{}
|
||||||
|
|
||||||
|
if c.sharedLibrary() {
|
||||||
// Mark the stubs library as being components of this java_sdk_library so that
|
// 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
|
// any app that includes code which depends (directly or indirectly) on the stubs
|
||||||
// library will have the appropriate <uses-library> invocation inserted into its
|
// library will have the appropriate <uses-library> invocation inserted into its
|
||||||
// manifest if necessary.
|
// manifest if necessary.
|
||||||
SdkLibraryToImplicitlyTrack: proptools.StringPtr(c.moduleBase.BaseModuleName()),
|
componentProps.SdkLibraryToImplicitlyTrack = proptools.StringPtr(c.moduleBase.BaseModuleName())
|
||||||
}
|
}
|
||||||
|
|
||||||
return componentProps
|
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.
|
// Properties related to the use of a module as an component of a java_sdk_library.
|
||||||
type SdkLibraryComponentProperties struct {
|
type SdkLibraryComponentProperties struct {
|
||||||
|
|
||||||
|
@ -907,12 +927,15 @@ func (module *SdkLibrary) DepsMutator(ctx android.BottomUpMutatorContext) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !proptools.Bool(module.sdkLibraryProperties.Api_only) {
|
if module.requiresRuntimeImplementationLibrary() {
|
||||||
|
if module.sharedLibrary() {
|
||||||
// Add dependency to the rule for generating the xml permissions file
|
// Add dependency to the rule for generating the xml permissions file
|
||||||
ctx.AddDependency(module, xmlPermissionsFileTag, module.xmlFileName())
|
ctx.AddDependency(module, xmlPermissionsFileTag, module.xmlFileName())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Only add the deps for the library if it is actually going to be built.
|
||||||
module.Library.deps(ctx)
|
module.Library.deps(ctx)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (module *SdkLibrary) OutputFiles(tag string) (android.Paths, error) {
|
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) {
|
func (module *SdkLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
||||||
// Don't build an implementation library if this is api only.
|
// Only build an implementation library if required.
|
||||||
if !proptools.Bool(module.sdkLibraryProperties.Api_only) {
|
if module.requiresRuntimeImplementationLibrary() {
|
||||||
module.Library.GenerateAndroidBuildActions(ctx)
|
module.Library.GenerateAndroidBuildActions(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -949,7 +972,7 @@ func (module *SdkLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (module *SdkLibrary) AndroidMkEntries() []android.AndroidMkEntries {
|
func (module *SdkLibrary) AndroidMkEntries() []android.AndroidMkEntries {
|
||||||
if proptools.Bool(module.sdkLibraryProperties.Api_only) {
|
if !module.requiresRuntimeImplementationLibrary() {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
entriesList := module.Library.AndroidMkEntries()
|
entriesList := module.Library.AndroidMkEntries()
|
||||||
|
@ -1387,9 +1410,12 @@ func (module *SdkLibrary) CreateInternalModules(mctx android.DefaultableHookCont
|
||||||
module.createStubsLibrary(mctx, scope)
|
module.createStubsLibrary(mctx, scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !proptools.Bool(module.sdkLibraryProperties.Api_only) {
|
if module.requiresRuntimeImplementationLibrary() {
|
||||||
// for runtime
|
// 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)
|
module.createXmlFile(mctx)
|
||||||
|
}
|
||||||
|
|
||||||
// record java_sdk_library modules so that they are exported to make
|
// record java_sdk_library modules so that they are exported to make
|
||||||
javaSdkLibraries := javaSdkLibraries(mctx.Config())
|
javaSdkLibraries := javaSdkLibraries(mctx.Config())
|
||||||
|
@ -1414,6 +1440,10 @@ func (module *SdkLibrary) InitSdkLibraryProperties() {
|
||||||
module.deviceProperties.IsSDKLibrary = true
|
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.
|
// Defines how to name the individual component modules the sdk library creates.
|
||||||
type sdkLibraryComponentNamingScheme interface {
|
type sdkLibraryComponentNamingScheme interface {
|
||||||
stubsLibraryModuleName(scope *apiScope, baseName string) string
|
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)
|
android.AddVisibilityProperty(module, "stubs_source_visibility", &module.sdkLibraryProperties.Stubs_source_visibility)
|
||||||
|
|
||||||
module.SetDefaultableHook(func(ctx android.DefaultableHookContext) {
|
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) {
|
if module.initCommonAfterDefaultsApplied(ctx) {
|
||||||
module.CreateInternalModules(ctx)
|
module.CreateInternalModules(ctx)
|
||||||
}
|
}
|
||||||
|
@ -1916,7 +1958,7 @@ func (s *sdkLibrarySdkMemberProperties) PopulateFromVariant(ctx android.SdkMembe
|
||||||
}
|
}
|
||||||
|
|
||||||
s.Libs = sdk.properties.Libs
|
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) {
|
func (s *sdkLibrarySdkMemberProperties) AddToPropertySet(ctx android.SdkMemberContext, propertySet android.BpPropertySet) {
|
||||||
|
|
Loading…
Reference in New Issue