From 86a60ae6fad2b07498212a116022ce465e30167b Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Tue, 29 May 2018 14:44:55 -0700 Subject: [PATCH] Add core-lambda-stubs to classpath Add core-lambda-stubs to the bootclasspath for modules with no sdk_version or with sdk_version: "current", and to the classpath for modules that specify a specific sdk_version number. Use the prebuilt sdk-core-lambda-stubs when using a prebuilt SDK. Fixes compiling modules with lambdas against the SDK. This reapplies I5e700f2dd86f1a6b84b7a55dd9bfe21a448d3fb6 with fixes and tests for unbundled builds. Bug: 80428539 Test: java_test.go Change-Id: Ib7aaeebb93137270d7336a7293a08ed7064a3184 --- java/aar.go | 2 +- java/config/config.go | 2 ++ java/droiddoc.go | 6 +++--- java/java.go | 20 ++++++++++--------- java/java_test.go | 46 ++++++++++++++++++++++++++++++++++++------- 5 files changed, 56 insertions(+), 20 deletions(-) diff --git a/java/aar.go b/java/aar.go index 21e38a4ad..415170eb5 100644 --- a/java/aar.go +++ b/java/aar.go @@ -213,7 +213,7 @@ func aaptLibs(ctx android.ModuleContext, sdkVersion string) (transitiveStaticLib sdkDep := decodeSdkDep(ctx, sdkVersion) if sdkDep.useFiles { - sharedLibs = append(sharedLibs, sdkDep.jar) + sharedLibs = append(sharedLibs, sdkDep.jars...) } ctx.VisitDirectDeps(func(module android.Module) { diff --git a/java/config/config.go b/java/config/config.go index d44315c5c..ddcd1565e 100644 --- a/java/config/config.go +++ b/java/config/config.go @@ -30,6 +30,8 @@ var ( DefaultBootclasspathLibraries = []string{"core-oj", "core-libart"} DefaultSystemModules = "core-system-modules" DefaultLibraries = []string{"ext", "framework", "okhttp"} + DefaultLambdaStubsLibrary = "core-lambda-stubs" + SdkLambdaStubsPath = "prebuilts/sdk/tools/core-lambda-stubs.jar" DefaultJacocoExcludeFilter = []string{"org.junit.*", "org.jacoco.*", "org.mockito.*"} diff --git a/java/droiddoc.go b/java/droiddoc.go index cda50f04a..6c7626279 100644 --- a/java/droiddoc.go +++ b/java/droiddoc.go @@ -293,7 +293,7 @@ func (j *Javadoc) addDeps(ctx android.BottomUpMutatorContext) { ctx.AddDependency(ctx.Module(), libTag, []string{"ext", "framework"}...) } } else if sdkDep.useModule { - ctx.AddDependency(ctx.Module(), bootClasspathTag, sdkDep.module) + ctx.AddDependency(ctx.Module(), bootClasspathTag, sdkDep.modules...) } } @@ -377,9 +377,9 @@ func (j *Javadoc) collectDeps(ctx android.ModuleContext) deps { sdkDep := decodeSdkDep(ctx, String(j.properties.Sdk_version)) if sdkDep.invalidVersion { - ctx.AddMissingDependencies([]string{sdkDep.module}) + ctx.AddMissingDependencies(sdkDep.modules) } else if sdkDep.useFiles { - deps.bootClasspath = append(deps.bootClasspath, sdkDep.jar) + deps.bootClasspath = append(deps.bootClasspath, sdkDep.jars...) } ctx.VisitDirectDeps(func(module android.Module) { diff --git a/java/java.go b/java/java.go index 02fdc00fa..e5719135e 100644 --- a/java/java.go +++ b/java/java.go @@ -338,12 +338,12 @@ var ( type sdkDep struct { useModule, useFiles, useDefaultLibs, invalidVersion bool - module string + modules []string systemModules string frameworkResModule string - jar android.Path + jars android.Paths aidl android.Path } @@ -412,11 +412,12 @@ func decodeSdkDep(ctx android.BaseContext, v string) sdkDep { aidl := filepath.Join(public_dir, "framework.aidl") jarPath := android.ExistentPathForSource(ctx, jar) aidlPath := android.ExistentPathForSource(ctx, aidl) + lambdaStubsPath := android.PathForSource(ctx, config.SdkLambdaStubsPath) if (!jarPath.Valid() || !aidlPath.Valid()) && ctx.Config().AllowMissingDependencies() { return sdkDep{ invalidVersion: true, - module: fmt.Sprintf("sdk_%s_%s_android", api, v), + modules: []string{fmt.Sprintf("sdk_%s_%s_android", api, v)}, } } @@ -432,7 +433,7 @@ func decodeSdkDep(ctx android.BaseContext, v string) sdkDep { return sdkDep{ useFiles: true, - jar: jarPath.Path(), + jars: android.Paths{jarPath.Path(), lambdaStubsPath}, aidl: aidlPath.Path(), } } @@ -440,7 +441,7 @@ func decodeSdkDep(ctx android.BaseContext, v string) sdkDep { toModule := func(m, r string) sdkDep { ret := sdkDep{ useModule: true, - module: m, + modules: []string{m, config.DefaultLambdaStubsLibrary}, systemModules: m + "_system_modules", frameworkResModule: r, } @@ -489,7 +490,7 @@ func (j *Module) deps(ctx android.BottomUpMutatorContext) { if ctx.Config().TargetOpenJDK9() { ctx.AddDependency(ctx.Module(), systemModulesTag, sdkDep.systemModules) } - ctx.AddDependency(ctx.Module(), bootClasspathTag, sdkDep.module) + ctx.AddDependency(ctx.Module(), bootClasspathTag, sdkDep.modules...) if Bool(j.deviceProperties.Optimize.Enabled) { ctx.AddDependency(ctx.Module(), proguardRaiseTag, config.DefaultBootclasspathLibraries...) ctx.AddDependency(ctx.Module(), proguardRaiseTag, config.DefaultLibraries...) @@ -625,8 +626,9 @@ const ( func getLinkType(m *Module, name string) linkType { ver := String(m.deviceProperties.Sdk_version) + noStdLibs := Bool(m.properties.No_standard_libs) switch { - case name == "core.current.stubs" || ver == "core_current": + case name == "core.current.stubs" || ver == "core_current" || noStdLibs: return javaCore case name == "android_system_stubs_current" || strings.HasPrefix(ver, "system_"): return javaSystem @@ -684,10 +686,10 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps { if ctx.Device() { sdkDep := decodeSdkDep(ctx, String(j.deviceProperties.Sdk_version)) if sdkDep.invalidVersion { - ctx.AddMissingDependencies([]string{sdkDep.module}) + ctx.AddMissingDependencies(sdkDep.modules) } else if sdkDep.useFiles { // sdkDep.jar is actually equivalent to turbine header.jar. - deps.classpath = append(deps.classpath, sdkDep.jar) + deps.classpath = append(deps.classpath, sdkDep.jars...) deps.aidlIncludeDirs = append(deps.aidlIncludeDirs, sdkDep.aidl) } } diff --git a/java/java_test.go b/java/java_test.go index baf4b723b..16782967c 100644 --- a/java/java_test.go +++ b/java/java_test.go @@ -25,6 +25,8 @@ import ( "strconv" "strings" "testing" + + "github.com/google/blueprint/proptools" ) var buildDir string @@ -98,6 +100,7 @@ func testContext(config android.Config, bp string, extraModules := []string{ "core-oj", "core-libart", + "core-lambda-stubs", "framework", "ext", "okhttp", @@ -166,6 +169,7 @@ func testContext(config android.Config, bp string, "prebuilts/sdk/14/public/android.jar": nil, "prebuilts/sdk/14/public/framework.aidl": nil, "prebuilts/sdk/14/system/android.jar": nil, + "prebuilts/sdk/current/core/android.jar": nil, "prebuilts/sdk/current/public/android.jar": nil, "prebuilts/sdk/current/public/framework.aidl": nil, "prebuilts/sdk/current/public/core.jar": nil, @@ -183,6 +187,7 @@ func testContext(config android.Config, bp string, "prebuilts/sdk/28/public/api/bar-removed.txt": nil, "prebuilts/sdk/28/system/api/bar-removed.txt": nil, "prebuilts/sdk/28/test/api/bar-removed.txt": nil, + "prebuilts/sdk/tools/core-lambda-stubs.jar": nil, "prebuilts/sdk/Android.bp": []byte(`prebuilt_apis { name: "prebuilt_apis",}`), // For framework-res, which is an implicit dependency for framework @@ -338,6 +343,7 @@ func TestBinary(t *testing.T) { var classpathTestcases = []struct { name string + unbundled bool moduleType string host android.OsClass properties string @@ -364,20 +370,20 @@ var classpathTestcases = []struct { properties: `sdk_version: "14",`, bootclasspath: []string{`""`}, system: "bootclasspath", // special value to tell 1.9 test to expect bootclasspath - classpath: []string{"prebuilts/sdk/14/public/android.jar"}, + classpath: []string{"prebuilts/sdk/14/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"}, }, { name: "current", properties: `sdk_version: "current",`, - bootclasspath: []string{"android_stubs_current"}, + bootclasspath: []string{"android_stubs_current", "core-lambda-stubs"}, system: "bootclasspath", // special value to tell 1.9 test to expect bootclasspath }, { name: "system_current", properties: `sdk_version: "system_current",`, - bootclasspath: []string{"android_system_stubs_current"}, + bootclasspath: []string{"android_system_stubs_current", "core-lambda-stubs"}, system: "bootclasspath", // special value to tell 1.9 test to expect bootclasspath }, { @@ -386,20 +392,20 @@ var classpathTestcases = []struct { properties: `sdk_version: "system_14",`, bootclasspath: []string{`""`}, system: "bootclasspath", // special value to tell 1.9 test to expect bootclasspath - classpath: []string{"prebuilts/sdk/14/system/android.jar"}, + classpath: []string{"prebuilts/sdk/14/system/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"}, }, { name: "test_current", properties: `sdk_version: "test_current",`, - bootclasspath: []string{"android_test_stubs_current"}, + bootclasspath: []string{"android_test_stubs_current", "core-lambda-stubs"}, system: "bootclasspath", // special value to tell 1.9 test to expect bootclasspath }, { name: "core_current", properties: `sdk_version: "core_current",`, - bootclasspath: []string{"core.current.stubs"}, + bootclasspath: []string{"core.current.stubs", "core-lambda-stubs"}, system: "bootclasspath", // special value to tell 1.9 test to expect bootclasspath }, { @@ -448,6 +454,24 @@ var classpathTestcases = []struct { properties: `host_supported: true, no_standard_libs: true, system_modules: "none"`, classpath: []string{}, }, + { + + name: "unbundled sdk v14", + unbundled: true, + properties: `sdk_version: "14",`, + bootclasspath: []string{`""`}, + system: "bootclasspath", // special value to tell 1.9 test to expect bootclasspath + classpath: []string{"prebuilts/sdk/14/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"}, + }, + { + + name: "unbundled current", + unbundled: true, + properties: `sdk_version: "current",`, + bootclasspath: []string{`""`}, + system: "bootclasspath", // special value to tell 1.9 test to expect bootclasspath + classpath: []string{"prebuilts/sdk/current/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"}, + }, } func TestClasspath(t *testing.T) { @@ -498,7 +522,12 @@ func TestClasspath(t *testing.T) { t.Run("1.8", func(t *testing.T) { // Test default javac 1.8 - ctx := testJava(t, bp) + config := testConfig(nil) + if testcase.unbundled { + config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true) + } + ctx := testContext(config, bp, nil) + run(t, ctx, config) javac := ctx.ModuleForTests("foo", variant).Rule("javac") @@ -526,6 +555,9 @@ func TestClasspath(t *testing.T) { // Test again with javac 1.9 t.Run("1.9", func(t *testing.T) { config := testConfig(map[string]string{"EXPERIMENTAL_USE_OPENJDK9": "true"}) + if testcase.unbundled { + config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true) + } ctx := testContext(config, bp, nil) run(t, ctx, config)