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
This commit is contained in:
Jiyong Park 2018-01-31 00:20:13 +09:00
parent 97754359cc
commit 750e557011
2 changed files with 30 additions and 2 deletions

View File

@ -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))

View File

@ -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",