From f6d68cf6fe4918880704dc3e0ebdeefa0f655162 Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Thu, 8 Mar 2018 16:49:16 -0800 Subject: [PATCH] Use a srcjar for aapt and aapt2 output Dumping files in the *_intermediates/src causes incremental build problems, because we don't know when to delete them if they are no longer generated. Switch to outputting a srcjar instead, and pass it in to the turbine and javac compiles. Bug: 73885582 Test: m checkbuild Change-Id: Ibef28507522339d930c09426d0c98372eb864cb6 Merged-In: Ibef28507522339d930c09426d0c98372eb864cb6 (cherry picked from commit 2d1cddd5674d88c07350a52fa656cc441be04418) --- CleanSpec.mk | 5 +++++ core/aapt2.mk | 11 ++++++++--- core/definitions.mk | 21 +++++++++++++-------- core/package_internal.mk | 9 +++++++-- core/static_java_library.mk | 17 ++++++++++------- 5 files changed, 43 insertions(+), 20 deletions(-) diff --git a/CleanSpec.mk b/CleanSpec.mk index 079aa05e7..de3944142 100644 --- a/CleanSpec.mk +++ b/CleanSpec.mk @@ -465,6 +465,11 @@ $(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/compatibility_matrix.xml) # Remove obsolete intermedates src files $(call add-clean-step, rm -rf $(TARGET_OUT_COMMON_INTERMEDIATES)/*/*_intermediates/src/RenderScript.stamp*) +$(call add-clean-step, rm -rf $(TARGET_OUT_COMMON_INTERMEDIATES)/APPS/*_intermediates/src) +$(call add-clean-step, rm -rf $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/*_intermediates/src) +$(call add-clean-step, rm -rf $(TARGET_OUT_COMMON_INTERMEDIATES)/APPS/*_intermediates/java-source-list) +$(call add-clean-step, rm -rf $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/*_intermediates/java-source-list) +$(call add-clean-step, rm -rf $(OUT_DOCS)/*-timestamp) # ************************************************ # NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST diff --git a/core/aapt2.mk b/core/aapt2.mk index 7d9d8ceb8..109bb392d 100644 --- a/core/aapt2.mk +++ b/core/aapt2.mk @@ -78,12 +78,17 @@ ifneq ($(my_apk_split_configs),) $(my_res_package): PRIVATE_AAPT_FLAGS += $(addprefix --split ,$(join $(built_apk_splits),$(addprefix :,$(my_apk_split_configs)))) endif +my_srcjar := $(intermediates.COMMON)/aapt2.srcjar +LOCAL_SRCJARS += $(my_srcjar) + $(my_res_package): PRIVATE_RES_FLAT := $(my_res_resources_flat) $(my_res_package): PRIVATE_OVERLAY_FLAT := $(my_static_library_resources) $(my_resources_flata) $(my_overlay_resources_flat) $(my_res_package): PRIVATE_SHARED_ANDROID_LIBRARIES := $(my_shared_library_resources) $(my_res_package): PRIVATE_PROGUARD_OPTIONS_FILE := $(proguard_options_file) $(my_res_package): PRIVATE_ASSET_DIRS := $(my_asset_dirs) -$(my_res_package): .KATI_IMPLICIT_OUTPUTS := +$(my_res_package): PRIVATE_JAVA_GEN_DIR := $(intermediates.COMMON)/aapt2 +$(my_res_package): PRIVATE_SRCJAR := $(my_srcjar) +$(my_res_package): .KATI_IMPLICIT_OUTPUTS := $(my_srcjar) ifdef R_file_stamp $(my_res_package): PRIVATE_R_FILE_STAMP := $(R_file_stamp) @@ -108,12 +113,12 @@ $(my_res_package): $(full_android_manifest) $(my_static_library_resources) $(my_ $(my_res_package): $(my_full_asset_paths) $(my_res_package): $(my_res_resources_flat) $(my_overlay_resources_flat) \ $(my_resources_flata) $(my_static_library_resources) \ - $(AAPT2) + $(AAPT2) $(SOONG_ZIP) @echo "AAPT2 link $@" $(call aapt2-link) ifdef R_file_stamp @rm -f $(PRIVATE_R_FILE_STAMP) - $(call find-generated-R.java,$(PRIVATE_R_FILE_STAMP)) + $(call find-generated-R.java,$(PRIVATE_JAVA_GEN_DIR),$(PRIVATE_R_FILE_STAMP)) endif ifdef LOCAL_EXPORT_PACKAGE_RESOURCES @rm -f $(PRIVATE_RESOURCE_EXPORT_PACKAGE) diff --git a/core/definitions.mk b/core/definitions.mk index 0565603e2..e259e1981 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -2021,11 +2021,12 @@ AAPT_ASAN_OPTIONS := ASAN_OPTIONS=detect_leaks=0 # This rule creates the R.java and Manifest.java files, both of which # are PRODUCT-neutral. Don't pass PRIVATE_PRODUCT_AAPT_CONFIG to this invocation. define create-resource-java-files -@mkdir -p $(PRIVATE_SOURCE_INTERMEDIATES_DIR) @mkdir -p $(dir $(PRIVATE_RESOURCE_PUBLICS_OUTPUT)) +rm -rf $(PRIVATE_JAVA_GEN_DIR) +mkdir -p $(PRIVATE_JAVA_GEN_DIR) $(hide) $(AAPT_ASAN_OPTIONS) $(AAPT) package $(PRIVATE_AAPT_FLAGS) -m \ $(eval # PRIVATE_PRODUCT_AAPT_CONFIG is intentionally missing-- see comment.) \ - $(addprefix -J , $(PRIVATE_SOURCE_INTERMEDIATES_DIR)) \ + $(addprefix -J , $(PRIVATE_JAVA_GEN_DIR)) \ $(addprefix -M , $(PRIVATE_ANDROID_MANIFEST)) \ $(addprefix -P , $(PRIVATE_RESOURCE_PUBLICS_OUTPUT)) \ $(addprefix -S , $(PRIVATE_RESOURCE_DIR)) \ @@ -2039,30 +2040,31 @@ $(hide) $(AAPT_ASAN_OPTIONS) $(AAPT) package $(PRIVATE_AAPT_FLAGS) -m \ $(addprefix --rename-manifest-package , $(PRIVATE_MANIFEST_PACKAGE_NAME)) \ $(addprefix --rename-instrumentation-target-package , $(PRIVATE_MANIFEST_INSTRUMENTATION_FOR)) \ --skip-symbols-without-default-localization +$(SOONG_ZIP) -o $(PRIVATE_SRCJAR) -C $(PRIVATE_JAVA_GEN_DIR) -D $(PRIVATE_JAVA_GEN_DIR) # So that we re-run aapt when the list of input files change $(hide) echo $(PRIVATE_RESOURCE_LIST) >/dev/null endef -# Search for generated R.java/Manifest.java, copy the found R.java as $1. +# Search for generated R.java/Manifest.java in $1, copy the found R.java as $2. # Also copy them to a central 'R' directory to make it easier to add the files to an IDE. define find-generated-R.java -$(hide) for GENERATED_MANIFEST_FILE in `find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) \ +$(hide) for GENERATED_MANIFEST_FILE in `find $(1) \ -name Manifest.java 2> /dev/null`; do \ dir=`awk '/package/{gsub(/\./,"/",$$2);gsub(/;/,"",$$2);print $$2;exit}' $$GENERATED_MANIFEST_FILE`; \ mkdir -p $(TARGET_COMMON_OUT_ROOT)/R/$$dir; \ $(ACP) -fp $$GENERATED_MANIFEST_FILE $(TARGET_COMMON_OUT_ROOT)/R/$$dir; \ done; -$(hide) for GENERATED_R_FILE in `find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) \ +$(hide) for GENERATED_R_FILE in `find $(1) \ -name R.java 2> /dev/null`; do \ dir=`awk '/package/{gsub(/\./,"/",$$2);gsub(/;/,"",$$2);print $$2;exit}' $$GENERATED_R_FILE`; \ mkdir -p $(TARGET_COMMON_OUT_ROOT)/R/$$dir; \ $(ACP) -fp $$GENERATED_R_FILE $(TARGET_COMMON_OUT_ROOT)/R/$$dir \ || exit 31; \ - $(ACP) -fp $$GENERATED_R_FILE $1 || exit 32; \ + $(ACP) -fp $$GENERATED_R_FILE $(2) || exit 32; \ done; @# Ensure that the target file is always created, i.e. also in case we did not @# enter the GENERATED_R_FILE-loop above. This avoids unnecessary rebuilding. -$(hide) touch $1 +$(hide) touch $(2) endef ########################################################### @@ -2110,6 +2112,8 @@ endef define aapt2-link @mkdir -p $(dir $@) +rm -rf $(PRIVATE_JAVA_GEN_DIR) +mkdir -p $(PRIVATE_JAVA_GEN_DIR) $(call dump-words-to-file,$(PRIVATE_RES_FLAT),$(dir $@)aapt2-flat-list) $(call dump-words-to-file,$(PRIVATE_OVERLAY_FLAT),$(dir $@)aapt2-flat-overlay-list) $(hide) $(AAPT2) link -o $@ \ @@ -2118,7 +2122,7 @@ $(hide) $(AAPT2) link -o $@ \ $(addprefix -I ,$(PRIVATE_AAPT_INCLUDES)) \ $(addprefix -I ,$(PRIVATE_SHARED_ANDROID_LIBRARIES)) \ $(addprefix -A ,$(PRIVATE_ASSET_DIR)) \ - $(addprefix --java ,$(PRIVATE_SOURCE_INTERMEDIATES_DIR)) \ + $(addprefix --java ,$(PRIVATE_JAVA_GEN_DIR)) \ $(addprefix --proguard ,$(PRIVATE_PROGUARD_OPTIONS_FILE)) \ $(addprefix --min-sdk-version ,$(PRIVATE_DEFAULT_APP_TARGET_SDK)) \ $(addprefix --target-sdk-version ,$(PRIVATE_DEFAULT_APP_TARGET_SDK)) \ @@ -2131,6 +2135,7 @@ $(hide) $(AAPT2) link -o $@ \ $(addprefix --rename-instrumentation-target-package ,$(PRIVATE_MANIFEST_INSTRUMENTATION_FOR)) \ -R \@$(dir $@)aapt2-flat-overlay-list \ \@$(dir $@)aapt2-flat-list +$(SOONG_ZIP) -o $(PRIVATE_SRCJAR) -C $(PRIVATE_JAVA_GEN_DIR) -D $(PRIVATE_JAVA_GEN_DIR) endef ########################################################### diff --git a/core/package_internal.mk b/core/package_internal.mk index 0385d9169..fba50a167 100644 --- a/core/package_internal.mk +++ b/core/package_internal.mk @@ -373,6 +373,11 @@ ifdef LOCAL_USE_AAPT2 include $(BUILD_SYSTEM)/aapt2.mk else # LOCAL_USE_AAPT2 + my_srcjar := $(intermediates.COMMON)/aapt.srcjar + LOCAL_SRCJARS += $(my_srcjar) + $(R_file_stamp): PRIVATE_SRCJAR := $(my_srcjar) + $(R_file_stamp): PRIVATE_JAVA_GEN_DIR := $(intermediates.COMMON)/aapt + $(R_file_stamp): .KATI_IMPLICIT_OUTPUTS := $(my_srcjar) # Since we don't know where the real R.java file is going to end up, # we need to use another file to stand in its place. We'll just # copy the generated file to src/R.stamp, which means it will @@ -386,11 +391,11 @@ else # LOCAL_USE_AAPT2 $(intermediates.COMMON)/public_resources.xml $(R_file_stamp): PRIVATE_PROGUARD_OPTIONS_FILE := $(proguard_options_file) $(R_file_stamp): PRIVATE_RESOURCE_LIST := $(all_res_assets) - $(R_file_stamp): $(all_res_assets) $(full_android_manifest) $(rs_generated_res_zip) $(AAPT) | $(ACP) + $(R_file_stamp): $(all_res_assets) $(full_android_manifest) $(rs_generated_res_zip) $(AAPT) $(SOONG_ZIP) | $(ACP) @echo "target R.java/Manifest.java: $(PRIVATE_MODULE) ($@)" @rm -rf $@ && mkdir -p $(dir $@) $(create-resource-java-files) - $(call find-generated-R.java,$@) + $(call find-generated-R.java,$(PRIVATE_JAVA_GEN_DIR),$@) $(proguard_options_file): $(R_file_stamp) diff --git a/core/static_java_library.mk b/core/static_java_library.mk index e764f3113..3219bb1ca 100644 --- a/core/static_java_library.mk +++ b/core/static_java_library.mk @@ -135,9 +135,6 @@ $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_AAPT_CHARACTERISTICS := $(TARGET_A $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_MANIFEST_PACKAGE_NAME := $(LOCAL_MANIFEST_PACKAGE_NAME) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_MANIFEST_INSTRUMENTATION_FOR := $(LOCAL_MANIFEST_INSTRUMENTATION_FOR) -# LOCAL_INTERMEDIATE_SOURCE_DIR is set later by java.mk, but we need it for AAPT -LOCAL_INTERMEDIATE_SOURCE_DIR := $(intermediates.COMMON)/src - # add --non-constant-id to prevent inlining constants. # AAR needs text symbol file R.txt. ifdef LOCAL_USE_AAPT2 @@ -150,9 +147,14 @@ $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_PRODUCT_AAPT_PREF_CONFIG := $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_AAPT_CHARACTERISTICS := else $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_AAPT_FLAGS := $(LOCAL_AAPT_FLAGS) --non-constant-id --output-text-symbols $(intermediates.COMMON) + +my_srcjar := $(intermediates.COMMON)/aapt.srcjar +LOCAL_SRCJARS += $(my_srcjar) +$(R_file_stamp): PRIVATE_SRCJAR := $(my_srcjar) +$(R_file_stamp): PRIVATE_JAVA_GEN_DIR := $(intermediates.COMMON)/aapt +$(R_file_stamp): .KATI_IMPLICIT_OUTPUTS := $(intermediates.COMMON)/R.txt) $(my_srcjar) endif -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_SOURCE_INTERMEDIATES_DIR := $(LOCAL_INTERMEDIATE_SOURCE_DIR) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ANDROID_MANIFEST := $(full_android_manifest) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_RESOURCE_PUBLICS_OUTPUT := $(intermediates.COMMON)/public_resources.xml $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_RESOURCE_DIR := $(LOCAL_RESOURCE_DIR) @@ -175,12 +177,13 @@ ifdef LOCAL_USE_AAPT2 $(my_res_package) : $(framework_res_package_export) $(my_res_package): .KATI_IMPLICIT_OUTPUTS += $(intermediates.COMMON)/R.txt else - $(R_file_stamp): .KATI_IMPLICIT_OUTPUTS := $(intermediates.COMMON)/R.txt + $(R_file_stamp): .KATI_IMPLICIT_OUTPUTS += $(intermediates.COMMON)/R.txt $(R_file_stamp): PRIVATE_RESOURCE_LIST := $(all_resources) - $(R_file_stamp) : $(all_resources) $(full_android_manifest) $(AAPT) $(framework_res_package_export) $(rs_generated_res_zip) + $(R_file_stamp) : $(all_resources) $(full_android_manifest) $(AAPT) $(SOONG_ZIP) \ + $(framework_res_package_export) $(rs_generated_res_zip) @echo "target R.java/Manifest.java: $(PRIVATE_MODULE) ($@)" $(create-resource-java-files) - $(hide) find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) -name R.java | xargs cat > $@ + $(hide) find $(PRIVATE_JAVA_GEN_DIR) -name R.java | xargs cat > $@ endif # LOCAL_USE_AAPT2 endif # need_compile_res