From 2e7ed65fc43c6b1a405e1a2e822e4d308cbe377a Mon Sep 17 00:00:00 2001 From: Paul Duffin Date: Tue, 26 May 2020 18:13:57 +0100 Subject: [PATCH] java_sdk_library: Only expose impl jars when they are built The implementation jars are not built if api_only: true. In that case the jar paths must not be exposed implicitly as they will be nil and they will just be ignored. This change ensures that stubs are returned when the implementation jars are not built. Bug: 155164730 Test: m droid Change-Id: Ic495982a5dcb2754916260e7d91d921a5da288ae (cherry picked from commit daaa332827b6730ec0af4fd359fbbb4daae714ad) --- java/java_test.go | 26 ++++++++++++++++++++++++++ java/sdk_library.go | 21 ++++++++++++--------- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/java/java_test.go b/java/java_test.go index 0ab541a3e..385fe6afd 100644 --- a/java/java_test.go +++ b/java/java_test.go @@ -19,6 +19,7 @@ import ( "os" "path/filepath" "reflect" + "regexp" "sort" "strconv" "strings" @@ -1261,6 +1262,31 @@ func TestJavaSdkLibrary(t *testing.T) { } } +func TestJavaSdkLibrary_DoNotAccessImplWhenItIsNotBuilt(t *testing.T) { + ctx, _ := testJava(t, ` + java_sdk_library { + name: "foo", + srcs: ["a.java"], + api_only: true, + public: { + enabled: true, + }, + } + + java_library { + name: "bar", + srcs: ["b.java"], + libs: ["foo"], + } + `) + + // The bar library should depend on the stubs jar. + barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac") + if expected, actual := `^-classpath .*:/[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) { + t.Errorf("expected %q, found %#q", expected, actual) + } +} + func TestJavaSdkLibrary_UseSourcesFromAnotherSdkLibrary(t *testing.T) { testJava(t, ` java_sdk_library { diff --git a/java/sdk_library.go b/java/sdk_library.go index 74dbde898..6503e8b30 100644 --- a/java/sdk_library.go +++ b/java/sdk_library.go @@ -1297,15 +1297,18 @@ func PrebuiltJars(ctx android.BaseModuleContext, baseName string, s sdkSpec) and func (module *SdkLibrary) sdkJars(ctx android.BaseModuleContext, sdkVersion sdkSpec, headerJars bool) android.Paths { - // Check any special cases for java_sdk_library. - // - // Only allow access to the implementation library in the following condition: - // * No sdk_version specified on the referencing module. - if sdkVersion.kind == sdkPrivate { - if headerJars { - return module.HeaderJars() - } else { - return module.ImplementationJars() + // Only provide access to the implementation library if it is actually built. + if module.requiresRuntimeImplementationLibrary() { + // Check any special cases for java_sdk_library. + // + // Only allow access to the implementation library in the following condition: + // * No sdk_version specified on the referencing module. + if sdkVersion.kind == sdkPrivate { + if headerJars { + return module.HeaderJars() + } else { + return module.ImplementationJars() + } } }