summaryrefslogtreecommitdiff
path: root/java/java.go
diff options
context:
space:
mode:
authorJiyong Park <jiyong@google.com>2018-03-05 17:44:10 +0900
committerColin Cross <ccross@android.com>2018-03-28 16:20:15 -0700
commit2d4929464bb33cb4cba8457b832259b0b4e2f87c (patch)
tree86d17c4f87d91aa123a13bd9c9c4ff1c15d4b686 /java/java.go
parent1218a19f0d2217500a1efa5fffde7465df2e4419 (diff)
Link type check for Android.bp defined Java modules
Link-type is also checked among Java modules defined in Soong. Until now, the check has been done in between Soong/Make and Make/Make. With this, a Java module can't depend on another Java module built with larger API surface. For example, a java library built with Android SDK (sdk_version: "current") can't link to a library built without SDK. Bug: 73829976 Test: m -j Change-Id: I64277be6e65e8535aad951b4f08f8d10b67abe66 Merged-In: I64277be6e65e8535aad951b4f08f8d10b67abe66 (cherry picked from commit f3586661e8525125f529082fee14edec32d73e04)
Diffstat (limited to 'java/java.go')
-rw-r--r--java/java.go50
1 files changed, 47 insertions, 3 deletions
diff --git a/java/java.go b/java/java.go
index 06dce052a..578568191 100644
--- a/java/java.go
+++ b/java/java.go
@@ -591,12 +591,56 @@ func checkProducesJars(ctx android.ModuleContext, dep android.SourceFileProducer
}
}
+type linkType int
+
+const (
+ javaCore linkType = iota
+ javaSdk
+ javaSystem
+ javaPlatform
+)
+
+func getLinkType(m *Module) linkType {
+ ver := String(m.deviceProperties.Sdk_version)
+ if strings.HasPrefix(ver, "core_") {
+ return javaCore
+ } else if strings.HasPrefix(ver, "system_") {
+ return javaSystem
+ } else if _, err := strconv.Atoi(ver); err == nil || ver == "current" {
+ return javaSdk
+ } else {
+ // test_current falls back here as well
+ return javaPlatform
+ }
+}
+
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",
+ myLinkType := getLinkType(from)
+ otherLinkType := getLinkType(&to.Module)
+ commonMessage := "Adjust sdk_version: property of the source or target module so that target module is built with the same or smaller API set than the source."
+
+ switch myLinkType {
+ case javaCore:
+ if otherLinkType != javaCore {
+ ctx.ModuleErrorf("compiles against core Java API, but dependency %q is compiling against non-core Java APIs."+commonMessage,
+ ctx.OtherModuleName(to))
+ }
+ break
+ case javaSdk:
+ if otherLinkType != javaCore && otherLinkType != javaSdk {
+ ctx.ModuleErrorf("compiles against Android API, but dependency %q is compiling against non-public Android API."+commonMessage,
+ ctx.OtherModuleName(to))
+ }
+ break
+ case javaSystem:
+ if otherLinkType == javaPlatform {
+ ctx.ModuleErrorf("compiles against system API, but dependency %q is compiling against private API."+commonMessage,
ctx.OtherModuleName(to))
}
+ break
+ case javaPlatform:
+ // no restriction on link-type
+ break
}
}