From 1cf8ee619b89070b92905c7110c627b717338106 Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Tue, 22 May 2018 15:39:59 +0900 Subject: [PATCH] Export SDK library names A java module exports SDK library names that it is using directly or indirectly via its dependencies. Manifest fixer uses the SDK lib names to automatically add tags for the apk. The SDK library names are exported via exported-sdk-libs file in make. From Soong, they are exported via LOCAL_EXPORT_SDK_LIBRARIES flag. Bug: 77575606 Test: m -j Change-Id: I4e7a9bdc5bf845af85168abf55f8063900bacc72 --- core/android_manifest.mk | 11 +++++++---- core/clear_vars.mk | 1 + core/definitions.mk | 19 +++++++++++++++++++ core/java_common.mk | 26 ++++++++++++++++++++++++++ core/prebuilt_internal.mk | 9 +++++++++ core/soong_java_prebuilt.mk | 10 ++++++++++ 6 files changed, 72 insertions(+), 4 deletions(-) diff --git a/core/android_manifest.mk b/core/android_manifest.mk index e52bb2c54..0215106f1 100644 --- a/core/android_manifest.mk +++ b/core/android_manifest.mk @@ -43,24 +43,27 @@ else endif # Set up rules to merge library manifest files +my_exported_sdk_libs_file := $(call local-intermediates-dir,COMMON)/exported-sdk-libs +$(full_android_manifest): PRIVATE_EXPORTED_SDK_LIBS_FILE := $(my_exported_sdk_libs_file) +$(full_android_manifest): $(my_exported_sdk_libs_file) +$(full_android_manifest): $(MANIFEST_FIXER) + ifneq (,$(strip $(my_full_libs_manifest_files))) $(full_android_manifest): PRIVATE_LIBS_MANIFESTS := $(my_full_libs_manifest_files) $(full_android_manifest): $(ANDROID_MANIFEST_MERGER_CLASSPATH) -$(full_android_manifest): $(MANIFEST_FIXER) $(full_android_manifest) : $(main_android_manifest) $(my_full_libs_manifest_files) @echo "Merge android manifest files: $@ <-- $< $(PRIVATE_LIBS_MANIFESTS)" @mkdir -p $(dir $@) - $(MANIFEST_FIXER) $< $@.tmp --minSdkVersion $(PRIVATE_MIN_SDK_VERSION) + $(call fix-manifest,$<,$@.tmp,$(PRIVATE_MIN_SDK_VERSION),$(PRIVATE_EXPORTED_SDK_LIBS_FILE)) $(hide) $(ANDROID_MANIFEST_MERGER) --main $@.tmp \ --libs $(call normalize-path-list,$(PRIVATE_LIBS_MANIFESTS)) \ --out $@ rm $@.tmp else -$(full_android_manifest): $(MANIFEST_FIXER) $(full_android_manifest): $(main_android_manifest) @echo "Fix manifest: $@" - $(MANIFEST_FIXER) $< $@ --minSdkVersion $(PRIVATE_MIN_SDK_VERSION) + $(call fix-manifest,$<,$@,$(PRIVATE_MIN_SDK_VERSION),$(PRIVATE_EXPORTED_SDK_LIBS_FILE)) endif diff --git a/core/clear_vars.mk b/core/clear_vars.mk index 8cc7c98c6..5051ef701 100644 --- a/core/clear_vars.mk +++ b/core/clear_vars.mk @@ -84,6 +84,7 @@ LOCAL_EXPORT_C_INCLUDE_DIRS:= LOCAL_EXPORT_HEADER_LIBRARY_HEADERS:= LOCAL_EXPORT_PACKAGE_RESOURCES:= LOCAL_EXPORT_PROGUARD_FLAG_FILES:= +LOCAL_EXPORT_SDK_LIBRARIES:= LOCAL_EXPORT_SHARED_LIBRARY_HEADERS:= LOCAL_EXPORT_STATIC_LIBRARY_HEADERS:= LOCAL_EXTRACT_APK:= diff --git a/core/definitions.mk b/core/definitions.mk index 9c7f8b648..a8d7b2d3e 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -731,6 +731,25 @@ $(call app-lib-files,$(1)) endef endif +# Get the exported-sdk-libs files which collectively give you the list of exported java sdk +# lib names that are (transitively) exported from the given set of java libs +# $(1): library name list +define exported-sdk-libs-files +$(foreach lib,$(1),$(call intermediates-dir-for,JAVA_LIBRARIES,$(lib),,COMMON)/exported-sdk-libs) +endef + +# Fix manifest +# $(1): input manifest path +# $(2): output manifest path +# $(3): min sdk version +# $(4): (optional) exported-sdk-libs file +define fix-manifest +$(MANIFEST_FIXER) \ +--minSdkVersion $(3) \ +$(if $(4),$$(cat $(4) | sort -u | sed -e 's/^/\ --uses-library\ /' | tr '\n' ' ')) \ +$(1) $(2) +endef + ########################################################### ## Returns true if $(1) and $(2) are equal. Returns ## the empty string if they are not equal. diff --git a/core/java_common.mk b/core/java_common.mk index f4696d74a..5dfbc5f3a 100644 --- a/core/java_common.mk +++ b/core/java_common.mk @@ -237,6 +237,8 @@ endif full_java_bootclasspath_libs := empty_bootclasspath := my_system_modules := +exported_sdk_libs_files := +my_exported_sdk_libs_file := ifndef LOCAL_IS_HOST_MODULE sdk_libs := @@ -326,6 +328,14 @@ ifndef LOCAL_IS_HOST_MODULE full_shared_java_libs := $(call java-lib-files,$(LOCAL_JAVA_LIBRARIES) $(sdk_libs),$(LOCAL_IS_HOST_MODULE)) full_shared_java_header_libs := $(call java-lib-header-files,$(LOCAL_JAVA_LIBRARIES) $(sdk_libs),$(LOCAL_IS_HOST_MODULE)) sdk_libs := + + # Files that contains the names of SDK libraries exported from dependencies. These will be re-exported. + # Note: No need to consider LOCAL_*_ANDROID_LIBRARIES and LOCAL_STATIC_JAVA_AAR_LIBRARIES. They are all appended to + # LOCAL_*_JAVA_LIBRARIES in java.mk + exported_sdk_libs_files := $(call exported-sdk-libs-files,$(LOCAL_JAVA_LIBRARIES) $(LOCAL_STATIC_JAVA_LIBRARIES)) + # The file that contains the names of all SDK libraries that this module exports and re-exports + my_exported_sdk_libs_file := $(call local-intermediates-dir,COMMON)/exported-sdk-libs + else # LOCAL_IS_HOST_MODULE ifeq ($(USE_CORE_LIB_BOOTCLASSPATH),true) @@ -362,6 +372,22 @@ else # LOCAL_IS_HOST_MODULE endif # USE_CORE_LIB_BOOTCLASSPATH endif # !LOCAL_IS_HOST_MODULE + +# Export the SDK libs. The sdk library names listed in LOCAL_SDK_LIBRARIES are first exported. +# Then sdk library names exported from dependencies are all re-exported. +$(my_exported_sdk_libs_file): PRIVATE_EXPORTED_SDK_LIBS_FILES := $(exported_sdk_libs_files) +$(my_exported_sdk_libs_file): PRIVATE_SDK_LIBS := $(sort $(LOCAL_SDK_LIBRARIES)) +$(my_exported_sdk_libs_file): $(exported_sdk_libs_files) + @echo "Export SDK libs $@" + $(hide) mkdir -p $(dir $@) && rm -f $@ $@.temp + $(if $(PRIVATE_SDK_LIBS),\ + echo $(PRIVATE_SDK_LIBS) | tr ' ' '\n' > $@.temp,\ + touch $@.temp) + $(if $(PRIVATE_EXPORTED_SDK_LIBS_FILES),\ + cat $(PRIVATE_EXPORTED_SDK_LIBS_FILES) >> $@.temp) + $(hide) cat $@.temp | sort -u > $@ + $(hide) rm -f $@.temp + ifdef empty_bootclasspath ifdef full_java_bootclasspath_libs $(call pretty-error,internal error: empty_bootclasspath and full_java_bootclasspath_libs should not both be set) diff --git a/core/prebuilt_internal.mk b/core/prebuilt_internal.mk index 2f8865b8d..eab34cd72 100644 --- a/core/prebuilt_internal.mk +++ b/core/prebuilt_internal.mk @@ -674,6 +674,15 @@ endif # LOCAL_USE_AAPT2 # make sure the classes.jar and javalib.jar are built before $(LOCAL_BUILT_MODULE) $(built_module) : $(common_javalib_jar) +my_exported_sdk_libs_file := $(intermediates.COMMON)/exported-sdk-libs +$(my_exported_sdk_libs_file): PRIVATE_EXPORTED_SDK_LIBS := $(LOCAL_EXPORT_SDK_LIBRARIES) +$(my_exported_sdk_libs_file): + @echo "Export SDK libs $@" + $(hide) mkdir -p $(dir $@) && rm -f $@ + $(if $(PRIATE_EXPORTED_SDK_LIBS),\ + $(hide) echo $(PRIVATE_EXPORTED_SDK_LIBS) | tr ' ' '\n' > $@,\ + $(hide) touch $@) + endif # ! prebuilt_module_is_dex_javalib endif # LOCAL_IS_HOST_MODULE is not set diff --git a/core/soong_java_prebuilt.mk b/core/soong_java_prebuilt.mk index 58735cd05..eeaab315a 100644 --- a/core/soong_java_prebuilt.mk +++ b/core/soong_java_prebuilt.mk @@ -144,3 +144,13 @@ my_2nd_arch_prefix := $(LOCAL_2ND_ARCH_VAR_PREFIX) my_common := COMMON include $(BUILD_SYSTEM)/link_type.mk endif # !LOCAL_IS_HOST_MODULE + +# LOCAL_EXPORT_SDK_LIBRARIES set by soong is written to exported-sdk-libs file +my_exported_sdk_libs_file := $(intermediates.COMMON)/exported-sdk-libs +$(my_exported_sdk_libs_file): PRIVATE_EXPORTED_SDK_LIBS := $(LOCAL_EXPORT_SDK_LIBRARIES) +$(my_exported_sdk_libs_file): + @echo "Export SDK libs $@" + $(hide) mkdir -p $(dir $@) && rm -f $@ + $(if $(PRIVATE_EXPORTED_SDK_LIBS),\ + $(hide) echo $(PRIVATE_EXPORTED_SDK_LIBS) | tr ' ' '\n' > $@,\ + $(hide) touch $@)