From 750e557011f9bc240276f8bca7d1caca800a7953 Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Wed, 31 Jan 2018 00:20:13 +0900 Subject: [PATCH] Support sdk_version: "core_current" core_current is a pseudo SDK version which is a core Java API subset of the Android API. It is expected to be mainly used for external Java projects which are agnostic to Android; such as junit, guava, etc. A module built with this SDK version can only link to java modules of the same kind. It can't depend on modules built with other sdk (e.g. current) or without sdk. Bug: 72206056 Test: m -j Change-Id: I778e7b4fcb9456a12b418ffd633ea78e29951e84 --- java/java.go | 23 +++++++++++++++++++++-- java/java_test.go | 9 +++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/java/java.go b/java/java.go index b2fbc429ab..8312ecc6cc 100644 --- a/java/java.go +++ b/java/java.go @@ -315,7 +315,7 @@ type sdkDep struct { func sdkStringToNumber(ctx android.BaseContext, v string) int { switch v { - case "", "current", "system_current", "test_current": + case "", "current", "system_current", "test_current", "core_current": return android.FutureApiLevel default: if i, err := strconv.Atoi(android.GetNumericSdkVersion(v)); err != nil { @@ -361,8 +361,15 @@ func decodeSdkDep(ctx android.BaseContext, v string) sdkDep { } toFile := func(v string) sdkDep { + isCore := strings.HasPrefix(v, "core_") + if isCore { + v = strings.TrimPrefix(v, "core_") + } dir := filepath.Join("prebuilts/sdk", v) jar := filepath.Join(dir, "android.jar") + if isCore { + jar = filepath.Join(dir, "core.jar") + } aidl := filepath.Join(dir, "framework.aidl") jarPath := android.ExistentPathForSource(ctx, "sdkdir", jar) aidlPath := android.ExistentPathForSource(ctx, "sdkdir", aidl) @@ -557,6 +564,15 @@ func checkProducesJars(ctx android.ModuleContext, dep android.SourceFileProducer } } +func checkLinkType(ctx android.ModuleContext, from *Module, to *Library, tag dependencyTag) { + if strings.HasPrefix(String(from.deviceProperties.Sdk_version), "core_") { + if !strings.HasPrefix(String(to.deviceProperties.Sdk_version), "core_") { + ctx.ModuleErrorf("depends on other library %q using non-core Java APIs", + ctx.OtherModuleName(to)) + } + } +} + func (j *Module) collectDeps(ctx android.ModuleContext) deps { var deps deps @@ -573,6 +589,9 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps { otherName := ctx.OtherModuleName(module) tag := ctx.OtherModuleDependencyTag(module) + if to, ok := module.(*Library); ok { + checkLinkType(ctx, j, to, tag.(dependencyTag)) + } switch dep := module.(type) { case Dependency: switch tag { @@ -989,7 +1008,7 @@ func (j *Module) instrument(ctx android.ModuleContext, flags javaBuilderFlags, // modules targeting an unreleased SDK (meaning it does not yet have a number) it returns "10000". func (j *Module) minSdkVersionNumber(ctx android.ModuleContext) string { switch String(j.deviceProperties.Sdk_version) { - case "", "current", "test_current", "system_current": + case "", "current", "test_current", "system_current", "core_current": return strconv.Itoa(ctx.Config().DefaultAppTargetSdkInt()) default: return android.GetNumericSdkVersion(String(j.deviceProperties.Sdk_version)) diff --git a/java/java_test.go b/java/java_test.go index db0b7a7325..60d9a40826 100644 --- a/java/java_test.go +++ b/java/java_test.go @@ -146,6 +146,7 @@ func testContext(config android.Config, bp string, "prebuilts/sdk/14/framework.aidl": nil, "prebuilts/sdk/current/android.jar": nil, "prebuilts/sdk/current/framework.aidl": nil, + "prebuilts/sdk/current/core.jar": nil, "prebuilts/sdk/system_current/android.jar": nil, "prebuilts/sdk/system_current/framework.aidl": nil, "prebuilts/sdk/system_14/android.jar": nil, @@ -360,6 +361,14 @@ var classpathTestcases = []struct { system: "bootclasspath", // special value to tell 1.9 test to expect bootclasspath classpath: []string{"prebuilts/sdk/test_current/android.jar"}, }, + { + + name: "core_current", + properties: `sdk_version: "core_current",`, + bootclasspath: []string{`""`}, + system: "bootclasspath", // special value to tell 1.9 test to expect bootclasspath + classpath: []string{"prebuilts/sdk/current/core.jar"}, + }, { name: "nostdlib",