From e570ace2e4dbc7a2b4eb895f7a06d250e35b1cd9 Mon Sep 17 00:00:00 2001 From: Jamie Garside Date: Mon, 27 Nov 2023 12:07:36 +0000 Subject: [PATCH] Add the ability for a java_sdk_library to depend on another. This simply exports all of the uses_libs: [] libraries into a "dependency=''" statement in the generated XML file (with the stanza in it). Test: `go test` in java/ Bug: 184396657 NOTE FOR REVIEWERS - original patch and result patch are not identical. PLEASE REVIEW CAREFULLY. Diffs between the patches: func formattedDependenciesAttribute(dependencies []string) string { > + if dependencies == nil { > + return "" > + } > + return fmt.Sprintf(` dependency=\"%s\"\n`, strings.Join(dependencies, ":")) > +} > + > + dependenciesAttr := formattedDependenciesAttribute(module.properties.Uses_libs_dependencies) > + dependenciesAttr, > --- java/sdk_library_test.go > +++ java/sdk_library_test.go > + > +func TestSdkLibraryDependency(t *testing.T) { > + result := android.GroupFixturePreparers( > + prepareForJavaTest, > + PrepareForTestWithJavaSdkLibraryFiles, > + FixtureWithPrebuiltApis(map[string][]string{ > + "30": {"bar", "foo"}, > + }), > + ).RunTestWithBp(t, > + ` > + java_sdk_library { > + name: "foo", > + srcs: ["a.java", "b.java"], > + api_packages: ["foo"], > + } > + > + java_sdk_library { > + name: "bar", > + srcs: ["c.java", "b.java"], > + libs: [ > + "foo", > + ], > + uses_libs: [ > + "foo", > + ], > + } > +`) > + > + barPermissions := result.ModuleForTests("bar.xml", "android_common").Rule("java_sdk_xml") > + > + android.AssertStringDoesContain(t, "bar.xml java_sdk_xml command", barPermissions.RuleParams.Command, `dependency=\"foo\"`) > +} Original patch: diff --git a/java/sdk_library.go b/java/sdk_library.go old mode 100644 new mode 100644 --- a/java/sdk_library.go +++ b/java/sdk_library.go @@ -1993,6 +1993,7 @@ Min_device_sdk *string Max_device_sdk *string Sdk_library_min_api_level *string + Uses_libs_dependencies []string }{ Name: proptools.StringPtr(module.xmlPermissionsModuleName()), Lib_name: proptools.StringPtr(module.BaseModuleName()), @@ -2002,6 +2003,7 @@ Min_device_sdk: module.commonSdkLibraryProperties.Min_device_sdk, Max_device_sdk: module.commonSdkLibraryProperties.Max_device_sdk, Sdk_library_min_api_level: &moduleMinApiLevelStr, + Uses_libs_dependencies: module.usesLibraryProperties.Uses_libs, } mctx.CreateModule(sdkLibraryXmlFactory, &props) @@ -2968,6 +2970,11 @@ // // This value comes from the ApiLevel of the MinSdkVersion property. Sdk_library_min_api_level *string + + // Uses-libs dependencies that the shared libra [[[Original patch trimmed due to size. Decoded string size: 3559. Decoded string SHA1: 67fbd040aa818732a686514c4556850c8c36dc8d.]]] Result patch: diff --git a/java/sdk_library.go b/java/sdk_library.go index fb27812..fbfe509 100644 --- a/java/sdk_library.go +++ b/java/sdk_library.go @@ -1993,6 +1993,7 @@ Min_device_sdk *string Max_device_sdk *string Sdk_library_min_api_level *string + Uses_libs_dependencies []string }{ Name: proptools.StringPtr(module.xmlPermissionsModuleName()), Lib_name: proptools.StringPtr(module.BaseModuleName()), @@ -2002,6 +2003,7 @@ Min_device_sdk: module.commonSdkLibraryProperties.Min_device_sdk, Max_device_sdk: module.commonSdkLibraryProperties.Max_device_sdk, Sdk_library_min_api_level: &moduleMinApiLevelStr, + Uses_libs_dependencies: module.usesLibraryProperties.Uses_libs, } mctx.CreateModule(sdkLibraryXmlFactory, &props) @@ -2968,6 +2970,11 @@ // // This value comes from the ApiLevel of the MinSdkVersion property. Sdk_library_min_api_level *string + + // Uses-libs dependencies that the shared library [[[Result patch trimmed due to size. Decoded string size: 3614. Decoded string SHA1: b5730ecbeeaad420439ddb67eaaa9150ede94585.]]] Change-Id: I73f69e2a4573e416492f68e083fe739f3f75b721 --- java/sdk_library.go | 16 ++++++++++++++++ java/sdk_library_test.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/java/sdk_library.go b/java/sdk_library.go index fb2781213..fbfe509b8 100644 --- a/java/sdk_library.go +++ b/java/sdk_library.go @@ -1993,6 +1993,7 @@ func (module *SdkLibrary) createXmlFile(mctx android.DefaultableHookContext) { Min_device_sdk *string Max_device_sdk *string Sdk_library_min_api_level *string + Uses_libs_dependencies []string }{ Name: proptools.StringPtr(module.xmlPermissionsModuleName()), Lib_name: proptools.StringPtr(module.BaseModuleName()), @@ -2002,6 +2003,7 @@ func (module *SdkLibrary) createXmlFile(mctx android.DefaultableHookContext) { Min_device_sdk: module.commonSdkLibraryProperties.Min_device_sdk, Max_device_sdk: module.commonSdkLibraryProperties.Max_device_sdk, Sdk_library_min_api_level: &moduleMinApiLevelStr, + Uses_libs_dependencies: module.usesLibraryProperties.Uses_libs, } mctx.CreateModule(sdkLibraryXmlFactory, &props) @@ -2968,6 +2970,11 @@ type sdkLibraryXmlProperties struct { // // This value comes from the ApiLevel of the MinSdkVersion property. Sdk_library_min_api_level *string + + // Uses-libs dependencies that the shared library requires to work correctly. + // + // This will add dependency="foo:bar" to the section. + Uses_libs_dependencies []string } // java_sdk_library_xml builds the permission xml file for a java_sdk_library. @@ -3076,6 +3083,13 @@ func formattedOptionalAttribute(attrName string, value *string) string { return fmt.Sprintf(` %s=\"%s\"\n`, attrName, *value) } +func formattedDependenciesAttribute(dependencies []string) string { + if dependencies == nil { + return "" + } + return fmt.Sprintf(` dependency=\"%s\"\n`, strings.Join(dependencies, ":")) +} + func (module *sdkLibraryXml) permissionsContents(ctx android.ModuleContext) string { libName := proptools.String(module.properties.Lib_name) libNameAttr := formattedOptionalAttribute("name", &libName) @@ -3085,6 +3099,7 @@ func (module *sdkLibraryXml) permissionsContents(ctx android.ModuleContext) stri implicitUntilAttr := formattedOptionalSdkLevelAttribute(ctx, "on-bootclasspath-before", module.properties.On_bootclasspath_before) minSdkAttr := formattedOptionalSdkLevelAttribute(ctx, "min-device-sdk", module.properties.Min_device_sdk) maxSdkAttr := formattedOptionalSdkLevelAttribute(ctx, "max-device-sdk", module.properties.Max_device_sdk) + dependenciesAttr := formattedDependenciesAttribute(module.properties.Uses_libs_dependencies) // is understood in all android versions whereas is only understood from API T (and ignored before that). // similarly, min_device_sdk is only understood from T. So if a library is using that, we need to use the apex-library to make sure this library is not loaded before T var libraryTag string @@ -3118,6 +3133,7 @@ func (module *sdkLibraryXml) permissionsContents(ctx android.ModuleContext) stri implicitUntilAttr, minSdkAttr, maxSdkAttr, + dependenciesAttr, ` />\n`, `\n`}, "") } diff --git a/java/sdk_library_test.go b/java/sdk_library_test.go index 82f8a4d50..a136818ca 100644 --- a/java/sdk_library_test.go +++ b/java/sdk_library_test.go @@ -1665,3 +1665,35 @@ func TestStaticDepStubLibrariesVisibility(t *testing.T) { } `) } + +func TestSdkLibraryDependency(t *testing.T) { + result := android.GroupFixturePreparers( + prepareForJavaTest, + PrepareForTestWithJavaSdkLibraryFiles, + FixtureWithPrebuiltApis(map[string][]string{ + "30": {"bar", "foo"}, + }), + ).RunTestWithBp(t, + ` + java_sdk_library { + name: "foo", + srcs: ["a.java", "b.java"], + api_packages: ["foo"], + } + + java_sdk_library { + name: "bar", + srcs: ["c.java", "b.java"], + libs: [ + "foo", + ], + uses_libs: [ + "foo", + ], + } +`) + + barPermissions := result.ModuleForTests("bar.xml", "android_common").Rule("java_sdk_xml") + + android.AssertStringDoesContain(t, "bar.xml java_sdk_xml command", barPermissions.RuleParams.Command, `dependency=\"foo\"`) +}