github.com/westcoastroms/westcoastroms-build@v0.0.0-20190928114312-2350e5a73030/build/make/core/dex_preopt_odex_install.mk (about) 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, built_odex, 4 # dexpreopt_boot_jar_module 5 6 # We explicitly uncompress APKs of privileged apps, and used by 7 # privileged apps 8 LOCAL_UNCOMPRESS_DEX := false 9 ifneq (true,$(DONT_UNCOMPRESS_PRIV_APPS_DEXS)) 10 ifeq (true,$(LOCAL_PRIVILEGED_MODULE)) 11 LOCAL_UNCOMPRESS_DEX := true 12 else 13 ifneq (,$(filter $(PRODUCT_LOADED_BY_PRIVILEGED_MODULES), $(LOCAL_MODULE))) 14 LOCAL_UNCOMPRESS_DEX := true 15 endif # PRODUCT_LOADED_BY_PRIVILEGED_MODULES 16 endif # LOCAL_PRIVILEGED_MODULE 17 endif # DONT_UNCOMPRESS_PRIV_APPS_DEXS 18 19 # Setting LOCAL_DEX_PREOPT based on WITH_DEXPREOPT, LOCAL_DEX_PREOPT, etc 20 LOCAL_DEX_PREOPT := $(strip $(LOCAL_DEX_PREOPT)) 21 ifneq (true,$(WITH_DEXPREOPT)) 22 LOCAL_DEX_PREOPT := 23 else # WITH_DEXPREOPT=true 24 ifeq (,$(TARGET_BUILD_APPS)) # TARGET_BUILD_APPS empty 25 ifndef LOCAL_DEX_PREOPT # LOCAL_DEX_PREOPT undefined 26 ifneq ($(filter $(TARGET_OUT)/%,$(my_module_path)),) # Installed to system.img. 27 ifeq (,$(LOCAL_APK_LIBRARIES)) # LOCAL_APK_LIBRARIES empty 28 # If we have product-specific config for this module? 29 ifeq (disable,$(DEXPREOPT.$(TARGET_PRODUCT).$(LOCAL_MODULE).CONFIG)) 30 LOCAL_DEX_PREOPT := false 31 else 32 LOCAL_DEX_PREOPT := $(DEX_PREOPT_DEFAULT) 33 endif 34 else # LOCAL_APK_LIBRARIES not empty 35 LOCAL_DEX_PREOPT := nostripping 36 endif # LOCAL_APK_LIBRARIES not empty 37 endif # Installed to system.img. 38 endif # LOCAL_DEX_PREOPT undefined 39 endif # TARGET_BUILD_APPS empty 40 endif # WITH_DEXPREOPT=true 41 ifeq (false,$(LOCAL_DEX_PREOPT)) 42 LOCAL_DEX_PREOPT := 43 endif 44 ifdef LOCAL_UNINSTALLABLE_MODULE 45 LOCAL_DEX_PREOPT := 46 endif 47 ifeq (,$(strip $(built_dex)$(my_prebuilt_src_file)$(LOCAL_SOONG_DEX_JAR))) # contains no java code 48 LOCAL_DEX_PREOPT := 49 endif 50 # if WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY=true and module is not in boot class path skip 51 # Also preopt system server jars since selinux prevents system server from loading anything from 52 # /data. If we don't do this they will need to be extracted which is not favorable for RAM usage 53 # or performance. If my_preopt_for_extracted_apk is true, we ignore the only preopt boot image 54 # options. 55 ifneq (true,$(my_preopt_for_extracted_apk)) 56 ifeq (true,$(WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY)) 57 ifeq ($(filter $(PRODUCT_SYSTEM_SERVER_JARS) $(DEXPREOPT_BOOT_JARS_MODULES),$(LOCAL_MODULE)),) 58 LOCAL_DEX_PREOPT := 59 endif 60 endif 61 endif 62 63 ifeq ($(LOCAL_DEX_PREOPT),true) 64 65 # Don't strip with dexes we explicitly uncompress (dexopt will not store the dex code). 66 ifeq ($(LOCAL_UNCOMPRESS_DEX),true) 67 LOCAL_DEX_PREOPT := nostripping 68 endif # LOCAL_UNCOMPRESS_DEX 69 70 # system_other isn't there for an OTA, so don't strip 71 # if module is on system, and odex is on system_other. 72 ifeq ($(BOARD_USES_SYSTEM_OTHER_ODEX),true) 73 ifneq ($(call install-on-system-other, $(my_module_path)),) 74 LOCAL_DEX_PREOPT := nostripping 75 endif # install-on-system-other 76 endif # BOARD_USES_SYSTEM_OTHER_ODEX 77 78 # We also don't strip if all dexs are uncompressed (dexopt will not store the dex code), 79 # but that requires to inspect the source file, which is too early at this point (as we 80 # don't know if the source file will actually be used). 81 # See dexpreopt-remove-classes.dex. 82 83 endif # LOCAL_DEX_PREOPT 84 85 built_odex := 86 built_vdex := 87 built_art := 88 installed_odex := 89 installed_vdex := 90 installed_art := 91 built_installed_odex := 92 built_installed_vdex := 93 built_installed_art := 94 my_process_profile := 95 my_profile_is_text_listing := 96 97 ifeq (false,$(WITH_DEX_PREOPT_GENERATE_PROFILE)) 98 LOCAL_DEX_PREOPT_GENERATE_PROFILE := false 99 endif 100 101 ifndef LOCAL_DEX_PREOPT_GENERATE_PROFILE 102 103 104 # If LOCAL_DEX_PREOPT_GENERATE_PROFILE is not defined, default it based on the existence of the 105 # profile class listing. TODO: Use product specific directory here. 106 my_classes_directory := $(PRODUCT_DEX_PREOPT_PROFILE_DIR) 107 LOCAL_DEX_PREOPT_PROFILE := $(my_classes_directory)/$(LOCAL_MODULE).prof 108 109 ifneq (,$(wildcard $(LOCAL_DEX_PREOPT_PROFILE))) 110 my_process_profile := true 111 my_profile_is_text_listing := false 112 endif 113 else 114 my_process_profile := $(LOCAL_DEX_PREOPT_GENERATE_PROFILE) 115 my_profile_is_text_listing := true 116 LOCAL_DEX_PREOPT_PROFILE := $(LOCAL_DEX_PREOPT_PROFILE_CLASS_LISTING) 117 endif 118 119 ifeq (true,$(my_process_profile)) 120 121 ifeq (,$(LOCAL_DEX_PREOPT_APP_IMAGE)) 122 LOCAL_DEX_PREOPT_APP_IMAGE := true 123 endif 124 125 ifndef LOCAL_DEX_PREOPT_PROFILE 126 $(call pretty-error,Must have specified class listing (LOCAL_DEX_PREOPT_PROFILE)) 127 endif 128 ifeq (,$(dex_preopt_profile_src_file)) 129 $(call pretty-error, Internal error: dex_preopt_profile_src_file must be set) 130 endif 131 my_built_profile := $(dir $(LOCAL_BUILT_MODULE))/profile.prof 132 my_dex_location := $(patsubst $(PRODUCT_OUT)%,%,$(LOCAL_INSTALLED_MODULE)) 133 # Remove compressed APK extension. 134 my_dex_location := $(patsubst %.gz,%,$(my_dex_location)) 135 $(my_built_profile): PRIVATE_BUILT_MODULE := $(dex_preopt_profile_src_file) 136 $(my_built_profile): PRIVATE_DEX_LOCATION := $(my_dex_location) 137 $(my_built_profile): PRIVATE_SOURCE_CLASSES := $(LOCAL_DEX_PREOPT_PROFILE) 138 $(my_built_profile): $(LOCAL_DEX_PREOPT_PROFILE) 139 $(my_built_profile): $(PROFMAN) 140 $(my_built_profile): $(dex_preopt_profile_src_file) 141 ifeq (true,$(my_profile_is_text_listing)) 142 # The profile is a test listing of classes (used for framework jars). 143 # We need to generate the actual binary profile before being able to compile. 144 $(hide) mkdir -p $(dir $@) 145 ANDROID_LOG_TAGS="*:e" $(PROFMAN) \ 146 --create-profile-from=$(PRIVATE_SOURCE_CLASSES) \ 147 --apk=$(PRIVATE_BUILT_MODULE) \ 148 --dex-location=$(PRIVATE_DEX_LOCATION) \ 149 --reference-profile-file=$@ 150 else 151 # The profile is binary profile (used for apps). Run it through profman to 152 # ensure the profile keys match the apk. 153 $(my_built_profile): 154 $(hide) mkdir -p $(dir $@) 155 touch $@ 156 ANDROID_LOG_TAGS="*:i" $(PROFMAN) \ 157 --copy-and-update-profile-key \ 158 --profile-file=$(PRIVATE_SOURCE_CLASSES) \ 159 --apk=$(PRIVATE_BUILT_MODULE) \ 160 --dex-location=$(PRIVATE_DEX_LOCATION) \ 161 --reference-profile-file=$@ \ 162 || echo "Profile out of date for $(PRIVATE_BUILT_MODULE)" 163 endif 164 165 my_profile_is_text_listing := 166 dex_preopt_profile_src_file := 167 168 # Remove compressed APK extension. 169 my_installed_profile := $(patsubst %.gz,%,$(LOCAL_INSTALLED_MODULE)).prof 170 171 # my_installed_profile := $(LOCAL_INSTALLED_MODULE).prof 172 $(eval $(call copy-one-file,$(my_built_profile),$(my_installed_profile))) 173 build_installed_profile:=$(my_built_profile):$(my_installed_profile) 174 else 175 build_installed_profile:= 176 my_installed_profile := 177 endif 178 179 ifdef LOCAL_DEX_PREOPT 180 181 dexpreopt_boot_jar_module := $(filter $(DEXPREOPT_BOOT_JARS_MODULES),$(LOCAL_MODULE)) 182 183 # Filter org.apache.http.legacy.boot. 184 ifeq ($(dexpreopt_boot_jar_module),org.apache.http.legacy.boot) 185 dexpreopt_boot_jar_module := 186 endif 187 188 ifdef dexpreopt_boot_jar_module 189 # For libart, the boot jars' odex files are replaced by $(DEFAULT_DEX_PREOPT_INSTALLED_IMAGE). 190 # We use this installed_odex trick to get boot.art installed. 191 installed_odex := $(DEFAULT_DEX_PREOPT_INSTALLED_IMAGE) 192 # Append the odex for the 2nd arch if we have one. 193 installed_odex += $($(TARGET_2ND_ARCH_VAR_PREFIX)DEFAULT_DEX_PREOPT_INSTALLED_IMAGE) 194 else # boot jar 195 ifeq ($(LOCAL_MODULE_CLASS),JAVA_LIBRARIES) 196 # For a Java library, by default we build odex for both 1st arch and 2nd arch. 197 # But it can be overridden with "LOCAL_MULTILIB := first". 198 ifneq (,$(filter $(PRODUCT_SYSTEM_SERVER_JARS),$(LOCAL_MODULE))) 199 # For system server jars, we build for only "first". 200 my_module_multilib := first 201 else 202 my_module_multilib := $(LOCAL_MULTILIB) 203 endif 204 # ################################################# 205 # Odex for the 1st arch 206 my_2nd_arch_prefix := 207 include $(BUILD_SYSTEM)/setup_one_odex.mk 208 # ################################################# 209 # Odex for the 2nd arch 210 ifdef TARGET_2ND_ARCH 211 ifneq ($(TARGET_TRANSLATE_2ND_ARCH),true) 212 ifneq (first,$(my_module_multilib)) 213 my_2nd_arch_prefix := $(TARGET_2ND_ARCH_VAR_PREFIX) 214 include $(BUILD_SYSTEM)/setup_one_odex.mk 215 endif # my_module_multilib is not first. 216 endif # TARGET_TRANSLATE_2ND_ARCH not true 217 endif # TARGET_2ND_ARCH 218 # ################################################# 219 else # must be APPS 220 # The preferred arch 221 my_2nd_arch_prefix := $(LOCAL_2ND_ARCH_VAR_PREFIX) 222 include $(BUILD_SYSTEM)/setup_one_odex.mk 223 ifdef TARGET_2ND_ARCH 224 ifeq ($(LOCAL_MULTILIB),both) 225 # The non-preferred arch 226 my_2nd_arch_prefix := $(if $(LOCAL_2ND_ARCH_VAR_PREFIX),,$(TARGET_2ND_ARCH_VAR_PREFIX)) 227 include $(BUILD_SYSTEM)/setup_one_odex.mk 228 endif # LOCAL_MULTILIB is both 229 endif # TARGET_2ND_ARCH 230 endif # LOCAL_MODULE_CLASS 231 endif # boot jar 232 233 built_odex := $(strip $(built_odex)) 234 built_vdex := $(strip $(built_vdex)) 235 built_art := $(strip $(built_art)) 236 installed_odex := $(strip $(installed_odex)) 237 installed_vdex := $(strip $(installed_vdex)) 238 installed_art := $(strip $(installed_art)) 239 240 ifdef built_odex 241 ifeq (true,$(my_process_profile)) 242 $(built_odex): $(my_built_profile) 243 $(built_odex): PRIVATE_PROFILE_PREOPT_FLAGS := --profile-file=$(my_built_profile) 244 else 245 $(built_odex): PRIVATE_PROFILE_PREOPT_FLAGS := 246 endif 247 248 ifndef LOCAL_DEX_PREOPT_FLAGS 249 LOCAL_DEX_PREOPT_FLAGS := $(DEXPREOPT.$(TARGET_PRODUCT).$(LOCAL_MODULE).CONFIG) 250 ifndef LOCAL_DEX_PREOPT_FLAGS 251 LOCAL_DEX_PREOPT_FLAGS := $(PRODUCT_DEX_PREOPT_DEFAULT_FLAGS) 252 endif 253 endif 254 255 my_system_server_compiler_filter := $(PRODUCT_SYSTEM_SERVER_COMPILER_FILTER) 256 ifeq (,$(my_system_server_compiler_filter)) 257 my_system_server_compiler_filter := speed 258 endif 259 260 my_default_compiler_filter := $(PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER) 261 ifeq (,$(my_default_compiler_filter)) 262 # If no default compiler filter is specified, default to 'quicken' to save on storage. 263 my_default_compiler_filter := quicken 264 endif 265 266 ifeq (,$(filter --compiler-filter=%, $(LOCAL_DEX_PREOPT_FLAGS))) 267 ifneq (,$(filter $(PRODUCT_SYSTEM_SERVER_JARS),$(LOCAL_MODULE))) 268 # Jars of system server, use the product option if it is set, speed otherwise. 269 LOCAL_DEX_PREOPT_FLAGS += --compiler-filter=$(my_system_server_compiler_filter) 270 else 271 ifneq (,$(filter $(PRODUCT_DEXPREOPT_SPEED_APPS) $(PRODUCT_SYSTEM_SERVER_APPS),$(LOCAL_MODULE))) 272 # Apps loaded into system server, and apps the product default to being compiled with the 273 # 'speed' compiler filter. 274 LOCAL_DEX_PREOPT_FLAGS += --compiler-filter=speed 275 else 276 ifeq (true,$(my_process_profile)) 277 # For non system server jars, use speed-profile when we have a profile. 278 LOCAL_DEX_PREOPT_FLAGS += --compiler-filter=speed-profile 279 else 280 LOCAL_DEX_PREOPT_FLAGS += --compiler-filter=$(my_default_compiler_filter) 281 endif 282 endif 283 endif 284 endif 285 286 my_generate_dm := $(PRODUCT_DEX_PREOPT_GENERATE_DM_FILES) 287 ifeq (,$(filter $(LOCAL_DEX_PREOPT_FLAGS),--compiler-filter=verify)) 288 # Generating DM files only makes sense for verify, avoid doing for non verify compiler filter APKs. 289 my_generate_dm := false 290 endif 291 292 # No reason to use a dm file if the dex is already uncompressed. 293 ifeq ($(LOCAL_UNCOMPRESS_DEX),true) 294 my_generate_dm := false 295 endif 296 297 ifeq (true,$(my_generate_dm)) 298 LOCAL_DEX_PREOPT_FLAGS += --copy-dex-files=false 299 LOCAL_DEX_PREOPT := nostripping 300 my_built_dm := $(dir $(LOCAL_BUILT_MODULE))generated.dm 301 my_installed_dm := $(patsubst %.apk,%,$(LOCAL_INSTALLED_MODULE)).dm 302 my_copied_vdex := $(dir $(LOCAL_BUILT_MODULE))primary.vdex 303 $(eval $(call copy-one-file,$(built_vdex),$(my_copied_vdex))) 304 $(my_built_dm): PRIVATE_INPUT_VDEX := $(my_copied_vdex) 305 $(my_built_dm): $(my_copied_vdex) $(ZIPTIME) 306 $(hide) mkdir -p $(dir $@) 307 $(hide) rm -f $@ 308 $(hide) zip -qD -j -X -9 $@ $(PRIVATE_INPUT_VDEX) 309 $(ZIPTIME) $@ 310 $(eval $(call copy-one-file,$(my_built_dm),$(my_installed_dm))) 311 endif 312 313 # By default, emit debug info. 314 my_dexpreopt_debug_info := true 315 # If the global setting suppresses mini-debug-info, disable it. 316 ifeq (false,$(WITH_DEXPREOPT_DEBUG_INFO)) 317 my_dexpreopt_debug_info := false 318 endif 319 320 # PRODUCT_SYSTEM_SERVER_DEBUG_INFO overrides WITH_DEXPREOPT_DEBUG_INFO. 321 # PRODUCT_OTHER_JAVA_DEBUG_INFO overrides WITH_DEXPREOPT_DEBUG_INFO. 322 ifneq (,$(filter $(PRODUCT_SYSTEM_SERVER_JARS),$(LOCAL_MODULE))) 323 ifeq (true,$(PRODUCT_SYSTEM_SERVER_DEBUG_INFO)) 324 my_dexpreopt_debug_info := true 325 else ifeq (false,$(PRODUCT_SYSTEM_SERVER_DEBUG_INFO)) 326 my_dexpreopt_debug_info := false 327 endif 328 else 329 ifeq (true,$(PRODUCT_OTHER_JAVA_DEBUG_INFO)) 330 my_dexpreopt_debug_info := true 331 else ifeq (false,$(PRODUCT_OTHER_JAVA_DEBUG_INFO)) 332 my_dexpreopt_debug_info := false 333 endif 334 endif 335 336 # Never enable on eng. 337 ifeq (eng,$(filter eng, $(TARGET_BUILD_VARIANT))) 338 my_dexpreopt_debug_info := false 339 endif 340 341 # Add dex2oat flag for debug-info/no-debug-info. 342 ifeq (true,$(my_dexpreopt_debug_info)) 343 LOCAL_DEX_PREOPT_FLAGS += --generate-mini-debug-info 344 else ifeq (false,$(my_dexpreopt_debug_info)) 345 LOCAL_DEX_PREOPT_FLAGS += --no-generate-mini-debug-info 346 endif 347 348 # Set the compiler reason to 'prebuilt' to identify the oat files produced 349 # during the build, as opposed to compiled on the device. 350 LOCAL_DEX_PREOPT_FLAGS += --compilation-reason=prebuilt 351 352 $(built_odex): PRIVATE_DEX_PREOPT_FLAGS := $(LOCAL_DEX_PREOPT_FLAGS) 353 $(built_vdex): $(built_odex) 354 $(built_art): $(built_odex) 355 endif 356 357 ifneq (true,$(my_generate_dm)) 358 # Add the installed_odex to the list of installed files for this module if we aren't generating a 359 # dm file. 360 ALL_MODULES.$(my_register_name).INSTALLED += $(installed_odex) 361 ALL_MODULES.$(my_register_name).INSTALLED += $(installed_vdex) 362 ALL_MODULES.$(my_register_name).INSTALLED += $(installed_art) 363 364 ALL_MODULES.$(my_register_name).BUILT_INSTALLED += $(built_installed_odex) 365 ALL_MODULES.$(my_register_name).BUILT_INSTALLED += $(built_installed_vdex) 366 ALL_MODULES.$(my_register_name).BUILT_INSTALLED += $(built_installed_art) 367 368 # Make sure to install the .odex and .vdex when you run "make <module_name>" 369 $(my_all_targets): $(installed_odex) $(installed_vdex) $(installed_art) 370 else 371 ALL_MODULES.$(my_register_name).INSTALLED += $(my_installed_dm) 372 ALL_MODULES.$(my_register_name).BUILT_INSTALLED += $(my_built_dm) $(my_installed_dm) 373 374 # Make sure to install the .dm when you run "make <module_name>" 375 $(my_all_targets): $(installed_dm) 376 endif 377 378 # Record dex-preopt config. 379 DEXPREOPT.$(LOCAL_MODULE).DEX_PREOPT := $(LOCAL_DEX_PREOPT) 380 DEXPREOPT.$(LOCAL_MODULE).MULTILIB := $(LOCAL_MULTILIB) 381 DEXPREOPT.$(LOCAL_MODULE).DEX_PREOPT_FLAGS := $(LOCAL_DEX_PREOPT_FLAGS) 382 DEXPREOPT.$(LOCAL_MODULE).PRIVILEGED_MODULE := $(LOCAL_PRIVILEGED_MODULE) 383 DEXPREOPT.$(LOCAL_MODULE).VENDOR_MODULE := $(LOCAL_VENDOR_MODULE) 384 DEXPREOPT.$(LOCAL_MODULE).TARGET_ARCH := $(LOCAL_MODULE_TARGET_ARCH) 385 DEXPREOPT.$(LOCAL_MODULE).INSTALLED := $(installed_odex) 386 DEXPREOPT.$(LOCAL_MODULE).INSTALLED_STRIPPED := $(LOCAL_INSTALLED_MODULE) 387 DEXPREOPT.MODULES.$(LOCAL_MODULE_CLASS) := $(sort \ 388 $(DEXPREOPT.MODULES.$(LOCAL_MODULE_CLASS)) $(LOCAL_MODULE)) 389 390 endif # LOCAL_DEX_PREOPT 391 392 # Profile doesn't depend on LOCAL_DEX_PREOPT. 393 ALL_MODULES.$(my_register_name).INSTALLED += $(my_installed_profile) 394 ALL_MODULES.$(my_register_name).BUILT_INSTALLED += $(build_installed_profile) 395 396 my_process_profile := 397 398 $(my_all_targets): $(my_installed_profile)