summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/base_rules.mk9
-rw-r--r--core/clear_vars.mk1
-rw-r--r--core/config.mk2
-rw-r--r--core/dex_preopt.mk97
-rw-r--r--core/dex_preopt_libart.mk96
-rw-r--r--core/dex_preopt_libdvm.mk76
-rw-r--r--core/dex_preopt_odex_install.mk70
-rw-r--r--core/java.mk5
-rw-r--r--core/java_library.mk39
-rw-r--r--core/package.mk35
-rw-r--r--core/prebuilt.mk37
-rw-r--r--core/product_config.mk11
-rw-r--r--target/product/runtime_libart.mk3
-rw-r--r--target/product/runtime_libart_default.mk3
-rw-r--r--target/product/runtime_libdvm.mk5
-rw-r--r--target/product/runtime_libdvm_default.mk3
16 files changed, 353 insertions, 139 deletions
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