From a61acf62c95adba6b6aeea6fdb4d24fe8ba5fb1a Mon Sep 17 00:00:00 2001 From: Mathieu Chartier Date: Wed, 28 Jun 2017 18:23:37 -0700 Subject: [PATCH] Add support for using profiles for boot images Added two product flags: PRODUCT_USE_PROFILE_FOR_BOOT_IMAGE PRODUCT_DEX_PREOPT_BOOT_IMAGE_PROFILE_LOCATION If PRODUCT_USE_PROFILE_FOR_BOOT_IMAGE is enabled (default false), a art profile is used to create the preopted boot image. This profile is also passed to the runtime in AndroidRuntime.cpp. The profile is created from the PRODUCT_DEX_PREOPT_BOOT_IMAGE_PROFILE_LOCATION variable that defaults to "frameworks/base/boot-image-profile.txt". (cherry picked from commit 77226f63339895b886643b687bcb5b62b9be6f58) Bug: 37966211 Test: make and flash Merged-In: Ic89cc4c0c4d39aa9726843f5d9c2fb1dedeb7885 Change-Id: Ic89cc4c0c4d39aa9726843f5d9c2fb1dedeb7885 --- core/dex_preopt_libart.mk | 36 ++++++++++++++++++++++++++++++++++ core/dex_preopt_libart_boot.mk | 17 ++++++++++++---- core/product.mk | 2 ++ core/product_config.mk | 6 ++++++ 4 files changed, 57 insertions(+), 4 deletions(-) diff --git a/core/dex_preopt_libart.mk b/core/dex_preopt_libart.mk index 9db5dbfb4..47fdba610 100644 --- a/core/dex_preopt_libart.mk +++ b/core/dex_preopt_libart.mk @@ -88,6 +88,42 @@ LIBART_TARGET_BOOT_DEX_FILES := $(foreach jar,$(LIBART_TARGET_BOOT_JARS),$(call LIBART_TARGET_BOOT_ART_EXTRA_FILES := $(foreach jar,$(wordlist 2,999,$(LIBART_TARGET_BOOT_JARS)),boot-$(jar).art boot-$(jar).oat boot-$(jar).vdex) LIBART_TARGET_BOOT_ART_EXTRA_FILES += boot.oat boot.vdex +# If we use a boot image profile. +my_use_profile_for_boot_image := $(PRODUCT_USE_PROFILE_FOR_BOOT_IMAGE) +ifeq (,$(my_use_profile_for_boot_image)) +# If not set, use the default. +my_use_profile_for_boot_image := false +endif + +ifeq (true,$(my_use_profile_for_boot_image)) + +# Location of text based profile for the boot image. +my_boot_image_profile_location := $(PRODUCT_DEX_PREOPT_BOOT_IMAGE_PROFILE_LOCATION) +ifeq (,$(my_boot_image_profile_location)) +# If not set, use the default. +my_boot_image_profile_location := frameworks/base/boot-image-profile.txt +endif + +# Code to create the boot image profile, not in dex_preopt_libart_boot.mk since the profile is the same for all archs. +my_out_boot_image_profile_location := $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/boot.prof +$(my_out_boot_image_profile_location): PRIVATE_PROFILE_INPUT_LOCATION := $(my_boot_image_profile_location) +$(my_out_boot_image_profile_location): $(PROFMAN) $(LIBART_TARGET_BOOT_DEX_FILES) $(my_boot_image_profile_location) + @echo "target profman: $@" + @mkdir -p $(dir $@) + ANDROID_LOG_TAGS="*:e" $(PROFMAN) \ + --create-profile-from=$(PRIVATE_PROFILE_INPUT_LOCATION) \ + $(addprefix --apk=,$(LIBART_TARGET_BOOT_DEX_FILES)) \ + $(addprefix --dex-location=,$(LIBART_TARGET_BOOT_DEX_LOCATIONS)) \ + --reference-profile-file=$@ + +# We want to install the profile even if we are not using preopt since it is required to generate +# the image on the device. +my_installed_profile := $(TARGET_OUT)/etc/boot-image.prof +$(eval $(call copy-one-file,$(my_out_boot_image_profile_location),$(my_installed_profile))) +ALL_DEFAULT_INSTALLED_MODULES += $(my_installed_profile) + +endif + my_2nd_arch_prefix := include $(BUILD_SYSTEM)/dex_preopt_libart_boot.mk diff --git a/core/dex_preopt_libart_boot.mk b/core/dex_preopt_libart_boot.mk index 860a66adb..6e49f64ac 100644 --- a/core/dex_preopt_libart_boot.mk +++ b/core/dex_preopt_libart_boot.mk @@ -50,18 +50,27 @@ $($(my_2nd_arch_prefix)LIBART_TARGET_BOOT_ART_EXTRA_INSTALLED_FILES) : $($(my_2n @mkdir -p $(dir $@) $(hide) $(ACP) -fp $(dir $<)$(notdir $@) $@ +ifeq (,$(my_out_boot_image_profile_location)) +my_boot_image_flags := $(COMPILED_CLASSES_FLAGS) +my_boot_image_flags += --image-classes=$(PRELOADED_CLASSES) +else +my_boot_image_flags := --compiler-filter=speed-profile +my_boot_image_flags += --profile-file=$(my_out_boot_image_profile_location) +endif + +$($(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_BUILT_IMAGE_FILENAME): PRIVATE_BOOT_IMAGE_FLAGS := $(my_boot_image_flags) $($(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) $(PRELOADED_CLASSES) $(COMPILED_CLASSES) $(DEX2OAT_DEPENDENCY) +$($(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_BUILT_IMAGE_FILENAME) : $(LIBART_TARGET_BOOT_DEX_FILES) $(PRELOADED_CLASSES) $(COMPILED_CLASSES) $(DEX2OAT_DEPENDENCY) $(my_out_profile_location) @echo "target dex2oat: $@" @mkdir -p $(dir $@) @mkdir -p $(dir $($(PRIVATE_2ND_ARCH_VAR_PREFIX)LIBART_TARGET_BOOT_OAT_UNSTRIPPED)) @rm -f $(dir $@)/*.art $(dir $@)/*.oat @rm -f $(dir $($(PRIVATE_2ND_ARCH_VAR_PREFIX)LIBART_TARGET_BOOT_OAT_UNSTRIPPED))/*.art @rm -f $(dir $($(PRIVATE_2ND_ARCH_VAR_PREFIX)LIBART_TARGET_BOOT_OAT_UNSTRIPPED))/*.oat - $(hide) ANDROID_LOG_TAGS="*:e" $(DEX2OAT) --runtime-arg -Xms$(DEX2OAT_IMAGE_XMS) \ + $(DEX2OAT) --runtime-arg -Xms$(DEX2OAT_IMAGE_XMS) \ --runtime-arg -Xmx$(DEX2OAT_IMAGE_XMX) \ - --image-classes=$(PRELOADED_CLASSES) \ + $(PRIVATE_BOOT_IMAGE_FLAGS) \ $(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) \ @@ -75,4 +84,4 @@ $($(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_BUILT_IMAGE_FILENAME) : $(LIBART_TARGE --runtime-arg -Xnorelocate --compile-pic \ --no-generate-debug-info --generate-build-id \ --multi-image --no-inline-from=core-oj.jar \ - $(PRODUCT_DEX_PREOPT_BOOT_FLAGS) $(GLOBAL_DEXPREOPT_FLAGS) $(COMPILED_CLASSES_FLAGS) $(ART_BOOT_IMAGE_EXTRA_ARGS) + $(PRODUCT_DEX_PREOPT_BOOT_FLAGS) $(GLOBAL_DEXPREOPT_FLAGS) $(ART_BOOT_IMAGE_EXTRA_ARGS) diff --git a/core/product.mk b/core/product.mk index 590148f0d..6722526c8 100644 --- a/core/product.mk +++ b/core/product.mk @@ -125,6 +125,8 @@ _product_var_list := \ PRODUCT_DEX_PREOPT_DEFAULT_FLAGS \ PRODUCT_DEX_PREOPT_BOOT_FLAGS \ PRODUCT_DEX_PREOPT_PROFILE_DIR \ + PRODUCT_DEX_PREOPT_BOOT_IMAGE_PROFILE_LOCATION \ + PRODUCT_USE_PROFILE_FOR_BOOT_IMAGE \ PRODUCT_SYSTEM_SERVER_COMPILER_FILTER \ PRODUCT_SANITIZER_MODULE_CONFIGS \ PRODUCT_SYSTEM_BASE_FS_PATH \ diff --git a/core/product_config.mk b/core/product_config.mk index 4c3824a69..6812b05d4 100644 --- a/core/product_config.mk +++ b/core/product_config.mk @@ -383,6 +383,12 @@ PRODUCT_DEX_PREOPT_BOOT_FLAGS := \ PRODUCT_DEX_PREOPT_PROFILE_DIR := \ $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEX_PREOPT_PROFILE_DIR)) +# Boot image options. +PRODUCT_USE_PROFILE_FOR_BOOT_IMAGE := \ + $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_USE_PROFILE_FOR_BOOT_IMAGE)) +PRODUCT_DEX_PREOPT_BOOT_IMAGE_PROFILE_LOCATION := \ + $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEX_PREOPT_BOOT_IMAGE_PROFILE_LOCATION)) + PRODUCT_SYSTEM_SERVER_COMPILER_FILTER := \ $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_SERVER_COMPILER_FILTER)) PRODUCT_SYSTEM_SERVER_DEBUG_INFO := \