From ced4bff58e76a16ebce3a35ed24aadc8490ca39b Mon Sep 17 00:00:00 2001 From: Brian Carlstrom Date: Thu, 14 Nov 2013 23:44:56 -0800 Subject: Add DEXPREOPT support for ART Change-Id: I24d0d7b2a23a769f5d69bd4dc14be22e1475b759 --- core/base_rules.mk | 9 --- core/clear_vars.mk | 1 + core/config.mk | 2 - core/dex_preopt.mk | 97 +++++++++++++------------------- core/dex_preopt_libart.mk | 96 +++++++++++++++++++++++++++++++ core/dex_preopt_libdvm.mk | 76 +++++++++++++++++++++++++ core/dex_preopt_odex_install.mk | 70 +++++++++++++++++++++++ core/java.mk | 5 ++ core/java_library.mk | 39 +++++-------- core/package.mk | 35 ++++-------- core/prebuilt.mk | 37 +++++++++--- core/product_config.mk | 11 ++++ target/product/runtime_libart.mk | 3 - target/product/runtime_libart_default.mk | 3 +- target/product/runtime_libdvm.mk | 5 -- target/product/runtime_libdvm_default.mk | 3 +- 16 files changed, 353 insertions(+), 139 deletions(-) create mode 100644 core/dex_preopt_libart.mk create mode 100644 core/dex_preopt_libdvm.mk create mode 100644 core/dex_preopt_odex_install.mk diff --git a/core/base_rules.mk b/core/base_rules.mk index ca61f88..c256869 100644 --- a/core/base_rules.mk +++ b/core/base_rules.mk @@ -535,15 +535,6 @@ $(LOCAL_INSTALLED_MODULE): $(LOCAL_BUILT_MODULE) $(copy-file-to-target-with-cp) endif -ifdef LOCAL_DEX_PREOPT -installed_odex := $(basename $(LOCAL_INSTALLED_MODULE)).odex -built_odex := $(basename $(LOCAL_BUILT_MODULE)).odex -$(installed_odex) : $(built_odex) $(LOCAL_BUILT_MODULE) | $(ACP) - @echo "Install: $@" - $(copy-file-to-target) - -$(LOCAL_INSTALLED_MODULE) : $(installed_odex) -endif endif # !LOCAL_UNINSTALLABLE_MODULE diff --git a/core/clear_vars.mk b/core/clear_vars.mk index 0a3517b..0648b35 100644 --- a/core/clear_vars.mk +++ b/core/clear_vars.mk @@ -119,6 +119,7 @@ LOCAL_RENDERSCRIPT_SKIP_INSTALL:= LOCAL_RENDERSCRIPT_TARGET_API:= LOCAL_BUILD_HOST_DEX:= LOCAL_DEX_PREOPT:= # '',true,false,nostripping +LOCAL_DEX_PREOPT_IMAGE:= 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 90fb43a..958a3fb 100644 --- a/core/config.mk +++ b/core/config.mk @@ -364,8 +364,6 @@ PROGUARD := external/proguard/bin/proguard.sh JAVATAGS := build/tools/java-event-log-tags.py LLVM_RS_CC := $(HOST_OUT_EXECUTABLES)/llvm-rs-cc$(HOST_EXECUTABLE_SUFFIX) BCC_COMPAT := $(HOST_OUT_EXECUTABLES)/bcc_compat$(HOST_EXECUTABLE_SUFFIX) -DEXOPT := $(HOST_OUT_EXECUTABLES)/dexopt$(HOST_EXECUTABLE_SUFFIX) -DEXPREOPT := dalvik/tools/dex-preopt LINT := prebuilts/sdk/tools/lint # ACP is always for the build OS, not for the host OS diff --git a/core/dex_preopt.mk b/core/dex_preopt.mk index 34150ff..c9530c2 100644 --- a/core/dex_preopt.mk +++ b/core/dex_preopt.mk @@ -1,89 +1,72 @@ #################################### -# Dexpreopt on the boot jars +# dexpreopt support - typically used on user builds to run dexopt (for Dalvik) or dex2oat (for ART) ahead of time # #################################### +ifeq ($(DALVIK_VM_LIB),) +$(error No value for DALVIK_VM_LIB) +endif + +# list of boot classpath jars for dexpreopt DEXPREOPT_BOOT_JARS := $(PRODUCT_BOOT_JARS) DEXPREOPT_BOOT_JARS_MODULES := $(subst :, ,$(DEXPREOPT_BOOT_JARS)) PRODUCT_BOOTCLASSPATH := $(subst $(space),:,$(foreach m,$(DEXPREOPT_BOOT_JARS_MODULES),/system/framework/$(m).jar)) DEXPREOPT_BUILD_DIR := $(OUT_DIR) -DEXPREOPT_PRODUCT_DIR := $(patsubst $(DEXPREOPT_BUILD_DIR)/%,%,$(PRODUCT_OUT))/dex_bootjars +DEXPREOPT_PRODUCT_DIR_FULL_PATH := $(PRODUCT_OUT)/dex_bootjars +DEXPREOPT_PRODUCT_DIR := $(patsubst $(DEXPREOPT_BUILD_DIR)/%,%,$(DEXPREOPT_PRODUCT_DIR_FULL_PATH)) DEXPREOPT_BOOT_JAR_DIR := system/framework -DEXPREOPT_DEXOPT := $(patsubst $(DEXPREOPT_BUILD_DIR)/%,%,$(DEXOPT)) - -DEXPREOPT_BOOT_JAR_DIR_FULL_PATH := $(DEXPREOPT_BUILD_DIR)/$(DEXPREOPT_PRODUCT_DIR)/$(DEXPREOPT_BOOT_JAR_DIR) - -DEXPREOPT_BOOT_ODEXS := $(foreach b,$(DEXPREOPT_BOOT_JARS_MODULES),\ - $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/$(b).odex) - -# If the target is a uniprocessor, then explicitly tell the preoptimizer -# that fact. (By default, it always optimizes for an SMP target.) -ifeq ($(TARGET_CPU_SMP),true) -DEXPREOPT_UNIPROCESSOR := -else -DEXPREOPT_UNIPROCESSOR := --uniprocessor -endif +DEXPREOPT_BOOT_JAR_DIR_FULL_PATH := $(DEXPREOPT_PRODUCT_DIR_FULL_PATH)/$(DEXPREOPT_BOOT_JAR_DIR) # $(1): the .jar or .apk to remove classes.dex define dexpreopt-remove-classes.dex $(hide) $(AAPT) remove $(1) classes.dex endef -# $(1): the input .jar or .apk file -# $(2): the output .odex file -define dexpreopt-one-file -$(hide) $(DEXPREOPT) --dexopt=$(DEXPREOPT_DEXOPT) --build-dir=$(DEXPREOPT_BUILD_DIR) \ - --product-dir=$(DEXPREOPT_PRODUCT_DIR) --boot-dir=$(DEXPREOPT_BOOT_JAR_DIR) \ - --boot-jars=$(DEXPREOPT_BOOT_JARS) $(DEXPREOPT_UNIPROCESSOR) \ - $(patsubst $(DEXPREOPT_BUILD_DIR)/%,%,$(1)) \ - $(patsubst $(DEXPREOPT_BUILD_DIR)/%,%,$(2)) -endef +# Special rules for building stripped boot jars that override java_library.mk rules # $(1): boot jar module name -define _dexpreopt-boot-jar -$(eval _dbj_jar := $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/$(1).jar) -$(eval _dbj_odex := $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/$(1).odex) -$(eval _dbj_jar_no_dex := $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/$(1)_nodex.jar) -$(eval _dbj_src_jar := $(call intermediates-dir-for,JAVA_LIBRARIES,$(1),,COMMON)/javalib.jar) -$(eval $(_dbj_odex): PRIVATE_DBJ_JAR := $(_dbj_jar)) -$(_dbj_odex) : $(_dbj_src_jar) | $(ACP) $(DEXPREOPT) $(DEXOPT) - @echo "Dexpreopt Boot Jar: $$@" - $(hide) rm -f $$@ - $(hide) mkdir -p $$(dir $$@) - $(hide) $(ACP) -fp $$< $$(PRIVATE_DBJ_JAR) - $$(call dexpreopt-one-file,$$(PRIVATE_DBJ_JAR),$$@) +define _dexpreopt-boot-jar-remove-classes.dex +_dbj_jar_no_dex := $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/$(1)_nodex.jar +_dbj_src_jar := $(call intermediates-dir-for,JAVA_LIBRARIES,$(1),,COMMON)/javalib.jar -$(_dbj_jar_no_dex) : $(_dbj_src_jar) | $(ACP) $(AAPT) +$$(_dbj_jar_no_dex) : $$(_dbj_src_jar) | $(ACP) $(AAPT) $$(call copy-file-to-target) ifneq ($(DEX_PREOPT_DEFAULT),nostripping) $$(call dexpreopt-remove-classes.dex,$$@) endif -$(eval _dbj_jar :=) -$(eval _dbj_odex :=) -$(eval _dbj_jar_no_dex :=) -$(eval _dbj_src_jar :=) +_dbj_jar_no_dex := +_dbj_src_jar := endef -$(foreach b,$(DEXPREOPT_BOOT_JARS_MODULES),$(eval $(call _dexpreopt-boot-jar,$(b)))) +$(foreach b,$(DEXPREOPT_BOOT_JARS_MODULES),$(eval $(call _dexpreopt-boot-jar-remove-classes.dex,$(b)))) -# $(1): the rest list of boot jars -define _build-dexpreopt-boot-jar-dependency-pair -$(if $(filter 1,$(words $(1)))$(filter 0,$(words $(1))),,\ - $(eval _bdbjdp_target := $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/$(word 2,$(1)).odex) \ - $(eval _bdbjdp_dep := $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/$(word 1,$(1)).odex) \ - $(eval $(call add-dependency,$(_bdbjdp_target),$(_bdbjdp_dep))) \ - $(eval $(call _build-dexpreopt-boot-jar-dependency-pair,$(wordlist 2,999,$(1))))) -endef +# Conditionally include Dalvik support. +ifeq ($(DALVIK_VM_LIB),libdvm.so) +include $(BUILD_SYSTEM)/dex_preopt_libdvm.mk +endif + +# Unconditionally include ART support because its used run dex2oat on the host for tests. +include $(BUILD_SYSTEM)/dex_preopt_libart.mk -define _build-dexpreopt-boot-jar-dependency -$(call _build-dexpreopt-boot-jar-dependency-pair,$(DEXPREOPT_BOOT_JARS_MODULES)) +# 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 +ifeq ($(DALVIK_VM_LIB),libdvm.so) +define dexpreopt-one-file +$(call dexopt-one-file,$(2),$(4)) endef -$(eval $(call _build-dexpreopt-boot-jar-dependency)) +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)) +endef -DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES := default -ifeq ($(TARGET_CPU_VARIANT),$(filter $(TARGET_CPU_VARIANT),cortex-a15 krait)) -DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES := div +DEXPREOPT_ONE_FILE_DEPENDENCY_TOOLS := $(DEX2OAT_DEPENDENCY) +DEXPREOPT_ONE_FILE_DEPENDENCY_BUILT_BOOT_PREOPT := $(DEFAULT_DEX_PREOPT_BUILT_IMAGE) endif diff --git a/core/dex_preopt_libart.mk b/core/dex_preopt_libart.mk new file mode 100644 index 0000000..1e7b193 --- /dev/null +++ b/core/dex_preopt_libart.mk @@ -0,0 +1,96 @@ +#################################### +# dexpreopt support for ART +# +#################################### + +DEX2OAT := $(HOST_OUT_EXECUTABLES)/dex2oat$(HOST_EXECUTABLE_SUFFIX) +DEX2OATD := $(HOST_OUT_EXECUTABLES)/dex2oatd$(HOST_EXECUTABLE_SUFFIX) + +LIBART_COMPILER := $(HOST_OUT_SHARED_LIBRARIES)/libart-compiler$(HOST_SHLIB_SUFFIX) +LIBARTD_COMPILER := $(HOST_OUT_SHARED_LIBRARIES)/libartd-compiler$(HOST_SHLIB_SUFFIX) + +# TODO: for now, override with debug version for better error reporting +DEX2OAT := $(DEX2OATD) +LIBART_COMPILER := $(LIBARTD_COMPILER) + +# By default, do not run rerun dex2oat if the tool changes. +# Comment out the | to force dex2oat to rerun on after all changes. +DEX2OAT_DEPENDENCY := art/runtime/oat.cc # dependency on oat version number +DEX2OAT_DEPENDENCY += art/runtime/image.cc # dependency on image version number +DEX2OAT_DEPENDENCY += | +DEX2OAT_DEPENDENCY += $(DEX2OAT) +DEX2OAT_DEPENDENCY += $(LIBART_COMPILER) + +PRELOADED_CLASSES := frameworks/base/preloaded-classes + +LIBART_BOOT_IMAGE := /$(DEXPREOPT_BOOT_JAR_DIR)/boot.art + +DEFAULT_DEX_PREOPT_BUILT_IMAGE := $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/boot.art +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,$@) + +DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES := default +ifeq ($(TARGET_CPU_VARIANT),$(filter $(TARGET_CPU_VARIANT),cortex-a15 krait)) +DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES := div +endif + +# start of image reserved address space +LIBART_IMG_HOST_BASE_ADDRESS := 0x60000000 + +ifeq ($(TARGET_ARCH),mips) +LIBART_IMG_TARGET_BASE_ADDRESS := 0x30000000 +else +LIBART_IMG_TARGET_BASE_ADDRESS := 0x60000000 +endif + +######################################################################## +# The full system boot classpath + +# 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)) + +$(DEFAULT_DEX_PREOPT_BUILT_IMAGE): $(LIBART_TARGET_BOOT_DEX_FILES) $(DEX2OAT_DEPENDENCY) + @echo "target dex2oat: $@ ($?)" + @mkdir -p $(dir $@) + @mkdir -p $(dir $(LIBART_TARGET_BOOT_OAT_UNSTRIPPED)) + $(hide) $(DEX2OAT) --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=$(TARGET_ARCH) --instruction-set-features=$(DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES) \ + --host-prefix=$(DEXPREOPT_PRODUCT_DIR_FULL_PATH) --android-root=$(PRODUCT_OUT)/system + + +######################################################################## +# 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 +define dex2oat-one-file +$(hide) rm -f $(4) +$(hide) mkdir -p $(dir $(4)) +$(hide) $(DEX2OAT) \ + --runtime-arg -Xms64m --runtime-arg -Xmx64m \ + --boot-image=$(1) \ + --dex-file=$(2) \ + --dex-location=$(3) \ + --oat-file=$(4) \ + --host-prefix=$(DEXPREOPT_PRODUCT_DIR_FULL_PATH) \ + --android-root=$(PRODUCT_OUT)/system \ + --instruction-set=$(TARGET_ARCH) \ + --instruction-set-features=$(DEX2OAT_TARGET_INSTRUCTION_SET_FEATURES) +endef diff --git a/core/dex_preopt_libdvm.mk b/core/dex_preopt_libdvm.mk new file mode 100644 index 0000000..5c858b5 --- /dev/null +++ b/core/dex_preopt_libdvm.mk @@ -0,0 +1,76 @@ +#################################### +# dexpreopt support for Dalvik +# +#################################### + +DEXOPT := $(HOST_OUT_EXECUTABLES)/dexopt$(HOST_EXECUTABLE_SUFFIX) +DEXPREOPT := dalvik/tools/dex-preopt + +DEXPREOPT_DEXOPT := $(patsubst $(DEXPREOPT_BUILD_DIR)/%,%,$(DEXOPT)) + +DEXPREOPT_BOOT_ODEXS := $(foreach b,$(DEXPREOPT_BOOT_JARS_MODULES),\ + $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/$(b).odex) + +# If the target is a uniprocessor, then explicitly tell the preoptimizer +# that fact. (By default, it always optimizes for an SMP target.) +ifeq ($(TARGET_CPU_SMP),true) + DEXPREOPT_UNIPROCESSOR := +else + DEXPREOPT_UNIPROCESSOR := --uniprocessor +endif + +# By default, do not run rerun dexopt if the tool changes. +# Comment out the | to force dex2oat to rerun on after all changes. +DEXOPT_DEPENDENCY := | +DEXOPT_DEPENDENCY += $(DEXPREOPT) $(DEXOPT) + +# $(1): the input .jar or .apk file +# $(2): the output .odex file +define dexopt-one-file +$(hide) rm -f $(2) +$(hide) mkdir -p $(dir $(2)) +$(hide) $(DEXPREOPT) \ + --dexopt=$(DEXPREOPT_DEXOPT) \ + --build-dir=$(DEXPREOPT_BUILD_DIR) \ + --product-dir=$(DEXPREOPT_PRODUCT_DIR) \ + --boot-dir=$(DEXPREOPT_BOOT_JAR_DIR) \ + --boot-jars=$(DEXPREOPT_BOOT_JARS) \ + $(DEXPREOPT_UNIPROCESSOR) \ + $(patsubst $(DEXPREOPT_BUILD_DIR)/%,%,$(1)) \ + $(patsubst $(DEXPREOPT_BUILD_DIR)/%,%,$(2)) +endef + +# Special rules for building odex files for boot jars that override java_library.mk rules + +# $(1): boot jar module name +define _dexpreopt-boot-odex +_dbj_jar := $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/$(1).jar +_dbj_odex := $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/$(1).odex +_dbj_src_jar := $(call intermediates-dir-for,JAVA_LIBRARIES,$(1),,COMMON)/javalib.jar +$$(_dbj_odex): PRIVATE_DBJ_JAR := $$(_dbj_jar) +$$(_dbj_odex) : $$(_dbj_src_jar) | $(ACP) $(DEXPREOPT) $(DEXOPT) + @echo "Dexpreopt Boot Jar: $$@" + $(hide) $(ACP) -fp $$< $$(PRIVATE_DBJ_JAR) + $$(call dexopt-one-file,$$(PRIVATE_DBJ_JAR),$$@) + +_dbj_jar := +_dbj_odex := +_dbj_src_jar := +endef + +$(foreach b,$(DEXPREOPT_BOOT_JARS_MODULES),$(eval $(call _dexpreopt-boot-odex,$(b)))) + +# $(1): the rest list of boot jars +define _build-dexpreopt-boot-jar-dependency-pair +$(if $(filter 1,$(words $(1)))$(filter 0,$(words $(1))),,\ + $(eval _bdbjdp_target := $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/$(word 2,$(1)).odex) \ + $(eval _bdbjdp_dep := $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/$(word 1,$(1)).odex) \ + $(eval $(call add-dependency,$(_bdbjdp_target),$(_bdbjdp_dep))) \ + $(eval $(call _build-dexpreopt-boot-jar-dependency-pair,$(wordlist 2,999,$(1))))) +endef + +define _build-dexpreopt-boot-jar-dependency +$(call _build-dexpreopt-boot-jar-dependency-pair,$(DEXPREOPT_BOOT_JARS_MODULES)) +endef + +$(eval $(call _build-dexpreopt-boot-jar-dependency)) diff --git a/core/dex_preopt_odex_install.mk b/core/dex_preopt_odex_install.mk new file mode 100644 index 0000000..70b83a4 --- /dev/null +++ b/core/dex_preopt_odex_install.mk @@ -0,0 +1,70 @@ +# dexpreopt_odex_install.mk is used to define odex creation rules for JARs and APKs +# This file depends on variables set in base_rules.mk +# Output variables: LOCAL_DEX_PREOPT, built_odex, dexpreopt_boot_jar_module + +# Setting LOCAL_DEX_PREOPT based on WITH_DEXPREOPT, LOCAL_DEX_PREOPT, etc +LOCAL_DEX_PREOPT := $(strip $(LOCAL_DEX_PREOPT)) +ifneq (true,$(WITH_DEXPREOPT)) + LOCAL_DEX_PREOPT := +else # WITH_DEXPREOPT=true + ifeq (,$(TARGET_BUILD_APPS)) # TARGET_BUILD_APPS empty + ifneq (,$(LOCAL_SRC_FILES)) # LOCAL_SRC_FILES not empty + ifndef LOCAL_DEX_PREOPT # LOCAL_DEX_PREOPT undefined + ifeq (,$(LOCAL_APK_LIBRARIES)) # LOCAL_APK_LIBRARIES empty + LOCAL_DEX_PREOPT := $(DEX_PREOPT_DEFAULT) + else # LOCAL_APK_LIBRARIES not empty + LOCAL_DEX_PREOPT := nostripping + endif # LOCAL_APK_LIBRARIES not empty + endif # LOCAL_DEX_PREOPT undefined + endif # LOCAL_SRC_FILES not empty + endif # TARGET_BUILD_APPS empty +endif # WITH_DEXPREOPT=true +ifeq (false,$(LOCAL_DEX_PREOPT)) + LOCAL_DEX_PREOPT := +endif +ifdef LOCAL_UNINSTALLABLE_MODULE +LOCAL_DEX_PREOPT := +endif +ifeq (,$(strip $(all_java_sources)$(full_static_java_libs)$(my_prebuilt_src_file))) # contains no java code +LOCAL_DEX_PREOPT := +endif +# if module oat file requested in data, disable LOCAL_DEX_PREOPT, will default location to dalvik-cache +ifneq (,$(filter $(LOCAL_MODULE),$(PRODUCT_DEX_PREOPT_PACKAGES_IN_DATA))) +LOCAL_DEX_PREOPT := +endif + +built_odex := +installed_odex := +ifdef LOCAL_DEX_PREOPT +dexpreopt_boot_jar_module := $(filter $(DEXPREOPT_BOOT_JARS_MODULES),$(LOCAL_MODULE)) +ifdef dexpreopt_boot_jar_module +ifeq ($(DALVIK_VM_LIB),libdvm.so) +built_odex := $(basename $(LOCAL_BUILT_MODULE)).odex +installed_odex := $(basename $(LOCAL_INSTALLED_MODULE)).odex +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) +endif # libdvm.so +else # boot jar +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) +endif +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) + @echo "Install: $@" + $(copy-file-to-target) +endif + +# Add the installed_odex to the list of installed files for this module. +ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(installed_odex) +endif # LOCAL_DEX_PREOPT diff --git a/core/java.mk b/core/java.mk index 9a5404e..95ec8f5 100644 --- a/core/java.mk +++ b/core/java.mk @@ -252,6 +252,11 @@ include $(BUILD_SYSTEM)/base_rules.mk java_alternative_checked_module := +####################################### +# defines built_odex along with rule to install odex +include $(BUILD_SYSTEM)/dex_preopt_odex_install.mk +####################################### + # Make sure there's something to build. ifdef full_classes_jar ifndef need_compile_java diff --git a/core/java_library.mk b/core/java_library.mk index 4c6b652..343b27e 100644 --- a/core/java_library.mk +++ b/core/java_library.mk @@ -34,21 +34,6 @@ ifeq ($(LOCAL_PROGUARD_ENABLED),disabled) LOCAL_PROGUARD_ENABLED := endif -ifneq (true,$(WITH_DEXPREOPT)) -LOCAL_DEX_PREOPT := -else -ifeq (,$(TARGET_BUILD_APPS)) -ifeq (,$(LOCAL_APK_LIBRARIES)) -ifndef LOCAL_DEX_PREOPT -LOCAL_DEX_PREOPT := $(DEX_PREOPT_DEFAULT) -endif -endif -endif -endif -ifeq (false,$(LOCAL_DEX_PREOPT)) -LOCAL_DEX_PREOPT := -endif - ifeq (true,$(EMMA_INSTRUMENT)) ifeq (true,$(LOCAL_EMMA_INSTRUMENT)) ifeq (true,$(EMMA_INSTRUMENT_STATIC)) @@ -93,28 +78,30 @@ ifneq ($(extra_jar_args),) endif ifdef LOCAL_DEX_PREOPT -dexpreopt_boot_jar_module := $(filter $(LOCAL_MODULE),$(DEXPREOPT_BOOT_JARS_MODULES)) -ifneq ($(dexpreopt_boot_jar_module),) +ifneq ($(dexpreopt_boot_jar_module),) # boot jar # boot jar's rules are defined in dex_preopt.mk dexpreopted_boot_jar := $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/$(dexpreopt_boot_jar_module)_nodex.jar $(LOCAL_BUILT_MODULE) : $(dexpreopted_boot_jar) | $(ACP) $(call copy-file-to-target) +# For libart boot jars, we don't have .odex files. +ifeq ($(DALVIK_VM_LIB),libdvm.so) dexpreopted_boot_odex := $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/$(dexpreopt_boot_jar_module).odex -built_odex := $(basename $(LOCAL_BUILT_MODULE)).odex $(built_odex) : $(dexpreopted_boot_odex) | $(ACP) $(call copy-file-to-target) +endif -else # dexpreopt_boot_jar_module -built_odex := $(basename $(LOCAL_BUILT_MODULE)).odex +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_BOOT_ODEXS) -$(built_odex) : $(common_javalib.jar) | $(DEXPREOPT) $(DEXOPT) +$(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) @echo "Dexpreopt Jar: $(PRIVATE_MODULE) ($@)" - $(hide) rm -f $@ - @mkdir -p $(dir $@) - $(call dexpreopt-one-file,$<,$@) + $(call dexpreopt-one-file,$(PRIVATE_DEX_PREOPT_IMAGE),$<,$(PRIVATE_DEX_LOCATION),$@) $(LOCAL_BUILT_MODULE) : $(common_javalib.jar) | $(ACP) $(call copy-file-to-target) @@ -122,7 +109,7 @@ ifneq (nostripping,$(LOCAL_DEX_PREOPT)) $(call dexpreopt-remove-classes.dex,$@) endif -endif # dexpreopt_boot_jar_module +endif # ! boot jar else # LOCAL_DEX_PREOPT $(LOCAL_BUILT_MODULE) : $(common_javalib.jar) | $(ACP) diff --git a/core/package.mk b/core/package.mk index 551028c..56f2dab 100644 --- a/core/package.mk +++ b/core/package.mk @@ -146,23 +146,6 @@ endif # all_resources endif # !custom LOCAL_PROGUARD_FLAGS := $(addprefix -include ,$(proguard_options_file)) $(LOCAL_PROGUARD_FLAGS) -ifneq (true,$(WITH_DEXPREOPT)) -LOCAL_DEX_PREOPT := -else -ifeq (,$(TARGET_BUILD_APPS)) -ifeq (,$(LOCAL_APK_LIBRARIES)) -ifneq (,$(LOCAL_SRC_FILES)) -ifndef LOCAL_DEX_PREOPT -LOCAL_DEX_PREOPT := $(DEX_PREOPT_DEFAULT) -endif -endif -endif -endif -endif -ifeq (false,$(LOCAL_DEX_PREOPT)) -LOCAL_DEX_PREOPT := -endif - ifeq (true,$(EMMA_INSTRUMENT)) ifndef LOCAL_EMMA_INSTRUMENT # No emma for test apks. @@ -391,8 +374,16 @@ $(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_BOOT_ODEXS) | $(DEXPREOPT) $(DEXOPT) +$(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) endif $(LOCAL_BUILT_MODULE): PRIVATE_JNI_SHARED_LIBRARIES := $(jni_shared_libraries) $(LOCAL_BUILT_MODULE): PRIVATE_JNI_SHARED_LIBRARIES_ABI := $(jni_shared_libraries_abi) @@ -423,8 +414,7 @@ ifneq ($(extra_jar_args),) endif $(sign-package) ifdef LOCAL_DEX_PREOPT - $(hide) rm -f $(patsubst %.apk,%.odex,$@) - $(call dexpreopt-one-file,$@,$(patsubst %.apk,%.odex,$@)) + $(call dexpreopt-one-file,$(PRIVATE_DEX_PREOPT_IMAGE),$@,$(PRIVATE_DEX_LOCATION),$(PRIVATE_BUILT_ODEX)) ifneq (nostripping,$(LOCAL_DEX_PREOPT)) $(call dexpreopt-remove-classes.dex,$@) endif @@ -432,11 +422,6 @@ endif @# Alignment must happen after all other zip operations. $(align-package) -ifdef LOCAL_DEX_PREOPT -built_odex := $(basename $(LOCAL_BUILT_MODULE)).odex -$(built_odex): $(LOCAL_BUILT_MODULE) -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.mk b/core/prebuilt.mk index e34fa55..13d4de7 100644 --- a/core/prebuilt.mk +++ b/core/prebuilt.mk @@ -145,18 +145,37 @@ else endif ifneq ($(filter APPS,$(LOCAL_MODULE_CLASS)),) -ifeq ($(LOCAL_CERTIFICATE),PRESIGNED) -# Ensure that presigned .apks have been aligned. -$(built_module) : $(my_prebuilt_src_file) | $(ZIPALIGN) - $(transform-prebuilt-to-target-with-zipalign) -else + +# Disable dex-preopt of prebuilts to save space +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_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 # Sign and align non-presigned .apks. $(built_module) : $(my_prebuilt_src_file) | $(ACP) $(ZIPALIGN) $(SIGNAPK_JAR) $(transform-prebuilt-to-target) +ifneq ($(LOCAL_CERTIFICATE),PRESIGNED) $(sign-package) - $(align-package) endif -else +ifdef LOCAL_DEX_PREOPT + $(call dexpreopt-one-file,$(PRIVATE_DEX_PREOPT_IMAGE),$@,$(PRIVATE_DEX_LOCATION),$(PRIVATE_BUILT_ODEX)) +endif + $(align-package) + +else # LOCAL_MODULE_CLASS != APPS ifneq ($(LOCAL_PREBUILT_STRIP_COMMENTS),) $(built_module) : $(my_prebuilt_src_file) $(transform-prebuilt-to-target-strip-comments) @@ -171,7 +190,7 @@ ifneq ($(prebuilt_module_is_a_library),) endif endif endif -endif +endif # LOCAL_MODULE_CLASS != APPS ifeq ($(LOCAL_IS_HOST_MODULE)$(LOCAL_MODULE_CLASS),JAVA_LIBRARIES) # for target java libraries, the LOCAL_BUILT_MODULE is in a product-specific dir, @@ -192,3 +211,5 @@ $(built_module) : $(common_javalib_jar) endif # TARGET JAVA_LIBRARIES $(built_module) : $(LOCAL_ADDITIONAL_DEPENDENCIES) + +my_prebuilt_src_file := diff --git a/core/product_config.mk b/core/product_config.mk index e4b68cf..a2be30b 100644 --- a/core/product_config.mk +++ b/core/product_config.mk @@ -266,6 +266,17 @@ $(call clear-var-list, $(_product_var_list)) # Now we can assign to PRODUCT_RUNTIMES PRODUCT_RUNTIMES := $(product_runtimes) product_runtimes := + +PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PROPERTY_OVERRIDES += persist.sys.dalvik.vm.lib=$(DALVIK_VM_LIB) + +ifeq ($(words $(PRODUCT_RUNTIMES)),1) + # If we only have one runtime, we can strip classes.dex by default during dex_preopt + DEX_PREOPT_DEFAULT := true +else + # If we have more than one, we leave the classes.dex alone for post-boot analysis + DEX_PREOPT_DEFAULT := nostripping +endif + ############################################################################# # A list of module names of BOOTCLASSPATH (jar files) diff --git a/target/product/runtime_libart.mk b/target/product/runtime_libart.mk index 5fddc3f..1a7c925 100644 --- a/target/product/runtime_libart.mk +++ b/target/product/runtime_libart.mk @@ -28,7 +28,4 @@ ifeq ($(WITH_HOST_DALVIK),true) core-libart-hostdex endif -# We currently don't suport DEX_PREOPT for art -DEX_PREOPT_DEFAULT := nostripping - include $(SRC_TARGET_DIR)/product/runtime_common.mk diff --git a/target/product/runtime_libart_default.mk b/target/product/runtime_libart_default.mk index 575ca04..2d4c793 100644 --- a/target/product/runtime_libart_default.mk +++ b/target/product/runtime_libart_default.mk @@ -16,7 +16,6 @@ # Set ART as the default runtime environment -PRODUCT_PROPERTY_OVERRIDES += \ - persist.sys.dalvik.vm.lib=libart.so +DALVIK_VM_LIB := libart.so include $(SRC_TARGET_DIR)/product/runtime_libart.mk diff --git a/target/product/runtime_libdvm.mk b/target/product/runtime_libdvm.mk index 42e86ed..e7647b8 100644 --- a/target/product/runtime_libdvm.mk +++ b/target/product/runtime_libdvm.mk @@ -27,9 +27,4 @@ ifeq ($(WITH_HOST_DALVIK),true) core-hostdex endif -# If runtime_libart has disabled, do not override -ifndef DEX_PREOPT_DEFAULT -DEX_PREOPT_DEFAULT := true -endif - include $(SRC_TARGET_DIR)/product/runtime_common.mk diff --git a/target/product/runtime_libdvm_default.mk b/target/product/runtime_libdvm_default.mk index 3ae4130..b581ce5 100644 --- a/target/product/runtime_libdvm_default.mk +++ b/target/product/runtime_libdvm_default.mk @@ -16,7 +16,6 @@ # Set Dalvik as the default runtime environment -PRODUCT_PROPERTY_OVERRIDES += \ - persist.sys.dalvik.vm.lib=libdvm.so +DALVIK_VM_LIB := libdvm.so include $(SRC_TARGET_DIR)/product/runtime_libdvm.mk -- cgit v1.1