Home | History | Annotate | Download | only in core
      1 # dexpreopt_odex_install.mk is used to define odex creation rules for JARs and APKs
      2 # This file depends on variables set in base_rules.mk
      3 # Output variables: LOCAL_DEX_PREOPT, LOCAL_UNCOMPRESS_DEX
      4 
      5 ifeq (true,$(LOCAL_USE_EMBEDDED_DEX))
      6   LOCAL_UNCOMPRESS_DEX := true
      7 else
      8   LOCAL_UNCOMPRESS_DEX :=
      9 endif
     10 
     11 # We explicitly uncompress APKs of privileged apps, and used by
     12 # privileged apps
     13 ifneq (true,$(DONT_UNCOMPRESS_PRIV_APPS_DEXS))
     14   ifeq (true,$(LOCAL_PRIVILEGED_MODULE))
     15     LOCAL_UNCOMPRESS_DEX := true
     16   endif
     17 
     18   ifneq (,$(filter $(PRODUCT_LOADED_BY_PRIVILEGED_MODULES), $(LOCAL_MODULE)))
     19     LOCAL_UNCOMPRESS_DEX := true
     20   endif
     21 endif  # DONT_UNCOMPRESS_PRIV_APPS_DEXS
     22 
     23 # Setting LOCAL_DEX_PREOPT based on WITH_DEXPREOPT, LOCAL_DEX_PREOPT, etc
     24 LOCAL_DEX_PREOPT := $(strip $(LOCAL_DEX_PREOPT))
     25 ifndef LOCAL_DEX_PREOPT # LOCAL_DEX_PREOPT undefined
     26   LOCAL_DEX_PREOPT := $(DEX_PREOPT_DEFAULT)
     27 endif
     28 
     29 ifeq (false,$(LOCAL_DEX_PREOPT))
     30   LOCAL_DEX_PREOPT :=
     31 endif
     32 
     33 # Only enable preopt for non tests.
     34 ifneq (,$(filter $(LOCAL_MODULE_TAGS),tests))
     35   LOCAL_DEX_PREOPT :=
     36 endif
     37 
     38 # If we have product-specific config for this module?
     39 ifneq (,$(filter $(LOCAL_MODULE),$(DEXPREOPT_DISABLED_MODULES)))
     40   LOCAL_DEX_PREOPT :=
     41 endif
     42 
     43 # Disable preopt for TARGET_BUILD_APPS
     44 ifneq (,$(TARGET_BUILD_APPS))
     45   LOCAL_DEX_PREOPT :=
     46 endif
     47 
     48 # Disable preopt if not WITH_DEXPREOPT
     49 ifneq (true,$(WITH_DEXPREOPT))
     50   LOCAL_DEX_PREOPT :=
     51 endif
     52 
     53 ifdef LOCAL_UNINSTALLABLE_MODULE
     54   LOCAL_DEX_PREOPT :=
     55 endif
     56 
     57 ifeq (,$(strip $(built_dex)$(my_prebuilt_src_file)$(LOCAL_SOONG_DEX_JAR))) # contains no java code
     58   LOCAL_DEX_PREOPT :=
     59 endif
     60 
     61 # if WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY=true and module is not in boot class path skip
     62 # Also preopt system server jars since selinux prevents system server from loading anything from
     63 # /data. If we don't do this they will need to be extracted which is not favorable for RAM usage
     64 # or performance. If my_preopt_for_extracted_apk is true, we ignore the only preopt boot image
     65 # options.
     66 ifneq (true,$(my_preopt_for_extracted_apk))
     67   ifeq (true,$(WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY))
     68     ifeq ($(filter $(PRODUCT_SYSTEM_SERVER_JARS) $(DEXPREOPT_BOOT_JARS_MODULES),$(LOCAL_MODULE)),)
     69       LOCAL_DEX_PREOPT :=
     70     endif
     71   endif
     72 endif
     73 
     74 my_process_profile :=
     75 my_profile_is_text_listing :=
     76 
     77 ifeq (false,$(WITH_DEX_PREOPT_GENERATE_PROFILE))
     78   LOCAL_DEX_PREOPT_GENERATE_PROFILE := false
     79 endif
     80 
     81 ifndef LOCAL_DEX_PREOPT_GENERATE_PROFILE
     82   # If LOCAL_DEX_PREOPT_GENERATE_PROFILE is not defined, default it based on the existence of the
     83   # profile class listing. TODO: Use product specific directory here.
     84   my_classes_directory := $(PRODUCT_DEX_PREOPT_PROFILE_DIR)
     85   LOCAL_DEX_PREOPT_PROFILE := $(my_classes_directory)/$(LOCAL_MODULE).prof
     86 
     87   ifneq (,$(wildcard $(LOCAL_DEX_PREOPT_PROFILE)))
     88     my_process_profile := true
     89     my_profile_is_text_listing :=
     90   endif
     91 else
     92   my_process_profile := $(LOCAL_DEX_PREOPT_GENERATE_PROFILE)
     93   my_profile_is_text_listing := true
     94   LOCAL_DEX_PREOPT_PROFILE := $(LOCAL_DEX_PREOPT_PROFILE_CLASS_LISTING)
     95 endif
     96 
     97 ifeq (true,$(my_process_profile))
     98   ifndef LOCAL_DEX_PREOPT_PROFILE
     99     $(call pretty-error,Must have specified class listing (LOCAL_DEX_PREOPT_PROFILE))
    100   endif
    101   ifeq (,$(dex_preopt_profile_src_file))
    102     $(call pretty-error, Internal error: dex_preopt_profile_src_file must be set)
    103   endif
    104 endif
    105 
    106 # If LOCAL_ENFORCE_USES_LIBRARIES is not set, default to true if either of LOCAL_USES_LIBRARIES or
    107 # LOCAL_OPTIONAL_USES_LIBRARIES are specified.
    108 ifeq (,$(LOCAL_ENFORCE_USES_LIBRARIES))
    109   # Will change the default to true unconditionally in the future.
    110   ifneq (,$(LOCAL_OPTIONAL_USES_LIBRARIES))
    111     LOCAL_ENFORCE_USES_LIBRARIES := true
    112   endif
    113   ifneq (,$(LOCAL_USES_LIBRARIES))
    114     LOCAL_ENFORCE_USES_LIBRARIES := true
    115   endif
    116 endif
    117 
    118 my_dexpreopt_archs :=
    119 my_dexpreopt_images :=
    120 my_dexpreopt_infix := boot
    121 ifeq (true, $(DEXPREOPT_USE_APEX_IMAGE))
    122   my_dexpreopt_infix := apex
    123 endif
    124 
    125 ifdef LOCAL_DEX_PREOPT
    126   ifeq (,$(filter PRESIGNED,$(LOCAL_CERTIFICATE)))
    127     # Store uncompressed dex files preopted in /system
    128     ifeq ($(BOARD_USES_SYSTEM_OTHER_ODEX),true)
    129       ifeq ($(call install-on-system-other, $(my_module_path)),)
    130         LOCAL_UNCOMPRESS_DEX := true
    131       endif  # install-on-system-other
    132     else  # BOARD_USES_SYSTEM_OTHER_ODEX
    133       LOCAL_UNCOMPRESS_DEX := true
    134     endif
    135   endif
    136 
    137   ifeq ($(LOCAL_MODULE_CLASS),JAVA_LIBRARIES)
    138     my_module_multilib := $(LOCAL_MULTILIB)
    139     # If the module is not an SDK library and it's a system server jar, only preopt the primary arch.
    140     ifeq (,$(filter $(JAVA_SDK_LIBRARIES),$(LOCAL_MODULE)))
    141       # For a Java library, by default we build odex for both 1st arch and 2nd arch.
    142       # But it can be overridden with "LOCAL_MULTILIB := first".
    143       ifneq (,$(filter $(PRODUCT_SYSTEM_SERVER_JARS),$(LOCAL_MODULE)))
    144         # For system server jars, we build for only "first".
    145         my_module_multilib := first
    146       endif
    147     endif
    148 
    149     # Only preopt primary arch for translated arch since there is only an image there.
    150     ifeq ($(TARGET_TRANSLATE_2ND_ARCH),true)
    151       my_module_multilib := first
    152     endif
    153 
    154     # #################################################
    155     # Odex for the 1st arch
    156     my_dexpreopt_archs += $(TARGET_ARCH)
    157     my_dexpreopt_images += $(DEXPREOPT_IMAGE_$(my_dexpreopt_infix)_$(TARGET_ARCH))
    158     # Odex for the 2nd arch
    159     ifdef TARGET_2ND_ARCH
    160       ifneq ($(TARGET_TRANSLATE_2ND_ARCH),true)
    161         ifneq (first,$(my_module_multilib))
    162           my_dexpreopt_archs += $(TARGET_2ND_ARCH)
    163           my_dexpreopt_images += $(DEXPREOPT_IMAGE_$(my_dexpreopt_infix)_$(TARGET_2ND_ARCH))
    164         endif  # my_module_multilib is not first.
    165       endif  # TARGET_TRANSLATE_2ND_ARCH not true
    166     endif  # TARGET_2ND_ARCH
    167     # #################################################
    168   else  # must be APPS
    169     # The preferred arch
    170     # Save the module multilib since setup_one_odex modifies it.
    171     my_2nd_arch_prefix := $(LOCAL_2ND_ARCH_VAR_PREFIX)
    172     my_dexpreopt_archs += $(TARGET_$(my_2nd_arch_prefix)ARCH)
    173     my_dexpreopt_images += \
    174         $(DEXPREOPT_IMAGE_$(my_dexpreopt_infix)_$(TARGET_$(my_2nd_arch_prefix)ARCH))
    175     ifdef TARGET_2ND_ARCH
    176       ifeq ($(my_module_multilib),both)
    177         # The non-preferred arch
    178         my_2nd_arch_prefix := $(if $(LOCAL_2ND_ARCH_VAR_PREFIX),,$(TARGET_2ND_ARCH_VAR_PREFIX))
    179         my_dexpreopt_archs += $(TARGET_$(my_2nd_arch_prefix)ARCH)
    180         my_dexpreopt_images += \
    181             $(DEXPREOPT_IMAGE_$(my_dexpreopt_infix)_$(TARGET_$(my_2nd_arch_prefix)ARCH))
    182       endif  # LOCAL_MULTILIB is both
    183     endif  # TARGET_2ND_ARCH
    184   endif  # LOCAL_MODULE_CLASS
    185 
    186   # Record dex-preopt config.
    187   DEXPREOPT.$(LOCAL_MODULE).DEX_PREOPT := $(LOCAL_DEX_PREOPT)
    188   DEXPREOPT.$(LOCAL_MODULE).MULTILIB := $(LOCAL_MULTILIB)
    189   DEXPREOPT.$(LOCAL_MODULE).DEX_PREOPT_FLAGS := $(LOCAL_DEX_PREOPT_FLAGS)
    190   DEXPREOPT.$(LOCAL_MODULE).PRIVILEGED_MODULE := $(LOCAL_PRIVILEGED_MODULE)
    191   DEXPREOPT.$(LOCAL_MODULE).VENDOR_MODULE := $(LOCAL_VENDOR_MODULE)
    192   DEXPREOPT.$(LOCAL_MODULE).TARGET_ARCH := $(LOCAL_MODULE_TARGET_ARCH)
    193   DEXPREOPT.$(LOCAL_MODULE).INSTALLED_STRIPPED := $(LOCAL_INSTALLED_MODULE)
    194   DEXPREOPT.MODULES.$(LOCAL_MODULE_CLASS) := $(sort \
    195     $(DEXPREOPT.MODULES.$(LOCAL_MODULE_CLASS)) $(LOCAL_MODULE))
    196 
    197   $(call json_start)
    198 
    199   # DexPath, StripInputPath, and StripOutputPath are not set, they will
    200   # be filled in by dexpreopt_gen.
    201 
    202   $(call add_json_str,  Name,                           $(LOCAL_MODULE))
    203   $(call add_json_str,  DexLocation,                    $(patsubst $(PRODUCT_OUT)%,%,$(LOCAL_INSTALLED_MODULE)))
    204   $(call add_json_str,  BuildPath,                      $(LOCAL_BUILT_MODULE))
    205   $(call add_json_str,  ExtrasOutputPath,               $$2)
    206   $(call add_json_bool, Privileged,                     $(filter true,$(LOCAL_PRIVILEGED_MODULE)))
    207   $(call add_json_bool, UncompressedDex,                $(filter true,$(LOCAL_UNCOMPRESS_DEX)))
    208   $(call add_json_bool, HasApkLibraries,                $(LOCAL_APK_LIBRARIES))
    209   $(call add_json_list, PreoptFlags,                    $(LOCAL_DEX_PREOPT_FLAGS))
    210   $(call add_json_str,  ProfileClassListing,            $(if $(my_process_profile),$(LOCAL_DEX_PREOPT_PROFILE)))
    211   $(call add_json_bool, ProfileIsTextListing,           $(my_profile_is_text_listing))
    212   $(call add_json_bool, EnforceUsesLibraries,           $(LOCAL_ENFORCE_USES_LIBRARIES))
    213   $(call add_json_list, OptionalUsesLibraries,          $(LOCAL_OPTIONAL_USES_LIBRARIES))
    214   $(call add_json_list, UsesLibraries,                  $(LOCAL_USES_LIBRARIES))
    215   $(call add_json_map,  LibraryPaths)
    216   $(foreach lib,$(sort $(LOCAL_USES_LIBRARIES) $(LOCAL_OPTIONAL_USES_LIBRARIES) org.apache.http.legacy android.hidl.base-V1.0-java android.hidl.manager-V1.0-java),\
    217     $(call add_json_str, $(lib), $(call intermediates-dir-for,JAVA_LIBRARIES,$(lib),,COMMON)/javalib.jar))
    218   $(call end_json_map)
    219   $(call add_json_list, Archs,                          $(my_dexpreopt_archs))
    220   $(call add_json_list, DexPreoptImages,                $(my_dexpreopt_images))
    221   $(call add_json_list, PreoptBootClassPathDexFiles,    $(DEXPREOPT_BOOTCLASSPATH_DEX_FILES))
    222   $(call add_json_list, PreoptBootClassPathDexLocations,$(DEXPREOPT_BOOTCLASSPATH_DEX_LOCATIONS))
    223   $(call add_json_bool, PreoptExtractedApk,             $(my_preopt_for_extracted_apk))
    224   $(call add_json_bool, NoCreateAppImage,               $(filter false,$(LOCAL_DEX_PREOPT_APP_IMAGE)))
    225   $(call add_json_bool, ForceCreateAppImage,            $(filter true,$(LOCAL_DEX_PREOPT_APP_IMAGE)))
    226   $(call add_json_bool, PresignedPrebuilt,              $(filter PRESIGNED,$(LOCAL_CERTIFICATE)))
    227 
    228   $(call add_json_bool, NoStripping,                    $(filter nostripping,$(LOCAL_DEX_PREOPT)))
    229 
    230   $(call json_end)
    231 
    232   my_dexpreopt_config := $(intermediates)/dexpreopt.config
    233   my_dexpreopt_script := $(intermediates)/dexpreopt.sh
    234   my_strip_script := $(intermediates)/strip.sh
    235   my_dexpreopt_zip := $(intermediates)/dexpreopt.zip
    236 
    237   $(my_dexpreopt_config): PRIVATE_MODULE := $(LOCAL_MODULE)
    238   $(my_dexpreopt_config): PRIVATE_CONTENTS := $(json_contents)
    239   $(my_dexpreopt_config):
    240 	@echo "$(PRIVATE_MODULE) dexpreopt.config"
    241 	echo -e -n '$(subst $(newline),\n,$(subst ','\'',$(subst \,\\,$(PRIVATE_CONTENTS))))' > $@
    242 
    243   .KATI_RESTAT: $(my_dexpreopt_script) $(my_strip_script)
    244   $(my_dexpreopt_script): PRIVATE_MODULE := $(LOCAL_MODULE)
    245   $(my_dexpreopt_script): PRIVATE_GLOBAL_CONFIG := $(PRODUCT_OUT)/dexpreopt.config
    246   $(my_dexpreopt_script): PRIVATE_MODULE_CONFIG := $(my_dexpreopt_config)
    247   $(my_dexpreopt_script): PRIVATE_STRIP_SCRIPT := $(my_strip_script)
    248   $(my_dexpreopt_script): .KATI_IMPLICIT_OUTPUTS := $(my_strip_script)
    249   $(my_dexpreopt_script): $(DEXPREOPT_GEN)
    250   $(my_dexpreopt_script): $(my_dexpreopt_config) $(PRODUCT_OUT)/dexpreopt.config
    251 	@echo "$(PRIVATE_MODULE) dexpreopt gen"
    252 	$(DEXPREOPT_GEN) -global $(PRIVATE_GLOBAL_CONFIG) -module $(PRIVATE_MODULE_CONFIG) \
    253 	-dexpreopt_script $@ -strip_script $(PRIVATE_STRIP_SCRIPT) \
    254 	-out_dir $(OUT_DIR)
    255 
    256   my_dexpreopt_deps := $(my_dex_jar)
    257   my_dexpreopt_deps += $(if $(my_process_profile),$(LOCAL_DEX_PREOPT_PROFILE))
    258   my_dexpreopt_deps += \
    259     $(foreach lib,$(sort $(LOCAL_USES_LIBRARIES) $(LOCAL_OPTIONAL_USES_LIBRARIES) org.apache.http.legacy android.hidl.base-V1.0-java android.hidl.manager-V1.0-java),\
    260       $(call intermediates-dir-for,JAVA_LIBRARIES,$(lib),,COMMON)/javalib.jar)
    261   my_dexpreopt_deps += $(my_dexpreopt_images)
    262   my_dexpreopt_deps += $(DEXPREOPT_BOOTCLASSPATH_DEX_FILES)
    263 
    264   $(my_dexpreopt_zip): PRIVATE_MODULE := $(LOCAL_MODULE)
    265   $(my_dexpreopt_zip): $(my_dexpreopt_deps)
    266   $(my_dexpreopt_zip): | $(DEXPREOPT_GEN_DEPS)
    267   $(my_dexpreopt_zip): .KATI_DEPFILE := $(my_dexpreopt_zip).d
    268   $(my_dexpreopt_zip): PRIVATE_DEX := $(my_dex_jar)
    269   $(my_dexpreopt_zip): PRIVATE_SCRIPT := $(my_dexpreopt_script)
    270   $(my_dexpreopt_zip): $(my_dexpreopt_script)
    271 	@echo "$(PRIVATE_MODULE) dexpreopt"
    272 	bash $(PRIVATE_SCRIPT) $(PRIVATE_DEX) $@
    273 
    274   ifdef LOCAL_POST_INSTALL_CMD
    275     # Add a shell command separator
    276     LOCAL_POST_INSTALL_CMD += &&
    277   endif
    278 
    279   LOCAL_POST_INSTALL_CMD += \
    280     for i in $$(zipinfo -1 $(my_dexpreopt_zip)); \
    281       do mkdir -p $(PRODUCT_OUT)/$$(dirname $$i); \
    282     done && \
    283     ( unzip -qo -d $(PRODUCT_OUT) $(my_dexpreopt_zip) 2>&1 | grep -v "zipfile is empty"; exit $${PIPESTATUS[0]} ) || \
    284       ( code=$$?; if [ $$code -ne 0 -a $$code -ne 1 ]; then exit $$code; fi )
    285 
    286   $(LOCAL_INSTALLED_MODULE): PRIVATE_POST_INSTALL_CMD := $(LOCAL_POST_INSTALL_CMD)
    287   $(LOCAL_INSTALLED_MODULE): $(my_dexpreopt_zip)
    288 
    289   $(my_all_targets): $(my_dexpreopt_zip)
    290 
    291   my_dexpreopt_config :=
    292   my_dexpreopt_script :=
    293   my_strip_script :=
    294   my_dexpreopt_zip :=
    295 endif # LOCAL_DEX_PREOPT
    296