Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 86a60ae6 authored by Colin Cross's avatar Colin Cross
Browse files

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
parent 6c2e9736
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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) {
+2 −0
Original line number Diff line number Diff line
@@ -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.*"}

+3 −3
Original line number Diff line number Diff line
@@ -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) {
+11 −9
Original line number Diff line number Diff line
@@ -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)
		}
	}
+39 −7
Original line number Diff line number Diff line
@@ -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)