aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Willemsen <dwillemsen@google.com>2016-07-08 21:33:05 -0700
committerDan Willemsen <dwillemsen@google.com>2016-07-09 04:42:15 +0000
commit62dfb591b172a3f6dabd6809ecd97a672c9a57a2 (patch)
treef82e0cf5ac0d8d714423024193990ab5a1b33131
parentc78147c650bf34b275ebd03eadc538760b90603f (diff)
downloadbuild-62dfb591b172a3f6dabd6809ecd97a672c9a57a2.tar.gz
Extend SDK link check to java libraries
Java code using the SDK should not link to java code built with the platform APIs or the system SDK. Java code using the system SDK should not link to the platform APIs either, but it can link to java code using another SDK. Change-Id: Iaae0a7e01993cfa1e023649fbd8a7974b5eca709
-rw-r--r--core/java_common.mk39
-rw-r--r--core/prebuilt_internal.mk14
2 files changed, 53 insertions, 0 deletions
diff --git a/core/java_common.mk b/core/java_common.mk
index 1b12ea23b1..5eac1f2299 100644
--- a/core/java_common.mk
+++ b/core/java_common.mk
@@ -369,3 +369,42 @@ $(LOCAL_INTERMEDIATE_TARGETS) : PRIVATE_JACK_SHARED_LIBRARIES:= $(full_shared_ja
$(LOCAL_INTERMEDIATE_TARGETS) : PRIVATE_JARJAR_RULES := $(LOCAL_JARJAR_RULES)
endif # need_compile_java
+
+
+###########################################################
+# Verify that all libraries are safe to use
+###########################################################
+ifndef LOCAL_IS_HOST_MODULE
+my_link_type := $(intermediates.COMMON)/link_type
+my_link_type_deps := $(strip \
+ $(foreach lib,$(LOCAL_STATIC_JAVA_LIBRARIES),\
+ $(call intermediates-dir-for, \
+ JAVA_LIBRARIES,$(lib),,COMMON)/link_type) \
+ $(foreach lib,$(apk_libraries), \
+ $(call intermediates-dir-for, \
+ APPS,$(lib),,COMMON)/link_type))
+ifeq ($(LOCAL_SDK_VERSION),system_current)
+$(my_link_type): PRIVATE_LINK_TYPE := system
+$(my_link_type): PRIVATE_ALLOWED_TYPES := (sdk|system)
+else ifneq ($(LOCAL_SDK_VERSION),)
+$(my_link_type): PRIVATE_LINK_TYPE := sdk
+$(my_link_type): PRIVATE_ALLOWED_TYPES := sdk
+else
+$(my_link_type): PRIVATE_LINK_TYPE := platform
+$(my_link_type): PRIVATE_ALLOWED_TYPES := (sdk|system|platform)
+endif
+$(my_link_type): PRIVATE_DEPS := $(my_link_type_deps)
+$(my_link_type): PRIVATE_MODULE := $(LOCAL_MODULE)
+$(my_link_type): PRIVATE_MAKEFILE := $(LOCAL_MODULE_MAKEFILE)
+$(my_link_type): $(my_link_type_deps)
+ @echo Check Java library module types: $@
+ $(hide) mkdir -p $(dir $@)
+ $(hide) rm -f $@
+ $(hide) for f in $(PRIVATE_DEPS); do \
+ grep -qE '^$(PRIVATE_ALLOWED_TYPES)$$' $$f || \
+ $(call echo-warning,"$(PRIVATE_MAKEFILE): $(PRIVATE_MODULE) ($(PRIVATE_LINK_TYPE)) should not link to $$(basename $${f%_intermediates/link_type}) ($$(cat $$f))"); \
+ done
+ $(hide) echo $(PRIVATE_LINK_TYPE) >$@
+
+$(LOCAL_BUILT_MODULE): $(my_link_type)
+endif # !LOCAL_IS_HOST_MODULE
diff --git a/core/prebuilt_internal.mk b/core/prebuilt_internal.mk
index efdfe1942a..7b4f7fb213 100644
--- a/core/prebuilt_internal.mk
+++ b/core/prebuilt_internal.mk
@@ -368,6 +368,20 @@ common_javalib_jar := $(intermediates.COMMON)/javalib.jar
$(common_classes_jar) $(common_javalib_jar): PRIVATE_MODULE := $(LOCAL_MODULE)
+my_link_type := $(intermediates.COMMON)/link_type
+ifeq ($(LOCAL_SDK_VERSION),system_current)
+$(my_link_type): PRIVATE_LINK_TYPE := system
+else ifneq ($(LOCAL_SDK_VERSION),)
+$(my_link_type): PRIVATE_LINK_TYPE := sdk
+else
+$(my_link_type): PRIVATE_LINK_TYPE := platform
+endif
+$(my_link_type):
+ @echo Check module type: $@
+ $(hide) mkdir -p $(dir $@) && rm -f $@
+ $(hide) echo $(PRIVATE_LINK_TYPE) >$@
+$(LOCAL_BUILT_MODULE): $(my_link_type)
+
ifeq ($(prebuilt_module_is_dex_javalib),true)
# For prebuilt shared Java library we don't have classes.jar.
$(common_javalib_jar) : $(my_src_jar) | $(ACP)