diff options
author | Ying Wang <wangying@google.com> | 2014-05-13 13:57:28 -0700 |
---|---|---|
committer | Brian Carlstrom <bdc@google.com> | 2014-05-18 22:04:58 -0700 |
commit | b9aa5d43de114cecdf94fabb23d3f61f147b627d (patch) | |
tree | fea4ac45cd534bf3726096381f5b3ac09c1985a8 | |
parent | 3c8089cef8eaf90b11852a5c258eba0ff5e3287e (diff) | |
download | build-b9aa5d43de114cecdf94fabb23d3f61f147b627d.zip build-b9aa5d43de114cecdf94fabb23d3f61f147b627d.tar.gz build-b9aa5d43de114cecdf94fabb23d3f61f147b627d.tar.bz2 |
Multilib support for odex
If the VM is libart and DEXPREOPT is enabled,
- For a Java library and the boot image, we build for both 1st arch and
2nd arch.
- For an app, we build for the multilib arch the module is targeted for.
The odex file will be in <arch_name>/<module_name>.odex inside the same
dir where the jar/apk file gets installed.
Nothing changed if it's built for libdvm.
Bug: 14694978
Change-Id: I45118a83758b41d52d6c9e38f93f0ba2775a6c74
-rw-r--r-- | core/clear_vars.mk | 2 | ||||
-rw-r--r-- | core/config.mk | 19 | ||||
-rw-r--r-- | core/dex_preopt.mk | 17 | ||||
-rw-r--r-- | core/dex_preopt_libart.mk | 76 | ||||
-rw-r--r-- | core/dex_preopt_libart_boot.mk | 55 | ||||
-rw-r--r-- | core/dex_preopt_odex_install.mk | 72 | ||||
-rw-r--r-- | core/java_library.mk | 11 | ||||
-rw-r--r-- | core/package_internal.mk | 8 | ||||
-rw-r--r-- | core/prebuilt_internal.mk | 8 | ||||
-rw-r--r-- | target/product/core_64_bit.mk | 3 |
10 files changed, 178 insertions, 93 deletions
diff --git a/core/clear_vars.mk b/core/clear_vars.mk index 682656b..1dd5cfe 100644 --- a/core/clear_vars.mk +++ b/core/clear_vars.mk @@ -118,7 +118,7 @@ LOCAL_RENDERSCRIPT_SKIP_INSTALL:= LOCAL_RENDERSCRIPT_TARGET_API:= LOCAL_BUILD_HOST_DEX:= LOCAL_DEX_PREOPT:= # '',true,false,nostripping -LOCAL_DEX_PREOPT_IMAGE:= +LOCAL_DEX_PREOPT_IMAGE_LOCATION:= LOCAL_PROTOC_OPTIMIZE_TYPE:= # lite(default),micro,nano,full LOCAL_PROTOC_FLAGS:= LOCAL_PROTO_JAVA_OUTPUT_PARAMS:= diff --git a/core/config.mk b/core/config.mk index 287944e..1c2db34 100644 --- a/core/config.mk +++ b/core/config.mk @@ -528,20 +528,17 @@ endif DEX2OAT_TARGET_ARCH := $(TARGET_ARCH) DEX2OAT_TARGET_CPU_VARIANT := $(TARGET_CPU_VARIANT) DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES := default +ifneq (,$(filter $(DEX2OAT_TARGET_CPU_VARIANT),cortex-a7 cortex-a15 krait denver)) + DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES := div +endif -# If for a 64bit build we have a 2nd architecture but the zygote isn't 64bit, -# assume DEX2OAT should DEXPREOPT for the 2nd architecture. ifdef TARGET_2ND_ARCH - ifeq (true,$(TARGET_IS_64_BIT)) - ifeq ($(filter ro.zygote=zygote64,$(PRODUCT_DEFAULT_PROPERTY_OVERRIDES)),) - DEX2OAT_TARGET_ARCH := $(TARGET_2ND_ARCH) - DEX2OAT_TARGET_CPU_VARIANT := $(TARGET_2ND_CPU_VARIANT) - endif - endif +$(TARGET_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_ARCH := $(TARGET_2ND_ARCH) +$(TARGET_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_CPU_VARIANT := $(TARGET_2ND_CPU_VARIANT) +$(TARGET_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES := default +ifneq (,$(filter $($(TARGET_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_CPU_VARIANT),cortex-a7 cortex-a15 krait denver)) + $(TARGET_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES := div endif - -ifneq (,$(filter $(DEX2OAT_TARGET_CPU_VARIANT),cortex-a7 cortex-a15 krait denver)) - DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES := div endif # define clang/llvm tools and global flags diff --git a/core/dex_preopt.mk b/core/dex_preopt.mk index 46a6479..ab970f9 100644 --- a/core/dex_preopt.mk +++ b/core/dex_preopt.mk @@ -49,25 +49,26 @@ endif include $(BUILD_SYSTEM)/dex_preopt_libart.mk # Define dexpreopt-one-file based on current default runtime. -# $(1): the boot image to use (unused for libdvm) -# $(2): the input .jar or .apk file -# $(3): the input .jar or .apk target location (unused for libdvm) -# $(4): the output .odex file +# $(1): the input .jar or .apk file +# $(2): the output .odex file ifeq ($(DALVIK_VM_LIB),libdvm.so) define dexpreopt-one-file -$(call dexopt-one-file,$(2),$(4)) +$(call dexopt-one-file,$(1),$(2)) endef DEXPREOPT_ONE_FILE_DEPENDENCY_TOOLS := $(DEXOPT_DEPENDENCY) DEXPREOPT_ONE_FILE_DEPENDENCY_BUILT_BOOT_PREOPT := $(DEXPREOPT_BOOT_ODEXS) else define dexpreopt-one-file -$(call dex2oat-one-file,$(1),$(2),$(3),$(4)) +$(call dex2oat-one-file,$(1),$(2)) endef DEXPREOPT_ONE_FILE_DEPENDENCY_TOOLS := $(DEX2OATD_DEPENDENCY) -DEXPREOPT_ONE_FILE_DEPENDENCY_BUILT_BOOT_PREOPT := $(DEFAULT_DEX_PREOPT_BUILT_IMAGE) -endif +DEXPREOPT_ONE_FILE_DEPENDENCY_BUILT_BOOT_PREOPT := $(DEFAULT_DEX_PREOPT_BUILT_IMAGE_FILENAME) +ifdef TARGET_2ND_ARCH +$(TARGET_2ND_ARCH_VAR_PREFIX)DEXPREOPT_ONE_FILE_DEPENDENCY_BUILT_BOOT_PREOPT := $($(TARGET_2ND_ARCH_VAR_PREFIX)DEFAULT_DEX_PREOPT_BUILT_IMAGE_FILENAME) +endif # TARGET_2ND_ARCH +endif # DALVIK_VM_LIB else $(warning No DALVIK_VM_LIB, disable dexpreopt.) WITH_DEXPREOPT := false diff --git a/core/dex_preopt_libart.mk b/core/dex_preopt_libart.mk index 7f3285c..7d8cee0 100644 --- a/core/dex_preopt_libart.mk +++ b/core/dex_preopt_libart.mk @@ -23,20 +23,6 @@ DEX2OATD_DEPENDENCY += $(LIBARTD_COMPILER) PRELOADED_CLASSES := frameworks/base/preloaded-classes -LIBART_BOOT_IMAGE := /$(DEXPREOPT_BOOT_JAR_DIR)/boot-$(DEX2OAT_TARGET_ARCH).art - -DEFAULT_DEX_PREOPT_BUILT_IMAGE := $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/boot-$(DEX2OAT_TARGET_ARCH).art - -DEFAULT_DEX_PREOPT_INSTALLED_IMAGE := -ifneq ($(PRODUCT_DEX_PREOPT_IMAGE_IN_DATA),true) -DEFAULT_DEX_PREOPT_INSTALLED_IMAGE := $(PRODUCT_OUT)$(LIBART_BOOT_IMAGE) - -# The rule to install boot.art and boot.oat -$(DEFAULT_DEX_PREOPT_INSTALLED_IMAGE) : $(DEFAULT_DEX_PREOPT_BUILT_IMAGE) | $(ACP) - $(call copy-file-to-target) - $(hide) $(ACP) -fp $(patsubst %.art,%.oat,$<) $(patsubst %.art,%.oat,$@) -endif - # start of image reserved address space LIBART_IMG_HOST_BASE_ADDRESS := 0x60000000 @@ -49,48 +35,50 @@ endif ######################################################################## # The full system boot classpath +# Returns the path to the .odex file +# $(1): the arch name. +# $(2): the full path (including file name) of the corresponding .jar or .apk. +define get-odex-file-path +$(dir $(2))$(1)/$(basename $(notdir $(2))).odex +endef + +# Returns the path to the image file (such as "/system/framework/<arch>/boot.art" +# $(1): the arch name (such as "arm") +# $(2): the image location (such as "/system/framework/boot.art") +define get-image-file-path +$(dir $(2))$(1)/$(notdir $(2)) +endef + # note we use core-libart.jar in place of core.jar for ART. LIBART_TARGET_BOOT_JARS := $(patsubst core, core-libart,$(DEXPREOPT_BOOT_JARS_MODULES)) LIBART_TARGET_BOOT_DEX_LOCATIONS := $(foreach jar,$(LIBART_TARGET_BOOT_JARS),/$(DEXPREOPT_BOOT_JAR_DIR)/$(jar).jar) LIBART_TARGET_BOOT_DEX_FILES := $(foreach jar,$(LIBART_TARGET_BOOT_JARS),$(call intermediates-dir-for,JAVA_LIBRARIES,$(jar),,COMMON)/javalib.jar) -# The .oat with symbols -LIBART_TARGET_BOOT_OAT_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED)$(patsubst %.art,%.oat,$(LIBART_BOOT_IMAGE)) - -# Use dex2oat debug version for better error reporting -$(DEFAULT_DEX_PREOPT_BUILT_IMAGE): $(LIBART_TARGET_BOOT_DEX_FILES) $(DEX2OATD_DEPENDENCY) - @echo "target dex2oat: $@ ($?)" - @mkdir -p $(dir $@) - @mkdir -p $(dir $(LIBART_TARGET_BOOT_OAT_UNSTRIPPED)) - $(hide) $(DEX2OATD) --runtime-arg -Xms256m --runtime-arg -Xmx256m --image-classes=$(PRELOADED_CLASSES) \ - $(addprefix --dex-file=,$(LIBART_TARGET_BOOT_DEX_FILES)) \ - $(addprefix --dex-location=,$(LIBART_TARGET_BOOT_DEX_LOCATIONS)) \ - --oat-symbols=$(LIBART_TARGET_BOOT_OAT_UNSTRIPPED) \ - --oat-file=$(patsubst %.art,%.oat,$@) \ - --oat-location=$(patsubst %.art,%.oat,$(LIBART_BOOT_IMAGE)) \ - --image=$@ --base=$(LIBART_IMG_TARGET_BASE_ADDRESS) \ - --instruction-set=$(DEX2OAT_TARGET_ARCH) \ - --instruction-set-features=$(DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES) \ - --android-root=$(PRODUCT_OUT)/system +my_2nd_arch_prefix := +include $(BUILD_SYSTEM)/dex_preopt_libart_boot.mk + +ifdef TARGET_2ND_ARCH +my_2nd_arch_prefix := $(TARGET_2ND_ARCH_VAR_PREFIX) +include $(BUILD_SYSTEM)/dex_preopt_libart_boot.mk +my_2nd_arch_prefix := +endif ######################################################################## # For a single jar or APK -# $(1): the boot image to use -# $(2): the input .jar or .apk file -# $(3): the input .jar or .apk target location -# $(4): the output .odex file +# $(1): the input .jar or .apk file +# $(2): the output .odex file define dex2oat-one-file -$(hide) rm -f $(4) -$(hide) mkdir -p $(dir $(4)) +$(hide) rm -f $(2) +$(hide) mkdir -p $(dir $(2)) $(hide) $(DEX2OATD) \ --runtime-arg -Xms64m --runtime-arg -Xmx64m \ - --boot-image=$(1) \ - --dex-file=$(2) \ - --dex-location=$(3) \ - --oat-file=$(4) \ + --boot-image=$(PRIVATE_DEX_PREOPT_IMAGE_LOCATION) \ + --dex-file=$(1) \ + --dex-location=$(PRIVATE_DEX_LOCATION) \ + --oat-file=$(2) \ --android-root=$(PRODUCT_OUT)/system \ - --instruction-set=$(DEX2OAT_TARGET_ARCH) \ - --instruction-set-features=$(DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES) + --instruction-set=$($(PRIVATE_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_ARCH) \ + --instruction-set-features=$($(PRIVATE_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES) endef diff --git a/core/dex_preopt_libart_boot.mk b/core/dex_preopt_libart_boot.mk new file mode 100644 index 0000000..70130b6 --- /dev/null +++ b/core/dex_preopt_libart_boot.mk @@ -0,0 +1,55 @@ +# Rules to build boot.art +# Input variables: +# my_2nd_arch_prefix: indicates if this is to build for the 2nd arch. + +# The image "location" is a symbolic path that with multiarchitecture +# support doesn't really exist on the device. Typically it is +# /system/framework/boot.art and should be the same for all supported +# architectures on the device. The concrete architecture specific +# content actually ends up in a "filename" that contains an +# architecture specific directory name such as arm, arm64, mips, +# mips64, x86, x86_64. +# +# Here are some example values for an x86_64 / x86 configuration: +# +# DEFAULT_DEX_PREOPT_BUILT_IMAGE_LOCATION=out/target/product/generic_x86_64/dex_bootjars/system/framework/boot.art +# DEFAULT_DEX_PREOPT_BUILT_IMAGE_FILENAME=out/target/product/generic_x86_64/dex_bootjars/system/framework/x86_64/boot.art +# LIBART_BOOT_IMAGE=/system/framework/x86_64/boot.art +# +# 2ND_DEFAULT_DEX_PREOPT_BUILT_IMAGE_LOCATION=out/target/product/generic_x86_64/dex_bootjars/system/framework/boot.art +# 2ND_DEFAULT_DEX_PREOPT_BUILT_IMAGE_FILENAME=out/target/product/generic_x86_64/dex_bootjars/system/framework/x86/boot.art +# 2ND_LIBART_BOOT_IMAGE=/system/framework/x86/boot.art + +$(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_BUILT_IMAGE_LOCATION := $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/boot.art +$(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_BUILT_IMAGE_FILENAME := $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/$($(my_2nd_arch_prefix)DEX2OAT_TARGET_ARCH)/boot.art +$(my_2nd_arch_prefix)LIBART_BOOT_IMAGE_FILENAME := /$(DEXPREOPT_BOOT_JAR_DIR)/$($(my_2nd_arch_prefix)DEX2OAT_TARGET_ARCH)/boot.art + +# The .oat with symbols +$(my_2nd_arch_prefix)LIBART_TARGET_BOOT_OAT_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED)$(patsubst %.art,%.oat,$($(my_2nd_arch_prefix)LIBART_BOOT_IMAGE_FILENAME)) + +$(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_INSTALLED_IMAGE := +ifneq ($(PRODUCT_DEX_PREOPT_IMAGE_IN_DATA),true) +$(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_INSTALLED_IMAGE := $(PRODUCT_OUT)$($(my_2nd_arch_prefix)LIBART_BOOT_IMAGE_FILENAME) +endif + +# The rule to install boot.art and boot.oat +$($(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_INSTALLED_IMAGE) : $($(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_BUILT_IMAGE_FILENAME) | $(ACP) + $(call copy-file-to-target) + $(hide) $(ACP) -fp $(patsubst %.art,%.oat,$<) $(patsubst %.art,%.oat,$@) + +$($(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_BUILT_IMAGE_FILENAME): PRIVATE_2ND_ARCH_VAR_PREFIX := $(my_2nd_arch_prefix) +# Use dex2oat debug version for better error reporting +$($(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_BUILT_IMAGE_FILENAME) : $(LIBART_TARGET_BOOT_DEX_FILES) $(DEX2OATD_DEPENDENCY) + @echo "target dex2oat: $@ ($?)" + @mkdir -p $(dir $@) + @mkdir -p $(dir $($(PRIVATE_2ND_ARCH_VAR_PREFIX)LIBART_TARGET_BOOT_OAT_UNSTRIPPED)) + $(hide) $(DEX2OATD) --runtime-arg -Xms256m --runtime-arg -Xmx256m --image-classes=$(PRELOADED_CLASSES) \ + $(addprefix --dex-file=,$(LIBART_TARGET_BOOT_DEX_FILES)) \ + $(addprefix --dex-location=,$(LIBART_TARGET_BOOT_DEX_LOCATIONS)) \ + --oat-symbols=$($(PRIVATE_2ND_ARCH_VAR_PREFIX)LIBART_TARGET_BOOT_OAT_UNSTRIPPED) \ + --oat-file=$(patsubst %.art,%.oat,$@) \ + --oat-location=$(patsubst %.art,%.oat,$($(PRIVATE_2ND_ARCH_VAR_PREFIX)LIBART_BOOT_IMAGE_FILENAME)) \ + --image=$@ --base=$(LIBART_IMG_TARGET_BASE_ADDRESS) \ + --instruction-set=$($(PRIVATE_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_ARCH) \ + --instruction-set-features=$($(PRIVATE_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES) \ + --android-root=$(PRODUCT_OUT)/system diff --git a/core/dex_preopt_odex_install.mk b/core/dex_preopt_odex_install.mk index b0b73af..6d70dde 100644 --- a/core/dex_preopt_odex_install.mk +++ b/core/dex_preopt_odex_install.mk @@ -43,22 +43,86 @@ else # libdvm.so # For libart, the boot jars' odex files are replaced by $(DEFAULT_DEX_PREOPT_INSTALLED_IMAGE). # We use this installed_odex trick to get boot.art installed. installed_odex := $(DEFAULT_DEX_PREOPT_INSTALLED_IMAGE) +# Append the odex for the 2nd arch if we have one. +installed_odex += $($(TARGET_2ND_ARCH_VAR_PREFIX)DEFAULT_DEX_PREOPT_INSTALLED_IMAGE) endif # libdvm.so else # boot jar +ifeq ($(DALVIK_VM_LIB),libdvm.so) built_odex := $(basename $(LOCAL_BUILT_MODULE)).odex installed_odex := $(basename $(LOCAL_INSTALLED_MODULE)).odex -ifneq ($(DALVIK_VM_LIB),libdvm.so) # libart -ifndef LOCAL_DEX_PREOPT_IMAGE -LOCAL_DEX_PREOPT_IMAGE := $(DEFAULT_DEX_PREOPT_BUILT_IMAGE) +$(built_odex) : $(DEXPREOPT_ONE_FILE_DEPENDENCY_BUILT_BOOT_PREOPT) \ + $(DEXPREOPT_ONE_FILE_DEPENDENCY_TOOLS) +else # libart +ifeq ($(LOCAL_MODULE_CLASS),JAVA_LIBRARIES) +# For a Java library, we build odex for both 1st arch and 2nd arch, if we have one. +# ################################################# +# Odex for the 1st arch +built_odex := $(call get-odex-file-path,$(DEX2OAT_TARGET_ARCH),$(LOCAL_BUILT_MODULE)) +ifdef LOCAL_DEX_PREOPT_IMAGE_LOCATION +my_dex_preopt_image_location := $(LOCAL_DEX_PREOPT_IMAGE_LOCATION) +else +my_dex_preopt_image_location := $(DEFAULT_DEX_PREOPT_BUILT_IMAGE_LOCATION) +endif +my_dex_preopt_image_filename := $(call get-image-file-path,$(DEX2OAT_TARGET_ARCH),$(my_dex_preopt_image_location)) +$(built_odex): PRIVATE_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) : $(DEXPREOPT_ONE_FILE_DEPENDENCY_BUILT_BOOT_PREOPT) \ + $(DEXPREOPT_ONE_FILE_DEPENDENCY_TOOLS) \ + $(my_dex_preopt_image_filename) +installed_odex := $(call get-odex-file-path,$(DEX2OAT_TARGET_ARCH),$(LOCAL_INSTALLED_MODULE)) + +# ################################################# +# Odex for the 2nd arch +ifdef TARGET_2ND_ARCH +built_odex2 := $(call get-odex-file-path,$($(TARGET_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_ARCH),$(LOCAL_BUILT_MODULE)) +ifdef LOCAL_DEX_PREOPT_IMAGE_LOCATION +my_dex_preopt_image_location := $(LOCAL_DEX_PREOPT_IMAGE_LOCATION) +else +my_dex_preopt_image_location := $($(TARGET_2ND_ARCH_VAR_PREFIX)DEFAULT_DEX_PREOPT_BUILT_IMAGE_LOCATION) +endif +my_dex_preopt_image_filename := $(call get-image-file-path,$($(TARGET_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_ARCH),$(my_dex_preopt_image_location)) +$(built_odex2): PRIVATE_2ND_ARCH_VAR_PREFIX := $(TARGET_2ND_ARCH_VAR_PREFIX) +$(built_odex2): PRIVATE_DEX_LOCATION := $(patsubst $(PRODUCT_OUT)%,%,$(LOCAL_INSTALLED_MODULE)) +$(built_odex2): PRIVATE_DEX_PREOPT_IMAGE_LOCATION := $(my_dex_preopt_image_location) +$(built_odex2) : $($(TARGET_2ND_ARCH_VAR_PREFIX)DEXPREOPT_ONE_FILE_DEPENDENCY_BUILT_BOOT_PREOPT) \ + $(DEXPREOPT_ONE_FILE_DEPENDENCY_TOOLS) \ + $(my_dex_preopt_image_filename) + +built_odex += $(built_odex2) +installed_odex += $(call get-odex-file-path,$($(TARGET_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_ARCH),$(LOCAL_INSTALLED_MODULE)) +endif # TARGET_2ND_ARCH +# ################################################# +else # must be APPS +# For an app, we build for the multilib arch it's targeted for. +built_odex := $(call get-odex-file-path,$($(LOCAL_2ND_ARCH_VAR_PREFIX)DEX2OAT_TARGET_ARCH),$(LOCAL_BUILT_MODULE)) +ifdef LOCAL_DEX_PREOPT_IMAGE_LOCATION +my_dex_preopt_image_location := $(LOCAL_DEX_PREOPT_IMAGE_LOCATION) +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) \ + $(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)) +endif # LOCAL_MODULE_CLASS 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. -$(installed_odex) : $(built_odex) $(LOCAL_BUILT_MODULE) | $(ACP) +# 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) @echo "Install: $@" $(copy-file-to-target) endif diff --git a/core/java_library.mk b/core/java_library.mk index 343b27e..dffc7d9 100644 --- a/core/java_library.mk +++ b/core/java_library.mk @@ -93,15 +93,10 @@ endif else # ! boot jar $(built_odex): PRIVATE_MODULE := $(LOCAL_MODULE) -$(built_odex): PRIVATE_DEX_LOCATION := $(patsubst $(PRODUCT_OUT)%,%,$(LOCAL_INSTALLED_MODULE)) -$(built_odex): PRIVATE_DEX_PREOPT_IMAGE := $(LOCAL_DEX_PREOPT_IMAGE) -# Make sure the boot jars get dex-preopt-ed first -$(built_odex) : $(DEXPREOPT_ONE_FILE_DEPENDENCY_BUILT_BOOT_PREOPT) -$(built_odex) : $(DEXPREOPT_ONE_FILE_DEPENDENCY_TOOLS) -$(built_odex) : $(LOCAL_DEX_PREOPT_IMAGE) -$(built_odex) : $(common_javalib.jar) +# Use pattern rule - we may have multiple built odex files. +$(built_odex) : $(dir $(LOCAL_BUILT_MODULE))% : $(common_javalib.jar) @echo "Dexpreopt Jar: $(PRIVATE_MODULE) ($@)" - $(call dexpreopt-one-file,$(PRIVATE_DEX_PREOPT_IMAGE),$<,$(PRIVATE_DEX_LOCATION),$@) + $(call dexpreopt-one-file,$<,$@) $(LOCAL_BUILT_MODULE) : $(common_javalib.jar) | $(ACP) $(call copy-file-to-target) diff --git a/core/package_internal.mk b/core/package_internal.mk index 768032e..f8d2f43 100644 --- a/core/package_internal.mk +++ b/core/package_internal.mk @@ -337,13 +337,7 @@ $(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_DEX_LOCATION := $(patsubst $(PRODUCT_OUT)%,%,$(LOCAL_INSTALLED_MODULE)) $(LOCAL_BUILT_MODULE): PRIVATE_BUILT_ODEX := $(built_odex) -$(LOCAL_BUILT_MODULE): PRIVATE_DEX_PREOPT_IMAGE := $(LOCAL_DEX_PREOPT_IMAGE) -# Make sure the boot jars get dexpreopt-ed first -$(LOCAL_BUILT_MODULE) : $(DEXPREOPT_ONE_FILE_DEPENDENCY_BUILT_BOOT_PREOPT) -$(LOCAL_BUILT_MODULE) : $(DEXPREOPT_ONE_FILE_DEPENDENCY_TOOLS) -$(LOCAL_BUILT_MODULE) : $(LOCAL_DEX_PREOPT_IMAGE) # built_odex is byproduct of LOCAL_BUILT_MODULE without its own build recipe. $(built_odex) : $(LOCAL_BUILT_MODULE) @@ -377,7 +371,7 @@ ifneq ($(extra_jar_args),) endif $(sign-package) ifdef LOCAL_DEX_PREOPT - $(call dexpreopt-one-file,$(PRIVATE_DEX_PREOPT_IMAGE),$@,$(PRIVATE_DEX_LOCATION),$(PRIVATE_BUILT_ODEX)) + $(call dexpreopt-one-file,$@,$(PRIVATE_BUILT_ODEX)) ifneq (nostripping,$(LOCAL_DEX_PREOPT)) $(call dexpreopt-remove-classes.dex,$@) endif diff --git a/core/prebuilt_internal.mk b/core/prebuilt_internal.mk index 089cc63..2445d0d 100644 --- a/core/prebuilt_internal.mk +++ b/core/prebuilt_internal.mk @@ -157,13 +157,7 @@ LOCAL_DEX_PREOPT := false include $(BUILD_SYSTEM)/dex_preopt_odex_install.mk ####################################### ifdef LOCAL_DEX_PREOPT -$(built_module): PRIVATE_DEX_PREOPT_IMAGE := $(LOCAL_DEX_PREOPT_IMAGE) -$(built_module): PRIVATE_DEX_LOCATION := $(patsubst $(PRODUCT_OUT)%,%,$(LOCAL_INSTALLED_MODULE)) $(built_module): PRIVATE_BUILT_ODEX := $(built_odex) -# Make sure the boot jars get dexpreopt-ed first -$(built_module) : $(DEXPREOPT_ONE_FILE_DEPENDENCY_BUILT_BOOT_PREOPT) -$(built_module) : $(DEXPREOPT_ONE_FILE_DEPENDENCY_TOOLS) -(built_module) : $(LOCAL_DEX_PREOPT_IMAGE) # built_odex is byproduct of LOCAL_BUILT_MODULE without its own build recipe. $(built_odex) : $(LOCAL_BUILT_MODULE) endif # LOCAL_DEX_PREOPT @@ -174,7 +168,7 @@ ifneq ($(LOCAL_CERTIFICATE),PRESIGNED) $(sign-package) endif ifdef LOCAL_DEX_PREOPT - $(call dexpreopt-one-file,$(PRIVATE_DEX_PREOPT_IMAGE),$@,$(PRIVATE_DEX_LOCATION),$(PRIVATE_BUILT_ODEX)) + $(call dexpreopt-one-file,$@,$(PRIVATE_BUILT_ODEX)) endif $(align-package) diff --git a/target/product/core_64_bit.mk b/target/product/core_64_bit.mk index a21620c..5d7abcb 100644 --- a/target/product/core_64_bit.mk +++ b/target/product/core_64_bit.mk @@ -37,6 +37,3 @@ TARGET_PREFER_32_BIT_APPS := true TARGET_SUPPORTS_32_BIT_APPS := true TARGET_SUPPORTS_64_BIT_APPS := true - -# Disable DEXPREOPT until we have multilib support (bug 14694978). -WITH_DEXPREOPT := false |