From 58423878328d3e1e126b4473e786c18f03e9c0e2 Mon Sep 17 00:00:00 2001 From: Paul Duffin Date: Wed, 30 Jun 2021 18:25:36 +0100 Subject: [PATCH] Support using java_sdk_library components in stub_libs Previously, if a bootclasspath_fragment had both a java_sdk_library module and one of its components in stub_libs properties they would be treated as separate modules instead of simply different APIs from the same module. That would result in them both providing stub dex jars to "hiddenapi list" which would fail because it found duplicate definitions of the same class. e.g. Specifying something like this: api: { stub_libs: [ "art.module.public.api", ], }, core_platform_api: { stub_libs: [ "art.module.public.api.stubs.module_lib", ], }, would cause "hiddenapi list" to fail because it would have been passed paths to two dex jars (actually the same dex jar but that does not matter) each of which defined the same class, e.g. java.lang.Object. This change treats the "art.module.public.api.stubs.module_lib" and "art.module.public.api" modules as being the same for the purposes of hidden API processing. (cherry picked from commit 3f0290ef7940c70a491dcbd4b57cabd8b2e753ef) Bug: 192446466 Test: m nothing Merged-In: I9de96337f64f26e24cff040d4bbed9eecc67b1ed Change-Id: I9e1cb82bea96022faaec98edc0c9ea7eac6204b0 --- java/bootclasspath_fragment_test.go | 2 +- java/hiddenapi_modular.go | 15 +++++++++++++++ java/sdk_library.go | 21 +++++++++++++++++++-- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/java/bootclasspath_fragment_test.go b/java/bootclasspath_fragment_test.go index b46988636..3d0e1558f 100644 --- a/java/bootclasspath_fragment_test.go +++ b/java/bootclasspath_fragment_test.go @@ -197,7 +197,7 @@ func TestBootclasspathFragment_StubLibs(t *testing.T) { ], }, core_platform_api: { - stub_libs: ["mycoreplatform"], + stub_libs: ["mycoreplatform.stubs"], }, } diff --git a/java/hiddenapi_modular.go b/java/hiddenapi_modular.go index 0895951ab..af124842c 100644 --- a/java/hiddenapi_modular.go +++ b/java/hiddenapi_modular.go @@ -586,6 +586,13 @@ type StubDexJarsByModule map[string]ModuleStubDexJars // addStubDexJar adds a stub dex jar path provided by the specified module for the specified scope. func (s StubDexJarsByModule) addStubDexJar(ctx android.ModuleContext, module android.Module, scope *HiddenAPIScope, stubDexJar android.Path) { name := android.RemoveOptionalPrebuiltPrefix(module.Name()) + + // Each named module provides one dex jar for each scope. However, in some cases different API + // versions of a single classes are provided by separate modules. e.g. the core platform + // version of java.lang.Object is provided by the legacy.art.module.platform.api module but the + // public version is provided by the art.module.public.api module. In those cases it is necessary + // to treat all those modules as they were the same name, otherwise it will result in multiple + // definitions of a single class being passed to hidden API processing which will cause an error. if name == scope.nonUpdatablePrebuiltModule || name == scope.nonUpdatableSourceModule { // Treat all *android-non-updatable* modules as if they were part of an android-non-updatable // java_sdk_library. @@ -606,6 +613,14 @@ func (s StubDexJarsByModule) addStubDexJar(ctx android.ModuleContext, module and // conscrypt.module.public.api java_sdk_library which will be the case once the former has been // migrated to a module_lib API. name = "conscrypt.module.public.api" + } else if d, ok := module.(SdkLibraryComponentDependency); ok { + sdkLibraryName := d.SdkLibraryName() + if sdkLibraryName != nil { + // The module is a component of a java_sdk_library so use the name of the java_sdk_library. + // e.g. if this module is `foo.system.stubs` and is part of the `foo` java_sdk_library then + // use `foo` as the name. + name = *sdkLibraryName + } } stubDexJarsByScope := s[name] if stubDexJarsByScope == nil { diff --git a/java/sdk_library.go b/java/sdk_library.go index 7413640b4..d7f53ec04 100644 --- a/java/sdk_library.go +++ b/java/sdk_library.go @@ -675,10 +675,13 @@ func (c *commonToSdkLibraryAndImport) initCommonAfterDefaultsApplied(ctx android return false } + namePtr := proptools.StringPtr(c.module.BaseModuleName()) + c.sdkLibraryComponentProperties.SdkLibraryName = namePtr + // 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.module.BaseModuleName()) + c.sdkLibraryComponentProperties.SdkLibraryToImplicitlyTrack = namePtr } return true @@ -922,15 +925,19 @@ func (c *commonToSdkLibraryAndImport) SdkRemovedTxtFile(ctx android.BaseModuleCo func (c *commonToSdkLibraryAndImport) sdkComponentPropertiesForChildLibrary() interface{} { componentProps := &struct { + SdkLibraryName *string SdkLibraryToImplicitlyTrack *string }{} + namePtr := proptools.StringPtr(c.module.BaseModuleName()) + componentProps.SdkLibraryName = namePtr + 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. - componentProps.SdkLibraryToImplicitlyTrack = proptools.StringPtr(c.module.BaseModuleName()) + componentProps.SdkLibraryToImplicitlyTrack = namePtr } return componentProps @@ -949,6 +956,8 @@ func (c *commonToSdkLibraryAndImport) stubLibrariesCompiledForDex() bool { // 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 module. + SdkLibraryName *string `blueprint:"mutated"` // The name of the java_sdk_library/_import to add to a entry // in the AndroidManifest.xml of any Android app that includes code that references @@ -966,6 +975,11 @@ func (e *EmbeddableSdkLibraryComponent) initSdkLibraryComponent(module android.M module.AddProperties(&e.sdkLibraryComponentProperties) } +// to satisfy SdkLibraryComponentDependency +func (e *EmbeddableSdkLibraryComponent) SdkLibraryName() *string { + return e.sdkLibraryComponentProperties.SdkLibraryName +} + // to satisfy SdkLibraryComponentDependency func (e *EmbeddableSdkLibraryComponent) OptionalImplicitSdkLibrary() *string { return e.sdkLibraryComponentProperties.SdkLibraryToImplicitlyTrack @@ -982,6 +996,9 @@ func (e *EmbeddableSdkLibraryComponent) OptionalSdkLibraryImplementation() *stri type SdkLibraryComponentDependency interface { UsesLibraryDependency + // SdkLibraryName returns the name of the java_sdk_library/_import module. + SdkLibraryName() *string + // 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. //