From 34827d4c0ec854bee766ec3db2be6e66b34ebb28 Mon Sep 17 00:00:00 2001 From: Paul Duffin Date: Thu, 13 May 2021 21:25:05 +0100 Subject: [PATCH] Use java_sdk_library in bootclasspath_fragment contents as stubs A java_sdk_library specified in the bootclasspath_fragment contents must be providing APIs for the bootclasspath_fragment and so must be treated as if they were specified in the stub_libs. This avoids having to specify them in both contents and stub_libs. Bug: 179354495 Test: m nothing Change-Id: I535065ee1a79b439e2676f35e06a75d4626adcaf --- java/bootclasspath_fragment.go | 5 ++++- java/bootclasspath_fragment_test.go | 32 +++++++++++++++++++++-------- java/hiddenapi_modular.go | 21 ++++++++++++++++++- java/platform_bootclasspath.go | 2 +- 4 files changed, 48 insertions(+), 12 deletions(-) diff --git a/java/bootclasspath_fragment.go b/java/bootclasspath_fragment.go index ec61e7094..6d7ab4ae1 100644 --- a/java/bootclasspath_fragment.go +++ b/java/bootclasspath_fragment.go @@ -91,6 +91,9 @@ func IsBootclasspathFragmentContentDepTag(tag blueprint.DependencyTag) bool { type BootclasspathFragmentCoverageAffectedProperties struct { // The contents of this bootclasspath_fragment, could be either java_library, or java_sdk_library. // + // A java_sdk_library specified here will also be treated as if it was specified on the stub_libs + // property. + // // The order of this list matters as it is the order that is used in the bootclasspath. Contents []string @@ -453,7 +456,7 @@ func (b *BootclasspathFragmentModule) getImageConfig(ctx android.EarlyModuleCont func (b *BootclasspathFragmentModule) generateHiddenAPIBuildActions(ctx android.ModuleContext, contents []android.Module) { // Convert the kind specific lists of modules into kind specific lists of jars. - stubJarsByKind := hiddenAPIGatherStubLibDexJarPaths(ctx) + stubJarsByKind := hiddenAPIGatherStubLibDexJarPaths(ctx, contents) // Store the information for use by other modules. bootclasspathApiInfo := bootclasspathApiInfo{stubJarsByKind: stubJarsByKind} diff --git a/java/bootclasspath_fragment_test.go b/java/bootclasspath_fragment_test.go index a47e12748..db284c9ec 100644 --- a/java/bootclasspath_fragment_test.go +++ b/java/bootclasspath_fragment_test.go @@ -204,7 +204,7 @@ func TestBootclasspathFragment_StubLibs(t *testing.T) { result := android.GroupFixturePreparers( prepareForTestWithBootclasspathFragment, PrepareForTestWithJavaSdkLibraryFiles, - FixtureWithLastReleaseApis("mysdklibrary", "mycoreplatform"), + FixtureWithLastReleaseApis("mysdklibrary", "myothersdklibrary", "mycoreplatform"), ).RunTestWithBp(t, ` bootclasspath_fragment { name: "myfragment", @@ -212,7 +212,7 @@ func TestBootclasspathFragment_StubLibs(t *testing.T) { api: { stub_libs: [ "mystublib", - "mysdklibrary", + "myothersdklibrary", ], }, core_platform_api: { @@ -236,6 +236,13 @@ func TestBootclasspathFragment_StubLibs(t *testing.T) { system: {enabled: true}, } + java_sdk_library { + name: "myothersdklibrary", + srcs: ["a.java"], + shared_library: false, + public: {enabled: true}, + } + java_sdk_library { name: "mycoreplatform", srcs: ["a.java"], @@ -249,16 +256,23 @@ func TestBootclasspathFragment_StubLibs(t *testing.T) { stubsJar := "out/soong/.intermediates/mystublib/android_common/dex/mystublib.jar" - // Check that SdkPublic uses public stubs. + // Stubs jars for mysdklibrary publicStubsJar := "out/soong/.intermediates/mysdklibrary.stubs/android_common/dex/mysdklibrary.stubs.jar" - android.AssertPathsRelativeToTopEquals(t, "public dex stubs jar", []string{stubsJar, publicStubsJar}, info.stubJarsByKind[android.SdkPublic]) - - // Check that SdkSystem uses system stubs. systemStubsJar := "out/soong/.intermediates/mysdklibrary.stubs.system/android_common/dex/mysdklibrary.stubs.system.jar" - android.AssertPathsRelativeToTopEquals(t, "system dex stubs jar", []string{stubsJar, systemStubsJar}, info.stubJarsByKind[android.SdkSystem]) - // Check that SdkTest also uses system stubs as the mysdklibrary does not provide test stubs. - android.AssertPathsRelativeToTopEquals(t, "test dex stubs jar", []string{stubsJar, systemStubsJar}, info.stubJarsByKind[android.SdkTest]) + // Stubs jars for myothersdklibrary + otherPublicStubsJar := "out/soong/.intermediates/myothersdklibrary.stubs/android_common/dex/myothersdklibrary.stubs.jar" + + // Check that SdkPublic uses public stubs for all sdk libraries. + android.AssertPathsRelativeToTopEquals(t, "public dex stubs jar", []string{otherPublicStubsJar, publicStubsJar, stubsJar}, info.stubJarsByKind[android.SdkPublic]) + + // Check that SdkSystem uses system stubs for mysdklibrary and public stubs for myothersdklibrary + // as it does not provide system stubs. + android.AssertPathsRelativeToTopEquals(t, "system dex stubs jar", []string{otherPublicStubsJar, systemStubsJar, stubsJar}, info.stubJarsByKind[android.SdkSystem]) + + // Check that SdkTest also uses system stubs for mysdklibrary as it does not provide test stubs + // and public stubs for myothersdklibrary as it does not provide test stubs either. + android.AssertPathsRelativeToTopEquals(t, "test dex stubs jar", []string{otherPublicStubsJar, systemStubsJar, stubsJar}, info.stubJarsByKind[android.SdkTest]) // Check that SdkCorePlatform uses public stubs from the mycoreplatform library. corePlatformStubsJar := "out/soong/.intermediates/mycoreplatform.stubs/android_common/dex/mycoreplatform.stubs.jar" diff --git a/java/hiddenapi_modular.go b/java/hiddenapi_modular.go index d1d9a7541..186891556 100644 --- a/java/hiddenapi_modular.go +++ b/java/hiddenapi_modular.go @@ -123,8 +123,21 @@ func hiddenAPIAddStubLibDependencies(ctx android.BottomUpMutatorContext, sdkKind // hiddenAPIGatherStubLibDexJarPaths gathers the paths to the dex jars from the dependencies added // in hiddenAPIAddStubLibDependencies. -func hiddenAPIGatherStubLibDexJarPaths(ctx android.ModuleContext) map[android.SdkKind]android.Paths { +func hiddenAPIGatherStubLibDexJarPaths(ctx android.ModuleContext, contents []android.Module) map[android.SdkKind]android.Paths { m := map[android.SdkKind]android.Paths{} + + // If the contents includes any java_sdk_library modules then add them to the stubs. + for _, module := range contents { + if _, ok := module.(SdkLibraryDependency); ok { + for _, kind := range []android.SdkKind{android.SdkPublic, android.SdkSystem, android.SdkTest} { + dexJar := hiddenAPIRetrieveDexJarBuildPath(ctx, module, kind) + if dexJar != nil { + m[kind] = append(m[kind], dexJar) + } + } + } + } + ctx.VisitDirectDepsIf(isActiveModule, func(module android.Module) { tag := ctx.OtherModuleDependencyTag(module) if hiddenAPIStubsTag, ok := tag.(hiddenAPIStubsDependencyTag); ok { @@ -135,6 +148,12 @@ func hiddenAPIGatherStubLibDexJarPaths(ctx android.ModuleContext) map[android.Sd } } }) + + // Normalize the paths, i.e. remove duplicates and sort. + for k, v := range m { + m[k] = android.SortedUniquePaths(v) + } + return m } diff --git a/java/platform_bootclasspath.go b/java/platform_bootclasspath.go index b5fec95fe..5880e2f0a 100644 --- a/java/platform_bootclasspath.go +++ b/java/platform_bootclasspath.go @@ -377,7 +377,7 @@ func (b *platformBootclasspathModule) generateHiddenAPIStubFlagsRules(ctx androi bootDexJars = append(bootDexJars, module.bootDexJar) } - sdkKindToStubPaths := hiddenAPIGatherStubLibDexJarPaths(ctx) + sdkKindToStubPaths := hiddenAPIGatherStubLibDexJarPaths(ctx, nil) outputPath := hiddenAPISingletonPaths(ctx).stubFlags rule := ruleToGenerateHiddenAPIStubFlagsFile(ctx, outputPath, bootDexJars, sdkKindToStubPaths)