Loading java/java_test.go +27 −0 Original line number Diff line number Diff line Loading @@ -1465,6 +1465,33 @@ func TestJavaSdkLibrary_FallbackScope(t *testing.T) { `) } func TestJavaSdkLibrary_DefaultToStubs(t *testing.T) { ctx, _ := testJava(t, ` java_sdk_library { name: "foo", srcs: ["a.java"], system: { enabled: true, }, default_to_stubs: true, } java_library { name: "baz", srcs: ["a.java"], libs: ["foo"], // does not have sdk_version set, should fallback to module, // which will then fallback to system because the module scope // is not enabled. } `) // The baz library should depend on the system stubs jar. bazLibrary := ctx.ModuleForTests("baz", "android_common").Rule("javac") if expected, actual := `^-classpath .*:/[^:]*/turbine-combined/foo\.stubs.system\.jar$`, bazLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) { t.Errorf("expected %q, found %#q", expected, actual) } } var compilerFlagsTestCases = []struct { in string out bool Loading java/sdk_library.go +19 −0 Original line number Diff line number Diff line Loading @@ -435,6 +435,14 @@ type sdkLibraryProperties struct { // disabled by default. Module_lib ApiScopeProperties // Determines if the stubs are preferred over the implementation library // for linking, even when the client doesn't specify sdk_version. When this // is set to true, such clients are provided with the widest API surface that // this lib provides. Note however that this option doesn't affect the clients // that are in the same APEX as this library. In that case, the clients are // always linked with the implementation library. Default is false. Default_to_stubs *bool // Properties related to api linting. Api_lint struct { // Enable api linting. Loading Loading @@ -1342,6 +1350,13 @@ func (module *SdkLibrary) withinSameApexAs(other android.Module) bool { } func (module *SdkLibrary) sdkJars(ctx android.BaseModuleContext, sdkVersion sdkSpec, headerJars bool) android.Paths { // If the client doesn't set sdk_version, but if this library prefers stubs over // the impl library, let's provide the widest API surface possible. To do so, // force override sdk_version to module_current so that the closest possible API // surface could be found in selectHeaderJarsForSdkVersion if module.defaultsToStubs() && !sdkVersion.specified() { sdkVersion = sdkSpecFrom("module_current") } // Only provide access to the implementation library if it is actually built. if module.requiresRuntimeImplementationLibrary() { Loading Loading @@ -1505,6 +1520,10 @@ func (module *SdkLibrary) requiresRuntimeImplementationLibrary() bool { return !proptools.Bool(module.sdkLibraryProperties.Api_only) } func (module *SdkLibrary) defaultsToStubs() bool { return proptools.Bool(module.sdkLibraryProperties.Default_to_stubs) } // Defines how to name the individual component modules the sdk library creates. type sdkLibraryComponentNamingScheme interface { stubsLibraryModuleName(scope *apiScope, baseName string) string Loading Loading
java/java_test.go +27 −0 Original line number Diff line number Diff line Loading @@ -1465,6 +1465,33 @@ func TestJavaSdkLibrary_FallbackScope(t *testing.T) { `) } func TestJavaSdkLibrary_DefaultToStubs(t *testing.T) { ctx, _ := testJava(t, ` java_sdk_library { name: "foo", srcs: ["a.java"], system: { enabled: true, }, default_to_stubs: true, } java_library { name: "baz", srcs: ["a.java"], libs: ["foo"], // does not have sdk_version set, should fallback to module, // which will then fallback to system because the module scope // is not enabled. } `) // The baz library should depend on the system stubs jar. bazLibrary := ctx.ModuleForTests("baz", "android_common").Rule("javac") if expected, actual := `^-classpath .*:/[^:]*/turbine-combined/foo\.stubs.system\.jar$`, bazLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) { t.Errorf("expected %q, found %#q", expected, actual) } } var compilerFlagsTestCases = []struct { in string out bool Loading
java/sdk_library.go +19 −0 Original line number Diff line number Diff line Loading @@ -435,6 +435,14 @@ type sdkLibraryProperties struct { // disabled by default. Module_lib ApiScopeProperties // Determines if the stubs are preferred over the implementation library // for linking, even when the client doesn't specify sdk_version. When this // is set to true, such clients are provided with the widest API surface that // this lib provides. Note however that this option doesn't affect the clients // that are in the same APEX as this library. In that case, the clients are // always linked with the implementation library. Default is false. Default_to_stubs *bool // Properties related to api linting. Api_lint struct { // Enable api linting. Loading Loading @@ -1342,6 +1350,13 @@ func (module *SdkLibrary) withinSameApexAs(other android.Module) bool { } func (module *SdkLibrary) sdkJars(ctx android.BaseModuleContext, sdkVersion sdkSpec, headerJars bool) android.Paths { // If the client doesn't set sdk_version, but if this library prefers stubs over // the impl library, let's provide the widest API surface possible. To do so, // force override sdk_version to module_current so that the closest possible API // surface could be found in selectHeaderJarsForSdkVersion if module.defaultsToStubs() && !sdkVersion.specified() { sdkVersion = sdkSpecFrom("module_current") } // Only provide access to the implementation library if it is actually built. if module.requiresRuntimeImplementationLibrary() { Loading Loading @@ -1505,6 +1520,10 @@ func (module *SdkLibrary) requiresRuntimeImplementationLibrary() bool { return !proptools.Bool(module.sdkLibraryProperties.Api_only) } func (module *SdkLibrary) defaultsToStubs() bool { return proptools.Bool(module.sdkLibraryProperties.Default_to_stubs) } // Defines how to name the individual component modules the sdk library creates. type sdkLibraryComponentNamingScheme interface { stubsLibraryModuleName(scope *apiScope, baseName string) string Loading