Loading java/aar.go +5 −2 Original line number Diff line number Diff line Loading @@ -379,8 +379,11 @@ func aaptLibs(ctx android.ModuleContext, sdkContext sdkContext) (transitiveStati sharedLibs = append(sharedLibs, exportPackage) } if _, ok := module.(SdkLibraryDependency); ok { sdkLibraries = append(sdkLibraries, ctx.OtherModuleName(module)) // If the module is (or possibly could be) a component of a java_sdk_library // (including the java_sdk_library) itself then append any implicit sdk library // names to the list of sdk libraries to be added to the manifest. if component, ok := module.(SdkLibraryComponentDependency); ok { sdkLibraries = append(sdkLibraries, component.OptionalImplicitSdkLibrary()...) } case frameworkResTag: Loading java/app_test.go +24 −0 Original line number Diff line number Diff line Loading @@ -2382,6 +2382,20 @@ func TestUsesLibraries(t *testing.T) { sdk_version: "current", } java_sdk_library { name: "qux", srcs: ["a.java"], api_packages: ["qux"], sdk_version: "current", } java_sdk_library { name: "quuz", srcs: ["a.java"], api_packages: ["quuz"], sdk_version: "current", } java_sdk_library { name: "bar", srcs: ["a.java"], Loading @@ -2392,6 +2406,7 @@ func TestUsesLibraries(t *testing.T) { android_app { name: "app", srcs: ["a.java"], libs: ["qux", "quuz.stubs"], uses_libs: ["foo"], sdk_version: "current", optional_uses_libs: [ Loading Loading @@ -2422,6 +2437,15 @@ func TestUsesLibraries(t *testing.T) { app := ctx.ModuleForTests("app", "android_common") prebuilt := ctx.ModuleForTests("prebuilt", "android_common") // Test that implicit dependencies on java_sdk_library instances are passed to the manifest. manifestFixerArgs := app.Output("manifest_fixer/AndroidManifest.xml").Args["args"] if w := "--uses-library qux"; !strings.Contains(manifestFixerArgs, w) { t.Errorf("unexpected manifest_fixer args: wanted %q in %q", w, manifestFixerArgs) } if w := "--uses-library quuz"; !strings.Contains(manifestFixerArgs, w) { t.Errorf("unexpected manifest_fixer args: wanted %q in %q", w, manifestFixerArgs) } // Test that all libraries are verified cmd := app.Rule("verify_uses_libraries").RuleParams.Command if w := "--uses-library foo"; !strings.Contains(cmd, w) { Loading java/java.go +27 −6 Original line number Diff line number Diff line Loading @@ -355,7 +355,17 @@ func (me *CompilerDeviceProperties) EffectiveOptimizeEnabled() bool { } // Functionality common to Module and Import // // It is embedded in Module so its functionality can be used by methods in Module // but it is currently only initialized by Import and Library. type embeddableInModuleAndImport struct { // Functionality related to this being used as a component of a java_sdk_library. EmbeddableSdkLibraryComponent } func (e *embeddableInModuleAndImport) initModuleAndImport(moduleBase *android.ModuleBase) { e.initSdkLibraryComponent(moduleBase) } // Module/Import's DepIsInSameApex(...) delegates to this method. Loading Loading @@ -496,11 +506,6 @@ type Dependency interface { JacocoReportClassesFile() android.Path } type SdkLibraryDependency interface { SdkHeaderJars(ctx android.BaseModuleContext, sdkVersion sdkSpec) android.Paths SdkImplementationJars(ctx android.BaseModuleContext, sdkVersion sdkSpec) android.Paths } type xref interface { XrefJavaFiles() android.Paths } Loading Loading @@ -930,6 +935,12 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps { } } // If this is a component library (stubs, etc.) for a java_sdk_library then // add the name of that java_sdk_library to the exported sdk libs to make sure // that, if necessary, a <uses-library> element for that java_sdk_library is // added to the Android manifest. j.exportedSdkLibs = append(j.exportedSdkLibs, j.OptionalImplicitSdkLibrary()...) ctx.VisitDirectDeps(func(module android.Module) { otherName := ctx.OtherModuleName(module) tag := ctx.OtherModuleDependencyTag(module) Loading @@ -949,7 +960,7 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps { case libTag: deps.classpath = append(deps.classpath, dep.SdkHeaderJars(ctx, j.sdkVersion())...) // names of sdk libs that are directly depended are exported j.exportedSdkLibs = append(j.exportedSdkLibs, otherName) j.exportedSdkLibs = append(j.exportedSdkLibs, dep.OptionalImplicitSdkLibrary()...) case staticLibTag: ctx.ModuleErrorf("dependency on java_sdk_library %q can only be in libs", otherName) } Loading Loading @@ -1990,6 +2001,8 @@ func LibraryFactory() android.Module { &module.Module.protoProperties, &module.libraryProperties) module.initModuleAndImport(&module.ModuleBase) android.InitApexModule(module) android.InitSdkAwareModule(module) InitJavaModule(module, android.HostAndDeviceSupported) Loading Loading @@ -2451,6 +2464,12 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) { } j.combinedClasspathFile = outputFile // If this is a component library (impl, stubs, etc.) for a java_sdk_library then // add the name of that java_sdk_library to the exported sdk libs to make sure // that, if necessary, a <uses-library> element for that java_sdk_library is // added to the Android manifest. j.exportedSdkLibs = append(j.exportedSdkLibs, j.OptionalImplicitSdkLibrary()...) ctx.VisitDirectDeps(func(module android.Module) { otherName := ctx.OtherModuleName(module) tag := ctx.OtherModuleDependencyTag(module) Loading Loading @@ -2567,6 +2586,8 @@ func ImportFactory() android.Module { module.AddProperties(&module.properties) module.initModuleAndImport(&module.ModuleBase) android.InitPrebuiltModule(module, &module.properties.Jars) android.InitApexModule(module) android.InitSdkAwareModule(module) Loading java/java_test.go +35 −4 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ import ( "os" "path/filepath" "reflect" "sort" "strconv" "strings" "testing" Loading Loading @@ -1153,13 +1154,42 @@ func TestJavaSdkLibrary(t *testing.T) { java_library { name: "baz", srcs: ["c.java"], libs: ["foo", "bar"], 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: { jars: ["c.jar"], }, } java_sdk_library_import { name: "fred", public: { 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"], libs: ["baz", "fred", "quuz.stubs", "wilma", "barney", "betty"], sdk_version: "system_current", } java_library { Loading Loading @@ -1224,8 +1254,9 @@ func TestJavaSdkLibrary(t *testing.T) { qux := ctx.ModuleForTests("qux", "android_common") if quxLib, ok := qux.Module().(*Library); ok { sdkLibs := quxLib.ExportedSdkLibs() if len(sdkLibs) != 2 || !android.InList("foo", sdkLibs) || !android.InList("bar", sdkLibs) { t.Errorf("qux should export \"foo\" and \"bar\" but exports %v", sdkLibs) sort.Strings(sdkLibs) if w := []string{"bar", "foo", "fred", "quuz"}; !reflect.DeepEqual(w, sdkLibs) { t.Errorf("qux should export %q but exports %q", w, sdkLibs) } } } Loading java/sdk_library.go +150 −18 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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 <uses-library> element // in an AndroidManifest.xml. Shared_library *bool } // Common code between sdk library and sdk library import Loading @@ -542,17 +552,23 @@ type commonToSdkLibraryAndImport struct { namingScheme sdkLibraryComponentNamingScheme commonProperties commonToSdkLibraryAndImportProperties commonSdkLibraryProperties commonToSdkLibraryAndImportProperties // Functionality related to this being used as a component of a java_sdk_library. EmbeddableSdkLibraryComponent } 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{} Loading @@ -563,6 +579,12 @@ func (c *commonToSdkLibraryAndImport) initCommonAfterDefaultsApplied(ctx android 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. c.sdkLibraryComponentProperties.SdkLibraryToImplicitlyTrack = proptools.StringPtr(c.moduleBase.BaseModuleName()) } return true } Loading Loading @@ -728,6 +750,91 @@ func (c *commonToSdkLibraryAndImport) selectHeaderJarsForSdkVersion(ctx android. return paths.stubsHeaderPath } 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 <uses-library> invocation inserted into its // manifest if necessary. 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 { // The name of the java_sdk_library/_import to add to a <uses-library> entry // in the AndroidManifest.xml of any Android app that includes code that references // this module. If not set then no java_sdk_library/_import is tracked. SdkLibraryToImplicitlyTrack *string `blueprint:"mutated"` } // Structure to be embedded in a module struct that needs to support the // SdkLibraryComponentDependency interface. type EmbeddableSdkLibraryComponent struct { sdkLibraryComponentProperties SdkLibraryComponentProperties } func (e *EmbeddableSdkLibraryComponent) initSdkLibraryComponent(moduleBase *android.ModuleBase) { moduleBase.AddProperties(&e.sdkLibraryComponentProperties) } // to satisfy SdkLibraryComponentDependency func (e *EmbeddableSdkLibraryComponent) OptionalImplicitSdkLibrary() []string { if e.sdkLibraryComponentProperties.SdkLibraryToImplicitlyTrack != nil { return []string{*e.sdkLibraryComponentProperties.SdkLibraryToImplicitlyTrack} } return nil } // Implemented by modules that are (or possibly could be) a component of a java_sdk_library // (including the java_sdk_library) itself. type SdkLibraryComponentDependency interface { // The optional name of the sdk library that should be implicitly added to the // AndroidManifest of an app that contains code which references the sdk library. // // Returns an array containing 0 or 1 items rather than a *string to make it easier // to append this to the list of exported sdk libraries. OptionalImplicitSdkLibrary() []string } // Make sure that all the module types that are components of java_sdk_library/_import // and which can be referenced (directly or indirectly) from an android app implement // the SdkLibraryComponentDependency interface. var _ SdkLibraryComponentDependency = (*Library)(nil) var _ SdkLibraryComponentDependency = (*Import)(nil) var _ SdkLibraryComponentDependency = (*SdkLibrary)(nil) var _ SdkLibraryComponentDependency = (*sdkLibraryImport)(nil) // Provides access to sdk_version related header and implentation jars. type SdkLibraryDependency interface { SdkLibraryComponentDependency // Get the header jars appropriate for the supplied sdk_version. // // These are turbine generated jars so they only change if the externals of the // class changes but it does not contain and implementation or JavaDoc. SdkHeaderJars(ctx android.BaseModuleContext, sdkVersion sdkSpec) android.Paths // Get the implementation jars appropriate for the supplied sdk version. // // These are either the implementation jar for the whole sdk library or the implementation // jars for the stubs. The latter should only be needed when generating JavaDoc as otherwise // they are identical to the corresponding header jars. SdkImplementationJars(ctx android.BaseModuleContext, sdkVersion sdkSpec) android.Paths } type SdkLibrary struct { Library Loading Loading @@ -820,13 +927,16 @@ 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 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) } } func (module *SdkLibrary) OutputFiles(tag string) (android.Paths, error) { paths, err := module.commonOutputFiles(tag) Loading @@ -838,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) } Loading @@ -862,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() Loading Loading @@ -980,7 +1090,7 @@ func (module *SdkLibrary) createStubsLibrary(mctx android.DefaultableHookContext props.Dist.Tag = proptools.StringPtr(".jar") } mctx.CreateModule(LibraryFactory, &props) mctx.CreateModule(LibraryFactory, &props, module.sdkComponentPropertiesForChildLibrary()) } // Creates a droidstubs module that creates stubs source files from the given full source Loading Loading @@ -1302,9 +1412,12 @@ func (module *SdkLibrary) CreateInternalModules(mctx android.DefaultableHookCont module.createStubsLibrary(mctx, scope) } if !proptools.Bool(module.sdkLibraryProperties.Api_only) { // for runtime 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()) Loading @@ -1323,10 +1436,16 @@ func (module *SdkLibrary) InitSdkLibraryProperties() { &module.protoProperties, ) module.initSdkLibraryComponent(&module.ModuleBase) module.properties.Installable = proptools.BoolPtr(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. type sdkLibraryComponentNamingScheme interface { stubsLibraryModuleName(scope *apiScope, baseName string) string Loading Loading @@ -1405,6 +1524,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) } Loading Loading @@ -1571,7 +1702,8 @@ func (module *sdkLibraryImport) createJavaImportForStubs(mctx android.Defaultabl // The imports are preferred if the java_sdk_library_import is preferred. props.Prefer = proptools.BoolPtr(module.prebuilt.Prefer()) mctx.CreateModule(ImportFactory, &props) mctx.CreateModule(ImportFactory, &props, module.sdkComponentPropertiesForChildLibrary()) } func (module *sdkLibraryImport) createPrebuiltStubsSources(mctx android.DefaultableHookContext, apiScope *apiScope, scopeProperties *sdkLibraryScopeProperties) { Loading Loading @@ -1828,7 +1960,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) { Loading Loading
java/aar.go +5 −2 Original line number Diff line number Diff line Loading @@ -379,8 +379,11 @@ func aaptLibs(ctx android.ModuleContext, sdkContext sdkContext) (transitiveStati sharedLibs = append(sharedLibs, exportPackage) } if _, ok := module.(SdkLibraryDependency); ok { sdkLibraries = append(sdkLibraries, ctx.OtherModuleName(module)) // If the module is (or possibly could be) a component of a java_sdk_library // (including the java_sdk_library) itself then append any implicit sdk library // names to the list of sdk libraries to be added to the manifest. if component, ok := module.(SdkLibraryComponentDependency); ok { sdkLibraries = append(sdkLibraries, component.OptionalImplicitSdkLibrary()...) } case frameworkResTag: Loading
java/app_test.go +24 −0 Original line number Diff line number Diff line Loading @@ -2382,6 +2382,20 @@ func TestUsesLibraries(t *testing.T) { sdk_version: "current", } java_sdk_library { name: "qux", srcs: ["a.java"], api_packages: ["qux"], sdk_version: "current", } java_sdk_library { name: "quuz", srcs: ["a.java"], api_packages: ["quuz"], sdk_version: "current", } java_sdk_library { name: "bar", srcs: ["a.java"], Loading @@ -2392,6 +2406,7 @@ func TestUsesLibraries(t *testing.T) { android_app { name: "app", srcs: ["a.java"], libs: ["qux", "quuz.stubs"], uses_libs: ["foo"], sdk_version: "current", optional_uses_libs: [ Loading Loading @@ -2422,6 +2437,15 @@ func TestUsesLibraries(t *testing.T) { app := ctx.ModuleForTests("app", "android_common") prebuilt := ctx.ModuleForTests("prebuilt", "android_common") // Test that implicit dependencies on java_sdk_library instances are passed to the manifest. manifestFixerArgs := app.Output("manifest_fixer/AndroidManifest.xml").Args["args"] if w := "--uses-library qux"; !strings.Contains(manifestFixerArgs, w) { t.Errorf("unexpected manifest_fixer args: wanted %q in %q", w, manifestFixerArgs) } if w := "--uses-library quuz"; !strings.Contains(manifestFixerArgs, w) { t.Errorf("unexpected manifest_fixer args: wanted %q in %q", w, manifestFixerArgs) } // Test that all libraries are verified cmd := app.Rule("verify_uses_libraries").RuleParams.Command if w := "--uses-library foo"; !strings.Contains(cmd, w) { Loading
java/java.go +27 −6 Original line number Diff line number Diff line Loading @@ -355,7 +355,17 @@ func (me *CompilerDeviceProperties) EffectiveOptimizeEnabled() bool { } // Functionality common to Module and Import // // It is embedded in Module so its functionality can be used by methods in Module // but it is currently only initialized by Import and Library. type embeddableInModuleAndImport struct { // Functionality related to this being used as a component of a java_sdk_library. EmbeddableSdkLibraryComponent } func (e *embeddableInModuleAndImport) initModuleAndImport(moduleBase *android.ModuleBase) { e.initSdkLibraryComponent(moduleBase) } // Module/Import's DepIsInSameApex(...) delegates to this method. Loading Loading @@ -496,11 +506,6 @@ type Dependency interface { JacocoReportClassesFile() android.Path } type SdkLibraryDependency interface { SdkHeaderJars(ctx android.BaseModuleContext, sdkVersion sdkSpec) android.Paths SdkImplementationJars(ctx android.BaseModuleContext, sdkVersion sdkSpec) android.Paths } type xref interface { XrefJavaFiles() android.Paths } Loading Loading @@ -930,6 +935,12 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps { } } // If this is a component library (stubs, etc.) for a java_sdk_library then // add the name of that java_sdk_library to the exported sdk libs to make sure // that, if necessary, a <uses-library> element for that java_sdk_library is // added to the Android manifest. j.exportedSdkLibs = append(j.exportedSdkLibs, j.OptionalImplicitSdkLibrary()...) ctx.VisitDirectDeps(func(module android.Module) { otherName := ctx.OtherModuleName(module) tag := ctx.OtherModuleDependencyTag(module) Loading @@ -949,7 +960,7 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps { case libTag: deps.classpath = append(deps.classpath, dep.SdkHeaderJars(ctx, j.sdkVersion())...) // names of sdk libs that are directly depended are exported j.exportedSdkLibs = append(j.exportedSdkLibs, otherName) j.exportedSdkLibs = append(j.exportedSdkLibs, dep.OptionalImplicitSdkLibrary()...) case staticLibTag: ctx.ModuleErrorf("dependency on java_sdk_library %q can only be in libs", otherName) } Loading Loading @@ -1990,6 +2001,8 @@ func LibraryFactory() android.Module { &module.Module.protoProperties, &module.libraryProperties) module.initModuleAndImport(&module.ModuleBase) android.InitApexModule(module) android.InitSdkAwareModule(module) InitJavaModule(module, android.HostAndDeviceSupported) Loading Loading @@ -2451,6 +2464,12 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) { } j.combinedClasspathFile = outputFile // If this is a component library (impl, stubs, etc.) for a java_sdk_library then // add the name of that java_sdk_library to the exported sdk libs to make sure // that, if necessary, a <uses-library> element for that java_sdk_library is // added to the Android manifest. j.exportedSdkLibs = append(j.exportedSdkLibs, j.OptionalImplicitSdkLibrary()...) ctx.VisitDirectDeps(func(module android.Module) { otherName := ctx.OtherModuleName(module) tag := ctx.OtherModuleDependencyTag(module) Loading Loading @@ -2567,6 +2586,8 @@ func ImportFactory() android.Module { module.AddProperties(&module.properties) module.initModuleAndImport(&module.ModuleBase) android.InitPrebuiltModule(module, &module.properties.Jars) android.InitApexModule(module) android.InitSdkAwareModule(module) Loading
java/java_test.go +35 −4 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ import ( "os" "path/filepath" "reflect" "sort" "strconv" "strings" "testing" Loading Loading @@ -1153,13 +1154,42 @@ func TestJavaSdkLibrary(t *testing.T) { java_library { name: "baz", srcs: ["c.java"], libs: ["foo", "bar"], 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: { jars: ["c.jar"], }, } java_sdk_library_import { name: "fred", public: { 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"], libs: ["baz", "fred", "quuz.stubs", "wilma", "barney", "betty"], sdk_version: "system_current", } java_library { Loading Loading @@ -1224,8 +1254,9 @@ func TestJavaSdkLibrary(t *testing.T) { qux := ctx.ModuleForTests("qux", "android_common") if quxLib, ok := qux.Module().(*Library); ok { sdkLibs := quxLib.ExportedSdkLibs() if len(sdkLibs) != 2 || !android.InList("foo", sdkLibs) || !android.InList("bar", sdkLibs) { t.Errorf("qux should export \"foo\" and \"bar\" but exports %v", sdkLibs) sort.Strings(sdkLibs) if w := []string{"bar", "foo", "fred", "quuz"}; !reflect.DeepEqual(w, sdkLibs) { t.Errorf("qux should export %q but exports %q", w, sdkLibs) } } } Loading
java/sdk_library.go +150 −18 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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 <uses-library> element // in an AndroidManifest.xml. Shared_library *bool } // Common code between sdk library and sdk library import Loading @@ -542,17 +552,23 @@ type commonToSdkLibraryAndImport struct { namingScheme sdkLibraryComponentNamingScheme commonProperties commonToSdkLibraryAndImportProperties commonSdkLibraryProperties commonToSdkLibraryAndImportProperties // Functionality related to this being used as a component of a java_sdk_library. EmbeddableSdkLibraryComponent } 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{} Loading @@ -563,6 +579,12 @@ func (c *commonToSdkLibraryAndImport) initCommonAfterDefaultsApplied(ctx android 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. c.sdkLibraryComponentProperties.SdkLibraryToImplicitlyTrack = proptools.StringPtr(c.moduleBase.BaseModuleName()) } return true } Loading Loading @@ -728,6 +750,91 @@ func (c *commonToSdkLibraryAndImport) selectHeaderJarsForSdkVersion(ctx android. return paths.stubsHeaderPath } 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 <uses-library> invocation inserted into its // manifest if necessary. 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 { // The name of the java_sdk_library/_import to add to a <uses-library> entry // in the AndroidManifest.xml of any Android app that includes code that references // this module. If not set then no java_sdk_library/_import is tracked. SdkLibraryToImplicitlyTrack *string `blueprint:"mutated"` } // Structure to be embedded in a module struct that needs to support the // SdkLibraryComponentDependency interface. type EmbeddableSdkLibraryComponent struct { sdkLibraryComponentProperties SdkLibraryComponentProperties } func (e *EmbeddableSdkLibraryComponent) initSdkLibraryComponent(moduleBase *android.ModuleBase) { moduleBase.AddProperties(&e.sdkLibraryComponentProperties) } // to satisfy SdkLibraryComponentDependency func (e *EmbeddableSdkLibraryComponent) OptionalImplicitSdkLibrary() []string { if e.sdkLibraryComponentProperties.SdkLibraryToImplicitlyTrack != nil { return []string{*e.sdkLibraryComponentProperties.SdkLibraryToImplicitlyTrack} } return nil } // Implemented by modules that are (or possibly could be) a component of a java_sdk_library // (including the java_sdk_library) itself. type SdkLibraryComponentDependency interface { // The optional name of the sdk library that should be implicitly added to the // AndroidManifest of an app that contains code which references the sdk library. // // Returns an array containing 0 or 1 items rather than a *string to make it easier // to append this to the list of exported sdk libraries. OptionalImplicitSdkLibrary() []string } // Make sure that all the module types that are components of java_sdk_library/_import // and which can be referenced (directly or indirectly) from an android app implement // the SdkLibraryComponentDependency interface. var _ SdkLibraryComponentDependency = (*Library)(nil) var _ SdkLibraryComponentDependency = (*Import)(nil) var _ SdkLibraryComponentDependency = (*SdkLibrary)(nil) var _ SdkLibraryComponentDependency = (*sdkLibraryImport)(nil) // Provides access to sdk_version related header and implentation jars. type SdkLibraryDependency interface { SdkLibraryComponentDependency // Get the header jars appropriate for the supplied sdk_version. // // These are turbine generated jars so they only change if the externals of the // class changes but it does not contain and implementation or JavaDoc. SdkHeaderJars(ctx android.BaseModuleContext, sdkVersion sdkSpec) android.Paths // Get the implementation jars appropriate for the supplied sdk version. // // These are either the implementation jar for the whole sdk library or the implementation // jars for the stubs. The latter should only be needed when generating JavaDoc as otherwise // they are identical to the corresponding header jars. SdkImplementationJars(ctx android.BaseModuleContext, sdkVersion sdkSpec) android.Paths } type SdkLibrary struct { Library Loading Loading @@ -820,13 +927,16 @@ 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 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) } } func (module *SdkLibrary) OutputFiles(tag string) (android.Paths, error) { paths, err := module.commonOutputFiles(tag) Loading @@ -838,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) } Loading @@ -862,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() Loading Loading @@ -980,7 +1090,7 @@ func (module *SdkLibrary) createStubsLibrary(mctx android.DefaultableHookContext props.Dist.Tag = proptools.StringPtr(".jar") } mctx.CreateModule(LibraryFactory, &props) mctx.CreateModule(LibraryFactory, &props, module.sdkComponentPropertiesForChildLibrary()) } // Creates a droidstubs module that creates stubs source files from the given full source Loading Loading @@ -1302,9 +1412,12 @@ func (module *SdkLibrary) CreateInternalModules(mctx android.DefaultableHookCont module.createStubsLibrary(mctx, scope) } if !proptools.Bool(module.sdkLibraryProperties.Api_only) { // for runtime 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()) Loading @@ -1323,10 +1436,16 @@ func (module *SdkLibrary) InitSdkLibraryProperties() { &module.protoProperties, ) module.initSdkLibraryComponent(&module.ModuleBase) module.properties.Installable = proptools.BoolPtr(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. type sdkLibraryComponentNamingScheme interface { stubsLibraryModuleName(scope *apiScope, baseName string) string Loading Loading @@ -1405,6 +1524,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) } Loading Loading @@ -1571,7 +1702,8 @@ func (module *sdkLibraryImport) createJavaImportForStubs(mctx android.Defaultabl // The imports are preferred if the java_sdk_library_import is preferred. props.Prefer = proptools.BoolPtr(module.prebuilt.Prefer()) mctx.CreateModule(ImportFactory, &props) mctx.CreateModule(ImportFactory, &props, module.sdkComponentPropertiesForChildLibrary()) } func (module *sdkLibraryImport) createPrebuiltStubsSources(mctx android.DefaultableHookContext, apiScope *apiScope, scopeProperties *sdkLibraryScopeProperties) { Loading Loading @@ -1828,7 +1960,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) { Loading