From 3972a47e9f70806795e5545d4c27cbc66fc37a4d Mon Sep 17 00:00:00 2001 From: Nicolas Geoffray Date: Tue, 9 Jan 2018 11:46:30 +0000 Subject: [PATCH] Tighter control of stripping in dex_preopt_odex_install. - Move logic to uncompress dexs in an APK in dex_preopt_odex_install.mk and definitions.mk. - Explicitly mark nostripping cases where dexpreopt will not embed the dex file in the APK. bug: 63920015 Test: m Test: verify priv-apps dexs are uncompressed and unstripped Test: Verify a non priv-app APK with uncompressed dex doesn't get stripped. Change-Id: I624a03e3d965cebc0cae43fd6f7a6260178e6b8a --- core/definitions.mk | 12 ++++++---- core/dex_preopt_odex_install.mk | 39 ++++++++++++++++++++++++++++----- core/java_library.mk | 4 ++-- core/package_internal.mk | 21 +++++++++--------- core/prebuilt_internal.mk | 10 ++------- 5 files changed, 55 insertions(+), 31 deletions(-) diff --git a/core/definitions.mk b/core/definitions.mk index a20bf44a95..9727275964 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -2781,18 +2781,22 @@ endef # $(3): LOCAL_DEX_PREOPT, if nostripping then leave classes*.dex define dexpreopt-copy-jar $(2): $(1) - @echo $(if $(filter nostripping,$(3)),"Copy: $$@","Copy without dex: $$@") + @echo "Copy: $$@" $$(copy-file-to-target) $(if $(filter nostripping,$(3)),,$$(call dexpreopt-remove-classes.dex,$$@)) endef -# $(1): the .jar or .apk to remove classes.dex +# $(1): the .jar or .apk to remove classes.dex. Note that if all dex files +# are uncompressed in the archive, then dexopt will not do a copy of the dex +# files and we should not strip. define dexpreopt-remove-classes.dex -$(hide) zip --quiet --delete $(1) classes.dex; \ +$(hide) if (zipinfo $1 '*.dex' 2>/dev/null | grep -v ' stor ' >/dev/null) ; then \ +zip --quiet --delete $(1) classes.dex; \ dex_index=2; \ while zip --quiet --delete $(1) classes$${dex_index}.dex > /dev/null; do \ let dex_index=dex_index+1; \ -done +done \ +fi endef ########################################################### diff --git a/core/dex_preopt_odex_install.mk b/core/dex_preopt_odex_install.mk index 93824c3424..e3372799ef 100644 --- a/core/dex_preopt_odex_install.mk +++ b/core/dex_preopt_odex_install.mk @@ -1,6 +1,20 @@ # 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 +# Output variables: LOCAL_DEX_PREOPT, LOCAL_UNCOMPRESS_DEX, built_odex, +# dexpreopt_boot_jar_module + +# We explicitly uncompress APKs of privileged apps, and used by +# privileged apps +LOCAL_UNCOMPRESS_DEX := false +ifneq (true,$(DONT_UNCOMPRESS_PRIV_APPS_DEXS)) +ifeq (true,$(LOCAL_PRIVILEGED_MODULE)) + LOCAL_UNCOMPRESS_DEX := true +else + ifneq (,$(filter $(PRODUCT_LOADED_BY_PRIVILEGED_MODULES), $(LOCAL_MODULE))) + LOCAL_UNCOMPRESS_DEX := true + endif # PRODUCT_LOADED_BY_PRIVILEGED_MODULES +endif # LOCAL_PRIVILEGED_MODULE +endif # DONT_UNCOMPRESS_PRIV_APPS_DEXS # Setting LOCAL_DEX_PREOPT based on WITH_DEXPREOPT, LOCAL_DEX_PREOPT, etc LOCAL_DEX_PREOPT := $(strip $(LOCAL_DEX_PREOPT)) @@ -46,14 +60,27 @@ endif endif endif -# if installing into system, and odex are being installed into system_other, don't strip -ifeq ($(BOARD_USES_SYSTEM_OTHER_ODEX),true) ifeq ($(LOCAL_DEX_PREOPT),true) + +# Don't strip with dexes we explicitly uncompress (dexopt will not store the dex code). +ifeq ($(LOCAL_UNCOMPRESS_DEX),true) +LOCAL_DEX_PREOPT := nostripping +endif # LOCAL_UNCOMPRESS_DEX + +# system_other isn't there for an OTA, so don't strip +# if module is on system, and odex is on system_other. +ifeq ($(BOARD_USES_SYSTEM_OTHER_ODEX),true) ifneq ($(call install-on-system-other, $(my_module_path)),) LOCAL_DEX_PREOPT := nostripping -endif -endif -endif +endif # install-on-system-other +endif # BOARD_USES_SYSTEM_OTHER_ODEX + +# We also don't strip if all dexs are uncompressed (dexopt will not store the dex code), +# but that requires to inspect the source file, which is too early at this point (as we +# don't know if the source file will actually be used). +# See dexpreopt-remove-classes.dex. + +endif # LOCAL_DEX_PREOPT built_odex := built_vdex := diff --git a/core/java_library.mk b/core/java_library.mk index 8cf0074895..1b914f5ba3 100644 --- a/core/java_library.mk +++ b/core/java_library.mk @@ -72,10 +72,10 @@ $(common_javalib.jar) : $(built_dex) $(java_resource_sources) | $(ZIPTIME) $(ZIP $(call add-dex-to-package-arg,$@.tmp) $(hide) $(ZIPTIME) $@.tmp $(call commit-change-for-toc,$@) -ifneq (,$(filter $(PRODUCT_LOADED_BY_PRIVILEGED_MODULES), $(LOCAL_MODULE))) +ifeq (true, $(LOCAL_UNCOMPRESS_DEX)) $(uncompress-dexs) $(align-package) -endif # PRODUCT_LOADED_BY_PRIVILEGED_MODULES +endif # LOCAL_UNCOMPRESS_DEX .KATI_RESTAT: $(common_javalib.jar) diff --git a/core/package_internal.mk b/core/package_internal.mk index e153a8a110..cdc4958b1c 100644 --- a/core/package_internal.mk +++ b/core/package_internal.mk @@ -580,7 +580,7 @@ $(LOCAL_BUILT_MODULE) : $(my_res_package) $(AAPT2) | $(ACP) else $(LOCAL_BUILT_MODULE): PRIVATE_RESOURCE_LIST := $(all_res_assets) $(LOCAL_BUILT_MODULE) : $(all_res_assets) $(full_android_manifest) $(AAPT) $(ZIPALIGN) -endif +endif # LOCAL_USE_AAPT2 ifdef LOCAL_COMPRESSED_MODULE $(LOCAL_BUILT_MODULE) : $(MINIGZIP) endif @@ -605,24 +605,19 @@ ifdef LOCAL_USE_AAPT2 $(call add-jar-resources-to-package,$@,$(PRIVATE_FULL_CLASSES_JAR),$(PRIVATE_RESOURCE_INTERMEDIATES_DIR)) endif endif # full_classes_jar +ifeq (true, $(LOCAL_UNCOMPRESS_DEX)) + @# No need to align, sign-package below will do it. + $(uncompress-dexs) +endif ifdef LOCAL_DEX_PREOPT ifneq ($(BUILD_PLATFORM_ZIP),) @# Keep a copy of apk with classes.dex unstripped $(hide) cp -f $@ $(dir $@)package.dex.apk endif # BUILD_PLATFORM_ZIP -ifneq (true,$(DONT_UNCOMPRESS_PRIV_APPS_DEXS)) -ifeq (true,$(LOCAL_PRIVILEGED_MODULE)) - @# No need to align, sign-package below will do it. - $(uncompress-dexs) -endif # LOCAL_PRIVILEGED_MODULE -endif # DONT_UNCOMPRESS_PRIV_APPS_DEXS ifneq (nostripping,$(LOCAL_DEX_PREOPT)) $(call dexpreopt-remove-classes.dex,$@) endif -endif -ifneq (,$(filter $(PRODUCT_LOADED_BY_PRIVILEGED_MODULES), $(LOCAL_MODULE))) - $(uncompress-dexs) -endif # PRODUCT_LOADED_BY_PRIVILEGED_MODULES +endif # LOCAL_DEX_PREOPT $(sign-package) ifdef LOCAL_COMPRESSED_MODULE $(compress-package) @@ -646,6 +641,10 @@ $(built_odex): PRIVATE_DEX_FILE := $(built_dex) $(built_odex) : $(dir $(LOCAL_BUILT_MODULE))% : $(built_dex) $(hide) mkdir -p $(dir $@) && rm -f $@ $(add-dex-to-package) +ifeq (true, $(LOCAL_UNCOMPRESS_DEX)) + $(uncompress-dexs) + $(align-package) +endif $(hide) mv $@ $@.input $(call dexpreopt-one-file,$@.input,$@) $(hide) rm $@.input diff --git a/core/prebuilt_internal.mk b/core/prebuilt_internal.mk index d934338818..c7caf12bb3 100644 --- a/core/prebuilt_internal.mk +++ b/core/prebuilt_internal.mk @@ -390,15 +390,9 @@ endif $(built_module) : $(my_prebuilt_src_file) | $(ZIPALIGN) $(SIGNAPK_JAR) $(transform-prebuilt-to-target) $(uncompress-shared-libs) -ifneq (true,$(DONT_UNCOMPRESS_PRIV_APPS_DEXS)) -ifeq (true,$(LOCAL_PRIVILEGED_MODULE)) +ifeq (true, $(LOCAL_UNCOMPRESS_DEX)) $(uncompress-dexs) -else - ifneq (,$(filter $(PRODUCT_LOADED_BY_PRIVILEGED_MODULES), $(LOCAL_MODULE))) - $(uncompress-dexs) - endif # PRODUCT_LOADED_BY_PRIVILEGED_MODULES -endif # LOCAL_PRIVILEGED_MODULE -endif # DONT_UNCOMPRESS_PRIV_APPS_DEXS +endif # LOCAL_UNCOMPRESS_DEX ifdef LOCAL_DEX_PREOPT ifneq ($(BUILD_PLATFORM_ZIP),) @# Keep a copy of apk with classes.dex unstripped