diff --git a/java/java.go b/java/java.go index b2fbc429a..8312ecc6c 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 db0b7a732..60d9a4082 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",