From 36142f64aef3da56a6e70589dad634b5babc0c31 Mon Sep 17 00:00:00 2001 From: Ying Wang Date: Wed, 21 May 2014 16:13:33 -0700 Subject: [PATCH] Split the rules to build the odex file Previously the odex file is byproduct generated by the package.apk rule. Though we have the odex file depend on the package.apk it doesn't have its own build recipe. In case package.apk isn't updated but we still need to update the odex file (such as changed LOCAL_MULTILIB), the odex file will never be rebuilt. This change split out the rules to build the odex file and make sure the build recipe get executed if the odex file needs rebuild. Change-Id: I60c2f32b536b3d59045301ee863aae1451734aad --- core/definitions.mk | 4 ++-- core/dex_preopt_odex_install.mk | 13 +++++-------- core/package_internal.mk | 19 ++++++++++++------- core/prebuilt_internal.mk | 16 ++++++++++------ 4 files changed, 29 insertions(+), 23 deletions(-) diff --git a/core/definitions.mk b/core/definitions.mk index cc0fda5f2..a024c9aab 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -1679,10 +1679,10 @@ endef # so we need to give it something. define create-empty-package @mkdir -p $(dir $@) -$(hide) touch $(dir $@)/dummy +$(hide) touch $(dir $@)dummy $(hide) (cd $(dir $@) && jar cf $(notdir $@) dummy) $(hide) zip -qd $@ dummy -$(hide) rm $(dir $@)/dummy +$(hide) rm $(dir $@)dummy endef #TODO: we kinda want to build different asset packages for diff --git a/core/dex_preopt_odex_install.mk b/core/dex_preopt_odex_install.mk index 6d70dde9c..db2314076 100644 --- a/core/dex_preopt_odex_install.mk +++ b/core/dex_preopt_odex_install.mk @@ -103,11 +103,10 @@ else my_dex_preopt_image_location := $($(LOCAL_2ND_ARCH_VAR_PREFIX)DEFAULT_DEX_PREOPT_BUILT_IMAGE_LOCATION) endif my_dex_preopt_image_filename := $(call get-image-file-path,$($(LOCAL_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_ARCH),$(my_dex_preopt_image_location)) -# $(built_odex) is byproduct of $(LOCAL_BUILT_MODULE) -$(LOCAL_BUILT_MODULE) $(built_odex): PRIVATE_2ND_ARCH_VAR_PREFIX := $(LOCAL_2ND_ARCH_VAR_PREFIX) -$(LOCAL_BUILT_MODULE) $(built_odex): PRIVATE_DEX_LOCATION := $(patsubst $(PRODUCT_OUT)%,%,$(LOCAL_INSTALLED_MODULE)) -$(LOCAL_BUILT_MODULE) $(built_odex): PRIVATE_DEX_PREOPT_IMAGE_LOCATION := $(my_dex_preopt_image_location) -$(LOCAL_BUILT_MODULE) $(built_odex) : $($(LOCAL_2ND_ARCH_VAR_PREFIX)DEXPREOPT_ONE_FILE_DEPENDENCY_BUILT_BOOT_PREOPT) \ +$(built_odex): PRIVATE_2ND_ARCH_VAR_PREFIX := $(LOCAL_2ND_ARCH_VAR_PREFIX) +$(built_odex): PRIVATE_DEX_LOCATION := $(patsubst $(PRODUCT_OUT)%,%,$(LOCAL_INSTALLED_MODULE)) +$(built_odex): PRIVATE_DEX_PREOPT_IMAGE_LOCATION := $(my_dex_preopt_image_location) +$(built_odex) : $($(LOCAL_2ND_ARCH_VAR_PREFIX)DEXPREOPT_ONE_FILE_DEPENDENCY_BUILT_BOOT_PREOPT) \ $(DEXPREOPT_ONE_FILE_DEPENDENCY_TOOLS) \ $(my_dex_preopt_image_filename) installed_odex := $(call get-odex-file-path,$($(LOCAL_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_ARCH),$(LOCAL_INSTALLED_MODULE)) @@ -116,13 +115,11 @@ endif # libart endif # boot jar ifdef built_odex -# We need $(LOCAL_BUILT_MODULE) in the deps to enforce reinstallation -# even if $(built_odex) is byproduct of $(LOCAL_BUILT_MODULE), such as in package.mk. # Use pattern rule - we may have multiple installed odex files. # Ugly syntax - See the definition get-odex-file-path. $(installed_odex) : $(dir $(LOCAL_INSTALLED_MODULE))%/$(notdir $(word 1,$(installed_odex))) \ : $(dir $(LOCAL_BUILT_MODULE))%/$(notdir $(word 1,$(built_odex))) \ - $(LOCAL_BUILT_MODULE) | $(ACP) + | $(ACP) @echo "Install: $@" $(copy-file-to-target) endif diff --git a/core/package_internal.mk b/core/package_internal.mk index f8d2f4365..cb1e4244a 100644 --- a/core/package_internal.mk +++ b/core/package_internal.mk @@ -336,12 +336,6 @@ $(LOCAL_BUILT_MODULE): PRIVATE_ADDITIONAL_CERTIFICATES := $(foreach c,\ # Define the rule to build the actual package. $(LOCAL_BUILT_MODULE): $(AAPT) | $(ZIPALIGN) -ifdef LOCAL_DEX_PREOPT -$(LOCAL_BUILT_MODULE): PRIVATE_BUILT_ODEX := $(built_odex) - -# built_odex is byproduct of LOCAL_BUILT_MODULE without its own build recipe. -$(built_odex) : $(LOCAL_BUILT_MODULE) -endif $(LOCAL_BUILT_MODULE): PRIVATE_JNI_SHARED_LIBRARIES := $(jni_shared_libraries) $(LOCAL_BUILT_MODULE): PRIVATE_JNI_SHARED_LIBRARIES_ABI := $(jni_shared_libraries_abi) ifneq ($(TARGET_BUILD_APPS),) @@ -371,7 +365,6 @@ ifneq ($(extra_jar_args),) endif $(sign-package) ifdef LOCAL_DEX_PREOPT - $(call dexpreopt-one-file,$@,$(PRIVATE_BUILT_ODEX)) ifneq (nostripping,$(LOCAL_DEX_PREOPT)) $(call dexpreopt-remove-classes.dex,$@) endif @@ -379,6 +372,18 @@ endif @# Alignment must happen after all other zip operations. $(align-package) +############################### +## Rule to build the odex file +ifdef LOCAL_DEX_PREOPT +$(built_odex): PRIVATE_DEX_FILE := $(built_dex) +$(built_odex) : $(built_dex) + $(create-empty-package) + $(add-dex-to-package) + $(hide) mv $@ $@.input + $(call dexpreopt-one-file,$@.input,$@) + $(hide) rm $@.input +endif + # Save information about this package PACKAGES.$(LOCAL_PACKAGE_NAME).OVERRIDES := $(strip $(LOCAL_OVERRIDES_PACKAGES)) PACKAGES.$(LOCAL_PACKAGE_NAME).RESOURCE_FILES := $(all_resources) diff --git a/core/prebuilt_internal.mk b/core/prebuilt_internal.mk index 6fe9818a2..7229b3a46 100644 --- a/core/prebuilt_internal.mk +++ b/core/prebuilt_internal.mk @@ -162,11 +162,6 @@ LOCAL_DEX_PREOPT := false # defines built_odex along with rule to install odex include $(BUILD_SYSTEM)/dex_preopt_odex_install.mk ####################################### -ifdef LOCAL_DEX_PREOPT -$(built_module): PRIVATE_BUILT_ODEX := $(built_odex) -# built_odex is byproduct of LOCAL_BUILT_MODULE without its own build recipe. -$(built_odex) : $(LOCAL_BUILT_MODULE) -endif # LOCAL_DEX_PREOPT # Sign and align non-presigned .apks. $(built_module) : $(my_prebuilt_src_file) | $(ACP) $(ZIPALIGN) $(SIGNAPK_JAR) $(transform-prebuilt-to-target) @@ -177,10 +172,19 @@ ifneq ($(LOCAL_CERTIFICATE),PRESIGNED) $(sign-package) endif ifdef LOCAL_DEX_PREOPT - $(call dexpreopt-one-file,$@,$(PRIVATE_BUILT_ODEX)) +ifneq (nostripping,$(LOCAL_DEX_PREOPT)) + $(call dexpreopt-remove-classes.dex,$@) +endif endif $(align-package) +############################### +## Rule to build the odex file +ifdef LOCAL_DEX_PREOPT +$(built_odex) : $(my_prebuilt_src_file) + $(call dexpreopt-one-file,$<,$@) +endif + else # LOCAL_MODULE_CLASS != APPS ifneq ($(LOCAL_PREBUILT_STRIP_COMMENTS),) $(built_module) : $(my_prebuilt_src_file)