From a220e4596f1fc05173572977332688713edf0655 Mon Sep 17 00:00:00 2001 From: Cole Faust Date: Mon, 28 Aug 2023 16:00:59 -0700 Subject: [PATCH] Add dexpreopt files to ALL_MODULES.$(m).INSTALLED We're trying to make FULL_SYSTEMIMAGE_DEPS more accurate to remove the need for `m installclean`. The dexpreopt files did not show up in FULL_SYSTEMIMAGE_DEPS, because they were installed with a custom post-install command. The dexpreopt implementation is shared between soong/make, which means a lot of it happens at execution time for make. However, we have enough information to guess what files to install will be inside the zip file. Add an execution-time check that our guess is correct, and then add the guessed files to `ALL_MODULES.$(m).INSTALLED`. This also allows us to remove the post-install command, and just generate rules to install the files we want directly. Bug: 205632228 Test: full build on an internal product that uses dex-preopted make modules Change-Id: I57db58e4587e3e198ec650c6fb39a908e4ec6993 --- core/dex_preopt_odex_install.mk | 63 +++++++++++++++++++++++---------- 1 file changed, 45 insertions(+), 18 deletions(-) diff --git a/core/dex_preopt_odex_install.mk b/core/dex_preopt_odex_install.mk index 288f81fcb6..af6d92134f 100644 --- a/core/dex_preopt_odex_install.mk +++ b/core/dex_preopt_odex_install.mk @@ -468,8 +468,6 @@ ifdef LOCAL_DEX_PREOPT rsync --checksum $(PRIVATE_STAGING) $@ my_dexpreopt_script := $(intermediates)/dexpreopt.sh - my_dexpreopt_zip := $(intermediates)/dexpreopt.zip - DEXPREOPT.$(LOCAL_MODULE).POST_INSTALLED_DEXPREOPT_ZIP := $(my_dexpreopt_zip) .KATI_RESTAT: $(my_dexpreopt_script) $(my_dexpreopt_script): PRIVATE_MODULE := $(LOCAL_MODULE) $(my_dexpreopt_script): PRIVATE_GLOBAL_SOONG_CONFIG := $(DEX_PREOPT_SOONG_CONFIG_FOR_MAKE) @@ -499,38 +497,67 @@ ifdef LOCAL_DEX_PREOPT my_dexpreopt_deps += $(intermediates)/enforce_uses_libraries.status endif + # We need to add all the installed files to ALL_MODULES.$(my_register_name).INSTALLED in order + # for the build system to properly track installed files. (for sbom, installclean, etc) + # We install all the files in a zip file generated at execution time, which means we have to guess + # what's going to be in that zip file before it's created. We then check at executation time that + # our guess is correct. + # _system_other corresponds to OdexOnSystemOtherByName() in soong. + # The other paths correspond to dexpreoptCommand() + _dexlocation := $(patsubst $(PRODUCT_OUT)/%,%,$(LOCAL_INSTALLED_MODULE)) + _dexname := $(basename $(notdir $(_dexlocation))) + _system_other := $(strip $(if $(strip $(BOARD_USES_SYSTEM_OTHER_ODEX)), \ + $(if $(strip $(SANITIZE_LITE)),, \ + $(if $(filter $(_dexname),$(PRODUCT_DEXPREOPT_SPEED_APPS))$(filter $(_dexname),$(PRODUCT_SYSTEM_SERVER_APPS)),, \ + $(if $(strip $(foreach myfilter,$(SYSTEM_OTHER_ODEX_FILTER),$(filter system/$(myfilter),$(_dexlocation)))), \ + system_other/))))) + # _dexdir has a trailing / + _dexdir := $(_system_other)$(dir $(_dexlocation)) + my_dexpreopt_zip_contents := $(sort \ + $(foreach arch,$(my_dexpreopt_archs), \ + $(_dexdir)oat/$(arch)/$(_dexname).odex \ + $(_dexdir)oat/$(arch)/$(_dexname).vdex \ + $(if $(filter false,$(LOCAL_DEX_PREOPT_APP_IMAGE)),, \ + $(if $(my_process_profile)$(filter true,$(LOCAL_DEX_PREOPT_APP_IMAGE)), \ + $(_dexdir)oat/$(arch)/$(_dexname).art))) \ + $(if $(my_process_profile),$(_dexlocation).prof)) + _dexlocation := + _dexdir := + _dexname := + _system_other := + + my_dexpreopt_zip := $(intermediates)/dexpreopt.zip + DEXPREOPT.$(LOCAL_MODULE).POST_INSTALLED_DEXPREOPT_ZIP := $(my_dexpreopt_zip) $(my_dexpreopt_zip): PRIVATE_MODULE := $(LOCAL_MODULE) $(my_dexpreopt_zip): $(my_dexpreopt_deps) $(my_dexpreopt_zip): | $(DEXPREOPT_GEN_DEPS) $(my_dexpreopt_zip): .KATI_DEPFILE := $(my_dexpreopt_zip).d $(my_dexpreopt_zip): PRIVATE_DEX := $(my_dex_jar) $(my_dexpreopt_zip): PRIVATE_SCRIPT := $(my_dexpreopt_script) + $(my_dexpreopt_zip): PRIVATE_ZIP_CONTENTS := $(my_dexpreopt_zip_contents) $(my_dexpreopt_zip): $(my_dexpreopt_script) @echo "$(PRIVATE_MODULE) dexpreopt" + rm -f $@ + echo -n > $@.contents + $(foreach f,$(PRIVATE_ZIP_CONTENTS),echo "$(f)" >> $@.contents$(newline)) bash $(PRIVATE_SCRIPT) $(PRIVATE_DEX) $@ + if ! diff <(zipinfo -1 $@ | sort) $@.contents >&2; then \ + echo "Contents of $@ did not match what make was expecting." >&2 && exit 1; \ + fi - ifdef LOCAL_POST_INSTALL_CMD - # Add a shell command separator - LOCAL_POST_INSTALL_CMD += && - endif + $(foreach installed_dex_file,$(my_dexpreopt_zip_contents),\ + $(eval $(PRODUCT_OUT)/$(installed_dex_file): $(my_dexpreopt_zip) \ +$(newline) unzip -qoDD -d $(PRODUCT_OUT) $(my_dexpreopt_zip) $(installed_dex_file))) - LOCAL_POST_INSTALL_CMD += \ - for i in $$(zipinfo -1 $(my_dexpreopt_zip)); \ - do mkdir -p $(PRODUCT_OUT)/$$(dirname $$i); \ - done && \ - ( unzip -qoDD -d $(PRODUCT_OUT) $(my_dexpreopt_zip) 2>&1 | grep -v "zipfile is empty"; exit $${PIPESTATUS[0]} ) || \ - ( code=$$?; if [ $$code -ne 0 -a $$code -ne 1 ]; then exit $$code; fi ) - - $(LOCAL_INSTALLED_MODULE): PRIVATE_POST_INSTALL_CMD := $(LOCAL_POST_INSTALL_CMD) - $(LOCAL_INSTALLED_MODULE): $(my_dexpreopt_zip) - - $(my_all_targets): $(my_dexpreopt_zip) + ALL_MODULES.$(my_register_name).INSTALLED += $(addprefix $(PRODUCT_OUT)/,$(my_dexpreopt_zip_contents)) my_dexpreopt_config := + my_dexpreopt_config_for_postprocessing := + my_dexpreopt_jar_copy := my_dexpreopt_product_packages := my_dexpreopt_script := my_dexpreopt_zip := - my_dexpreopt_config_for_postprocessing := + my_dexpreopt_zip_contents := endif # LOCAL_DEX_PREOPT endif # my_create_dexpreopt_config