From bbcdc07d126342b7cf509034f8f247029fffbc49 Mon Sep 17 00:00:00 2001 From: Narayan Kamath Date: Tue, 22 Aug 2017 15:47:08 +0100 Subject: [PATCH] dex_preopt: Use the unstripped jar file for generating profiles. We were previously using LOCAL_BUILT_MODULE, which wouldn't work in the case that "nostripping" wasn't specified (i.e when we stripped). The issue is that the built module has its classes.dex entry stripped, which means that profman can't do anything meaningful with it. In this change, we use the right set of files for JAVA_LIBRARIES as well as prebuilt PACKAGES. Fixing apps built from source is a larger task and has been left for a future change. Depending on ART changes, we might need to disable stripping for all apps and/or align userdebug and user builds with each other. This will be tackled separately. Test: make Bug: 64896089 Change-Id: I4fd256d187b66763f354cc6001953469c2cd8fbb --- core/dex_preopt_odex_install.mk | 8 ++++++-- core/java.mk | 13 +++++++++++++ core/java_library.mk | 1 + core/package_internal.mk | 2 ++ core/prebuilt_internal.mk | 2 ++ 5 files changed, 24 insertions(+), 2 deletions(-) diff --git a/core/dex_preopt_odex_install.mk b/core/dex_preopt_odex_install.mk index 136def470a..032c5d350b 100644 --- a/core/dex_preopt_odex_install.mk +++ b/core/dex_preopt_odex_install.mk @@ -142,16 +142,19 @@ ifeq (true,$(LOCAL_DEX_PREOPT_GENERATE_PROFILE)) ifndef LOCAL_DEX_PREOPT_PROFILE_CLASS_LISTING $(call pretty-error,Must have specified class listing (LOCAL_DEX_PREOPT_PROFILE_CLASS_LISTING)) endif +ifeq (,$(dex_preopt_profile_src_file)) +$(call pretty-error, Internal error: dex_preopt_profile_src_file must be set) +endif my_built_profile := $(dir $(LOCAL_BUILT_MODULE))/profile.prof my_dex_location := $(patsubst $(PRODUCT_OUT)%,%,$(LOCAL_INSTALLED_MODULE)) $(built_odex): $(my_built_profile) $(built_odex): PRIVATE_PROFILE_PREOPT_FLAGS := --profile-file=$(my_built_profile) -$(my_built_profile): PRIVATE_BUILT_MODULE := $(LOCAL_BUILT_MODULE) +$(my_built_profile): PRIVATE_BUILT_MODULE := $(dex_preopt_profile_src_file) $(my_built_profile): PRIVATE_DEX_LOCATION := $(my_dex_location) $(my_built_profile): PRIVATE_SOURCE_CLASSES := $(LOCAL_DEX_PREOPT_PROFILE_CLASS_LISTING) $(my_built_profile): $(LOCAL_DEX_PREOPT_PROFILE_CLASS_LISTING) $(my_built_profile): $(PROFMAN) -$(my_built_profile): $(LOCAL_BUILT_MODULE) +$(my_built_profile): $(dex_preopt_profile_src_file) $(my_built_profile): $(hide) mkdir -p $(dir $@) ANDROID_LOG_TAGS="*:e" $(PROFMAN) \ @@ -159,6 +162,7 @@ $(my_built_profile): --apk=$(PRIVATE_BUILT_MODULE) \ --dex-location=$(PRIVATE_DEX_LOCATION) \ --reference-profile-file=$@ +dex_preopt_profile_src_file:= my_installed_profile := $(LOCAL_INSTALLED_MODULE).prof $(eval $(call copy-one-file,$(my_built_profile),$(my_installed_profile))) build_installed_profile:=$(my_built_profile):$(my_installed_profile) diff --git a/core/java.mk b/core/java.mk index 8fde7c2c30..3601292fa5 100644 --- a/core/java.mk +++ b/core/java.mk @@ -381,6 +381,19 @@ include $(BUILD_SYSTEM)/java_common.mk $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_HAS_RS_SOURCES := $(if $(renderscript_sources),true) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_RS_SOURCE_INTERMEDIATES_DIR := $(intermediates.COMMON)/renderscript +# Set the profile source so that the odex / profile code included from java.mk +# can find it. +# +# TODO: b/64896089, this is broken when called from package_internal.mk, since the file +# we preopt from is a temporary file. This will be addressed in a follow up, possibly +# by disabling stripping for profile guided preopt (which may be desirable for other +# reasons anyway). +# +# Note that we set this only when called from package_internal.mk and not in other cases. +ifneq (,$(called_from_package_internal) +dex_preopt_profile_src_file := $(LOCAL_BUILT_MODULE) +endif + ####################################### # defines built_odex along with rule to install odex include $(BUILD_SYSTEM)/dex_preopt_odex_install.mk diff --git a/core/java_library.mk b/core/java_library.mk index 0aad84c57f..84f4419a69 100644 --- a/core/java_library.mk +++ b/core/java_library.mk @@ -44,6 +44,7 @@ endif # java libraries produce javalib.jar, so we will copy classes.jar there too. intermediates.COMMON := $(call local-intermediates-dir,COMMON) common_javalib.jar := $(intermediates.COMMON)/javalib.jar +dex_preopt_profile_src_file := $(common_javalib.jar) LOCAL_INTERMEDIATE_TARGETS += $(common_javalib.jar) ifeq ($(LOCAL_PROGUARD_ENABLED),disabled) diff --git a/core/package_internal.mk b/core/package_internal.mk index 2eb806c38e..87a15d23fe 100644 --- a/core/package_internal.mk +++ b/core/package_internal.mk @@ -327,9 +327,11 @@ endif include $(BUILD_SYSTEM)/android_manifest.mk +called_from_package_internal := true ################################# include $(BUILD_SYSTEM)/java.mk ################################# +called_from_package_internal := LOCAL_SDK_RES_VERSION:=$(strip $(LOCAL_SDK_RES_VERSION)) ifeq ($(LOCAL_SDK_RES_VERSION),) diff --git a/core/prebuilt_internal.mk b/core/prebuilt_internal.mk index 48593a5b47..a9c0bc2bfe 100644 --- a/core/prebuilt_internal.mk +++ b/core/prebuilt_internal.mk @@ -283,6 +283,8 @@ my_extracted_apk := my_extract_apk := endif +dex_preopt_profile_src_file := $(my_prebuilt_src_file) + rs_compatibility_jni_libs := include $(BUILD_SYSTEM)/install_jni_libs.mk