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# Input variables: my_manifest_or_apk 4# Output variables: LOCAL_DEX_PREOPT, LOCAL_UNCOMPRESS_DEX 5 6ifeq (true,$(LOCAL_USE_EMBEDDED_DEX)) 7 LOCAL_UNCOMPRESS_DEX := true 8else 9 LOCAL_UNCOMPRESS_DEX := 10endif 11 12# We explicitly uncompress APKs of privileged apps, and used by 13# privileged apps 14ifneq (true,$(DONT_UNCOMPRESS_PRIV_APPS_DEXS)) 15 ifeq (true,$(LOCAL_PRIVILEGED_MODULE)) 16 LOCAL_UNCOMPRESS_DEX := true 17 endif 18 19 ifneq (,$(filter $(PRODUCT_LOADED_BY_PRIVILEGED_MODULES), $(LOCAL_MODULE))) 20 LOCAL_UNCOMPRESS_DEX := true 21 endif 22endif # DONT_UNCOMPRESS_PRIV_APPS_DEXS 23 24# Setting LOCAL_DEX_PREOPT based on WITH_DEXPREOPT, LOCAL_DEX_PREOPT, etc 25LOCAL_DEX_PREOPT := $(strip $(LOCAL_DEX_PREOPT)) 26ifndef LOCAL_DEX_PREOPT # LOCAL_DEX_PREOPT undefined 27 LOCAL_DEX_PREOPT := $(DEX_PREOPT_DEFAULT) 28endif 29 30ifeq (false,$(LOCAL_DEX_PREOPT)) 31 LOCAL_DEX_PREOPT := 32endif 33 34# Disable preopt for tests. 35ifneq (,$(filter $(LOCAL_MODULE_TAGS),tests)) 36 LOCAL_DEX_PREOPT := 37endif 38 39# If we have product-specific config for this module? 40ifneq (,$(filter $(LOCAL_MODULE),$(DEXPREOPT_DISABLED_MODULES))) 41 LOCAL_DEX_PREOPT := 42endif 43 44# Disable preopt for DISABLE_PREOPT 45ifeq (true,$(DISABLE_PREOPT)) 46 LOCAL_DEX_PREOPT := 47endif 48 49# Disable preopt if not WITH_DEXPREOPT 50ifneq (true,$(WITH_DEXPREOPT)) 51 LOCAL_DEX_PREOPT := 52endif 53 54ifdef LOCAL_UNINSTALLABLE_MODULE 55 LOCAL_DEX_PREOPT := 56endif 57 58# Disable preopt if the app contains no java code. 59ifeq (,$(strip $(built_dex)$(my_prebuilt_src_file)$(LOCAL_SOONG_DEX_JAR))) 60 LOCAL_DEX_PREOPT := 61endif 62 63# if WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY=true and module is not in boot class path skip 64# Also preopt system server jars since selinux prevents system server from loading anything from 65# /data. If we don't do this they will need to be extracted which is not favorable for RAM usage 66# or performance. If my_preopt_for_extracted_apk is true, we ignore the only preopt boot image 67# options. 68system_server_jars := $(foreach m,$(PRODUCT_SYSTEM_SERVER_JARS),$(call word-colon,2,$(m))) 69ifneq (true,$(my_preopt_for_extracted_apk)) 70 ifeq (true,$(WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY)) 71 ifeq ($(filter $(system_server_jars) $(DEXPREOPT_BOOT_JARS_MODULES),$(LOCAL_MODULE)),) 72 LOCAL_DEX_PREOPT := 73 endif 74 endif 75endif 76 77my_process_profile := 78my_profile_is_text_listing := 79 80ifeq (false,$(WITH_DEX_PREOPT_GENERATE_PROFILE)) 81 LOCAL_DEX_PREOPT_GENERATE_PROFILE := false 82endif 83 84ifndef LOCAL_DEX_PREOPT_GENERATE_PROFILE 85 # If LOCAL_DEX_PREOPT_GENERATE_PROFILE is not defined, default it based on the existence of the 86 # profile class listing. TODO: Use product specific directory here. 87 my_classes_directory := $(PRODUCT_DEX_PREOPT_PROFILE_DIR) 88 LOCAL_DEX_PREOPT_PROFILE := $(my_classes_directory)/$(LOCAL_MODULE).prof 89 90 ifneq (,$(wildcard $(LOCAL_DEX_PREOPT_PROFILE))) 91 my_process_profile := true 92 my_profile_is_text_listing := 93 endif 94else 95 my_process_profile := $(LOCAL_DEX_PREOPT_GENERATE_PROFILE) 96 my_profile_is_text_listing := true 97 LOCAL_DEX_PREOPT_PROFILE := $(LOCAL_DEX_PREOPT_PROFILE_CLASS_LISTING) 98endif 99 100ifeq (true,$(my_process_profile)) 101 ifndef LOCAL_DEX_PREOPT_PROFILE 102 $(call pretty-error,Must have specified class listing (LOCAL_DEX_PREOPT_PROFILE)) 103 endif 104 ifeq (,$(dex_preopt_profile_src_file)) 105 $(call pretty-error, Internal error: dex_preopt_profile_src_file must be set) 106 endif 107endif 108 109################################################################################ 110# Local module variables and functions used in dexpreopt and manifest_check. 111################################################################################ 112 113my_filtered_optional_uses_libraries := $(filter-out $(INTERNAL_PLATFORM_MISSING_USES_LIBRARIES), \ 114 $(LOCAL_OPTIONAL_USES_LIBRARIES)) 115 116# TODO(b/132357300): This may filter out too much, as PRODUCT_PACKAGES doesn't 117# include all packages (the full list is unknown until reading all Android.mk 118# makefiles). As a consequence, a library may be present but not included in 119# dexpreopt, which will result in class loader context mismatch and a failure 120# to load dexpreopt code on device. We should fix this, either by deferring 121# dependency computation until the full list of product packages is known, or 122# by adding product-specific lists of missing libraries. 123my_filtered_optional_uses_libraries := $(filter $(PRODUCT_PACKAGES), \ 124 $(my_filtered_optional_uses_libraries)) 125 126ifeq ($(LOCAL_MODULE_CLASS),APPS) 127 # compatibility libraries are added to class loader context of an app only if 128 # targetSdkVersion in the app's manifest is lower than the given SDK version 129 130 my_dexpreopt_libs_compat_28 := \ 131 org.apache.http.legacy 132 133 my_dexpreopt_libs_compat_29 := \ 134 android.hidl.manager-V1.0-java \ 135 android.hidl.base-V1.0-java 136 137 my_dexpreopt_libs_compat_30 := \ 138 android.test.base \ 139 android.test.mock 140 141 my_dexpreopt_libs_compat := \ 142 $(my_dexpreopt_libs_compat_28) \ 143 $(my_dexpreopt_libs_compat_29) \ 144 $(my_dexpreopt_libs_compat_30) 145else 146 my_dexpreopt_libs_compat := 147endif 148 149my_dexpreopt_libs := \ 150 $(LOCAL_USES_LIBRARIES) \ 151 $(my_filtered_optional_uses_libraries) 152 153# Module dexpreopt.config depends on dexpreopt.config files of each 154# <uses-library> dependency, because these libraries may be processed after 155# the current module by Make (there's no topological order), so the dependency 156# information (paths, class loader context) may not be ready yet by the time 157# this dexpreopt.config is generated. So it's necessary to add file-level 158# dependencies between dexpreopt.config files. 159my_dexpreopt_dep_configs := $(foreach lib, \ 160 $(filter-out $(my_dexpreopt_libs_compat),$(LOCAL_USES_LIBRARIES) $(my_filtered_optional_uses_libraries)), \ 161 $(call intermediates-dir-for,JAVA_LIBRARIES,$(lib),,)/dexpreopt.config) 162 163# 1: SDK version 164# 2: list of libraries 165# 166# Make does not process modules in topological order wrt. <uses-library> 167# dependencies, therefore we cannot rely on variables to get the information 168# about dependencies (in particular, their on-device path and class loader 169# context). This information is communicated via dexpreopt.config files: each 170# config depends on configs for <uses-library> dependencies of this module, 171# and the dex_preopt_config_merger.py script reads all configs and inserts the 172# missing bits from dependency configs into the module config. 173# 174# By default on-device path is /system/framework/*.jar, and class loader 175# subcontext is empty. These values are correct for compatibility libraries, 176# which are special and not handled by dex_preopt_config_merger.py. 177# 178add_json_class_loader_context = \ 179 $(call add_json_array, $(1)) \ 180 $(foreach lib, $(2),\ 181 $(call add_json_map_anon) \ 182 $(call add_json_str, Name, $(lib)) \ 183 $(call add_json_str, Host, $(call intermediates-dir-for,JAVA_LIBRARIES,$(lib),,COMMON)/javalib.jar) \ 184 $(call add_json_str, Device, /system/framework/$(lib).jar) \ 185 $(call add_json_val, Subcontexts, null) \ 186 $(call end_json_map)) \ 187 $(call end_json_array) 188 189################################################################################ 190# Verify <uses-library> coherence between the build system and the manifest. 191################################################################################ 192 193# Some libraries do not have a manifest, so there is nothing to check against. 194# Handle it as if the manifest had zero <uses-library> tags: it is ok unless the 195# module has non-empty LOCAL_USES_LIBRARIES or LOCAL_OPTIONAL_USES_LIBRARIES. 196ifndef my_manifest_or_apk 197 ifneq (,$(strip $(LOCAL_USES_LIBRARIES)$(LOCAL_OPTIONAL_USES_LIBRARIES))) 198 $(error $(LOCAL_MODULE) has non-empty <uses-library> list but no manifest) 199 else 200 LOCAL_ENFORCE_USES_LIBRARIES := false 201 endif 202endif 203 204# Disable the check for tests. 205ifneq (,$(filter $(LOCAL_MODULE_TAGS),tests)) 206 LOCAL_ENFORCE_USES_LIBRARIES := false 207endif 208ifneq (,$(LOCAL_COMPATIBILITY_SUITE)) 209 LOCAL_ENFORCE_USES_LIBRARIES := false 210endif 211 212# Disable the check if the app contains no java code. 213ifeq (,$(strip $(built_dex)$(my_prebuilt_src_file)$(LOCAL_SOONG_DEX_JAR))) 214 LOCAL_ENFORCE_USES_LIBRARIES := false 215endif 216 217# Disable <uses-library> checks if dexpreopt is globally disabled. 218# Without dexpreopt the check is not necessary, and although it is good to have, 219# it is difficult to maintain on non-linux build platforms where dexpreopt is 220# generally disabled (the check may fail due to various unrelated reasons, such 221# as a failure to get manifest from an APK). 222ifneq (true,$(WITH_DEXPREOPT)) 223 LOCAL_ENFORCE_USES_LIBRARIES := false 224else ifeq (true,$(WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY)) 225 LOCAL_ENFORCE_USES_LIBRARIES := false 226endif 227 228# Verify LOCAL_USES_LIBRARIES/LOCAL_OPTIONAL_USES_LIBRARIES against the manifest. 229ifndef LOCAL_ENFORCE_USES_LIBRARIES 230 LOCAL_ENFORCE_USES_LIBRARIES := true 231endif 232 233my_enforced_uses_libraries := 234ifeq (true,$(LOCAL_ENFORCE_USES_LIBRARIES)) 235 my_verify_script := build/soong/scripts/manifest_check.py 236 my_uses_libs_args := $(patsubst %,--uses-library %,$(LOCAL_USES_LIBRARIES)) 237 my_optional_uses_libs_args := $(patsubst %,--optional-uses-library %, \ 238 $(LOCAL_OPTIONAL_USES_LIBRARIES)) 239 my_relax_check_arg := $(if $(filter true,$(RELAX_USES_LIBRARY_CHECK)), \ 240 --enforce-uses-libraries-relax,) 241 my_dexpreopt_config_args := $(patsubst %,--dexpreopt-config %,$(my_dexpreopt_dep_configs)) 242 243 my_enforced_uses_libraries := $(intermediates.COMMON)/enforce_uses_libraries.status 244 $(my_enforced_uses_libraries): PRIVATE_USES_LIBRARIES := $(my_uses_libs_args) 245 $(my_enforced_uses_libraries): PRIVATE_OPTIONAL_USES_LIBRARIES := $(my_optional_uses_libs_args) 246 $(my_enforced_uses_libraries): PRIVATE_DEXPREOPT_CONFIGS := $(my_dexpreopt_config_args) 247 $(my_enforced_uses_libraries): PRIVATE_RELAX_CHECK := $(my_relax_check_arg) 248 $(my_enforced_uses_libraries): $(AAPT) 249 $(my_enforced_uses_libraries): $(my_verify_script) 250 $(my_enforced_uses_libraries): $(my_dexpreopt_dep_configs) 251 $(my_enforced_uses_libraries): $(my_manifest_or_apk) 252 @echo Verifying uses-libraries: $< 253 rm -f $@ 254 $(my_verify_script) \ 255 --enforce-uses-libraries \ 256 --enforce-uses-libraries-status $@ \ 257 --aapt $(AAPT) \ 258 $(PRIVATE_USES_LIBRARIES) \ 259 $(PRIVATE_OPTIONAL_USES_LIBRARIES) \ 260 $(PRIVATE_DEXPREOPT_CONFIGS) \ 261 $(PRIVATE_RELAX_CHECK) \ 262 $< 263 $(LOCAL_BUILT_MODULE) : $(my_enforced_uses_libraries) 264endif 265 266################################################################################ 267# Dexpreopt command. 268################################################################################ 269 270my_dexpreopt_archs := 271my_dexpreopt_images := 272my_dexpreopt_images_deps := 273my_dexpreopt_image_locations_on_host := 274my_dexpreopt_image_locations_on_device := 275my_dexpreopt_infix := boot 276my_create_dexpreopt_config := 277ifeq (true, $(DEXPREOPT_USE_ART_IMAGE)) 278 my_dexpreopt_infix := art 279endif 280 281ifdef LOCAL_DEX_PREOPT 282 ifeq (,$(filter PRESIGNED,$(LOCAL_CERTIFICATE))) 283 # Store uncompressed dex files preopted in /system 284 ifeq ($(BOARD_USES_SYSTEM_OTHER_ODEX),true) 285 ifeq ($(call install-on-system-other, $(my_module_path)),) 286 LOCAL_UNCOMPRESS_DEX := true 287 endif # install-on-system-other 288 else # BOARD_USES_SYSTEM_OTHER_ODEX 289 LOCAL_UNCOMPRESS_DEX := true 290 endif 291 endif 292 my_create_dexpreopt_config := true 293endif 294 295# dexpreopt is disabled when TARGET_BUILD_UNBUNDLED_IMAGE is true, 296# but dexpreopt config files are required to dexpreopt in post-processing. 297ifeq ($(TARGET_BUILD_UNBUNDLED_IMAGE),true) 298 my_create_dexpreopt_config := true 299endif 300 301ifeq ($(my_create_dexpreopt_config), true) 302 ifeq ($(LOCAL_MODULE_CLASS),JAVA_LIBRARIES) 303 my_module_multilib := $(LOCAL_MULTILIB) 304 # If the module is not an SDK library and it's a system server jar, only preopt the primary arch. 305 ifeq (,$(filter $(JAVA_SDK_LIBRARIES),$(LOCAL_MODULE))) 306 # For a Java library, by default we build odex for both 1st arch and 2nd arch. 307 # But it can be overridden with "LOCAL_MULTILIB := first". 308 ifneq (,$(filter $(PRODUCT_SYSTEM_SERVER_JARS),$(LOCAL_MODULE))) 309 # For system server jars, we build for only "first". 310 my_module_multilib := first 311 endif 312 endif 313 314 # Only preopt primary arch for translated arch since there is only an image there. 315 ifeq ($(TARGET_TRANSLATE_2ND_ARCH),true) 316 my_module_multilib := first 317 endif 318 319 # ################################################# 320 # Odex for the 1st arch 321 my_dexpreopt_archs += $(TARGET_ARCH) 322 my_dexpreopt_images += $(DEXPREOPT_IMAGE_$(my_dexpreopt_infix)_$(TARGET_ARCH)) 323 my_dexpreopt_images_deps += $(DEXPREOPT_IMAGE_DEPS_$(my_dexpreopt_infix)_$(TARGET_ARCH)) 324 # Odex for the 2nd arch 325 ifdef TARGET_2ND_ARCH 326 ifneq ($(TARGET_TRANSLATE_2ND_ARCH),true) 327 ifneq (first,$(my_module_multilib)) 328 my_dexpreopt_archs += $(TARGET_2ND_ARCH) 329 my_dexpreopt_images += $(DEXPREOPT_IMAGE_$(my_dexpreopt_infix)_$(TARGET_2ND_ARCH)) 330 my_dexpreopt_images_deps += $(DEXPREOPT_IMAGE_DEPS_$(my_dexpreopt_infix)_$(TARGET_2ND_ARCH)) 331 endif # my_module_multilib is not first. 332 endif # TARGET_TRANSLATE_2ND_ARCH not true 333 endif # TARGET_2ND_ARCH 334 # ################################################# 335 else # must be APPS 336 # The preferred arch 337 # Save the module multilib since setup_one_odex modifies it. 338 my_2nd_arch_prefix := $(LOCAL_2ND_ARCH_VAR_PREFIX) 339 my_dexpreopt_archs += $(TARGET_$(my_2nd_arch_prefix)ARCH) 340 my_dexpreopt_images += \ 341 $(DEXPREOPT_IMAGE_$(my_dexpreopt_infix)_$(TARGET_$(my_2nd_arch_prefix)ARCH)) 342 my_dexpreopt_images_deps += \ 343 $(DEXPREOPT_IMAGE_DEPS_$(my_dexpreopt_infix)_$(TARGET_$(my_2nd_arch_prefix)ARCH)) 344 ifdef TARGET_2ND_ARCH 345 ifeq ($(my_module_multilib),both) 346 # The non-preferred arch 347 my_2nd_arch_prefix := $(if $(LOCAL_2ND_ARCH_VAR_PREFIX),,$(TARGET_2ND_ARCH_VAR_PREFIX)) 348 my_dexpreopt_archs += $(TARGET_$(my_2nd_arch_prefix)ARCH) 349 my_dexpreopt_images += \ 350 $(DEXPREOPT_IMAGE_$(my_dexpreopt_infix)_$(TARGET_$(my_2nd_arch_prefix)ARCH)) 351 my_dexpreopt_images_deps += \ 352 $(DEXPREOPT_IMAGE_DEPS_$(my_dexpreopt_infix)_$(TARGET_$(my_2nd_arch_prefix)ARCH)) 353 endif # LOCAL_MULTILIB is both 354 endif # TARGET_2ND_ARCH 355 endif # LOCAL_MODULE_CLASS 356 357 my_dexpreopt_image_locations_on_host += $(DEXPREOPT_IMAGE_LOCATIONS_ON_HOST$(my_dexpreopt_infix)) 358 my_dexpreopt_image_locations_on_device += $(DEXPREOPT_IMAGE_LOCATIONS_ON_DEVICE$(my_dexpreopt_infix)) 359 360 # Record dex-preopt config. 361 DEXPREOPT.$(LOCAL_MODULE).DEX_PREOPT := $(LOCAL_DEX_PREOPT) 362 DEXPREOPT.$(LOCAL_MODULE).MULTILIB := $(LOCAL_MULTILIB) 363 DEXPREOPT.$(LOCAL_MODULE).DEX_PREOPT_FLAGS := $(LOCAL_DEX_PREOPT_FLAGS) 364 DEXPREOPT.$(LOCAL_MODULE).PRIVILEGED_MODULE := $(LOCAL_PRIVILEGED_MODULE) 365 DEXPREOPT.$(LOCAL_MODULE).VENDOR_MODULE := $(LOCAL_VENDOR_MODULE) 366 DEXPREOPT.$(LOCAL_MODULE).TARGET_ARCH := $(LOCAL_MODULE_TARGET_ARCH) 367 DEXPREOPT.$(LOCAL_MODULE).INSTALLED_STRIPPED := $(LOCAL_INSTALLED_MODULE) 368 DEXPREOPT.MODULES.$(LOCAL_MODULE_CLASS) := $(sort \ 369 $(DEXPREOPT.MODULES.$(LOCAL_MODULE_CLASS)) $(LOCAL_MODULE)) 370 371 $(call json_start) 372 373 # DexPath is not set: it will be filled in by dexpreopt_gen. 374 375 $(call add_json_str, Name, $(LOCAL_MODULE)) 376 $(call add_json_str, DexLocation, $(patsubst $(PRODUCT_OUT)%,%,$(LOCAL_INSTALLED_MODULE))) 377 $(call add_json_str, BuildPath, $(LOCAL_BUILT_MODULE)) 378 $(call add_json_str, ManifestPath, $(full_android_manifest)) 379 $(call add_json_str, ExtrasOutputPath, $$2) 380 $(call add_json_bool, Privileged, $(filter true,$(LOCAL_PRIVILEGED_MODULE))) 381 $(call add_json_bool, UncompressedDex, $(filter true,$(LOCAL_UNCOMPRESS_DEX))) 382 $(call add_json_bool, HasApkLibraries, $(LOCAL_APK_LIBRARIES)) 383 $(call add_json_list, PreoptFlags, $(LOCAL_DEX_PREOPT_FLAGS)) 384 $(call add_json_str, ProfileClassListing, $(if $(my_process_profile),$(LOCAL_DEX_PREOPT_PROFILE))) 385 $(call add_json_bool, ProfileIsTextListing, $(my_profile_is_text_listing)) 386 $(call add_json_str, EnforceUsesLibrariesStatusFile, $(my_enforced_uses_libraries)) 387 $(call add_json_bool, EnforceUsesLibraries, $(filter true,$(LOCAL_ENFORCE_USES_LIBRARIES))) 388 $(call add_json_str, ProvidesUsesLibrary, $(firstword $(LOCAL_PROVIDES_USES_LIBRARY) $(LOCAL_MODULE))) 389 $(call add_json_map, ClassLoaderContexts) 390 $(call add_json_class_loader_context, any, $(my_dexpreopt_libs)) 391 $(call add_json_class_loader_context, 28, $(my_dexpreopt_libs_compat_28)) 392 $(call add_json_class_loader_context, 29, $(my_dexpreopt_libs_compat_29)) 393 $(call add_json_class_loader_context, 30, $(my_dexpreopt_libs_compat_30)) 394 $(call end_json_map) 395 $(call add_json_list, Archs, $(my_dexpreopt_archs)) 396 $(call add_json_list, DexPreoptImages, $(my_dexpreopt_images)) 397 $(call add_json_list, DexPreoptImageLocationsOnHost, $(my_dexpreopt_image_locations_on_host)) 398 $(call add_json_list, DexPreoptImageLocationsOnDevice,$(my_dexpreopt_image_locations_on_device)) 399 $(call add_json_list, PreoptBootClassPathDexFiles, $(DEXPREOPT_BOOTCLASSPATH_DEX_FILES)) 400 $(call add_json_list, PreoptBootClassPathDexLocations,$(DEXPREOPT_BOOTCLASSPATH_DEX_LOCATIONS)) 401 $(call add_json_bool, PreoptExtractedApk, $(my_preopt_for_extracted_apk)) 402 $(call add_json_bool, NoCreateAppImage, $(filter false,$(LOCAL_DEX_PREOPT_APP_IMAGE))) 403 $(call add_json_bool, ForceCreateAppImage, $(filter true,$(LOCAL_DEX_PREOPT_APP_IMAGE))) 404 $(call add_json_bool, PresignedPrebuilt, $(filter PRESIGNED,$(LOCAL_CERTIFICATE))) 405 406 $(call json_end) 407 408 my_dexpreopt_config := $(intermediates)/dexpreopt.config 409 my_dexpreopt_config_for_postprocessing := $(PRODUCT_OUT)/dexpreopt_config/$(LOCAL_MODULE)_dexpreopt.config 410 my_dexpreopt_config_merger := $(BUILD_SYSTEM)/dex_preopt_config_merger.py 411 412 $(my_dexpreopt_config): $(my_dexpreopt_dep_configs) $(my_dexpreopt_config_merger) 413 $(my_dexpreopt_config): PRIVATE_MODULE := $(LOCAL_MODULE) 414 $(my_dexpreopt_config): PRIVATE_CONTENTS := $(json_contents) 415 $(my_dexpreopt_config): PRIVATE_DEP_CONFIGS := $(my_dexpreopt_dep_configs) 416 $(my_dexpreopt_config): PRIVATE_CONFIG_MERGER := $(my_dexpreopt_config_merger) 417 $(my_dexpreopt_config): 418 @echo "$(PRIVATE_MODULE) dexpreopt.config" 419 echo -e -n '$(subst $(newline),\n,$(subst ','\'',$(subst \,\\,$(PRIVATE_CONTENTS))))' > $@ 420 $(PRIVATE_CONFIG_MERGER) $@ $(PRIVATE_DEP_CONFIGS) 421 422$(eval $(call copy-one-file,$(my_dexpreopt_config),$(my_dexpreopt_config_for_postprocessing))) 423 424$(LOCAL_INSTALLED_MODULE): $(my_dexpreopt_config_for_postprocessing) 425 426# System server jars defined in Android.mk are deprecated. 427ifneq (true, $(PRODUCT_BROKEN_DEPRECATED_MK_SYSTEM_SERVER_JARS)) 428 ifneq (,$(filter %:$(LOCAL_MODULE), $(PRODUCT_SYSTEM_SERVER_JARS) $(PRODUCT_APEX_SYSTEM_SERVER_JARS))) 429 $(error System server jars defined in Android.mk are deprecated. \ 430 Convert $(LOCAL_MODULE) to Android.bp or temporarily disable the error \ 431 with 'PRODUCT_BROKEN_DEPRECATED_MK_SYSTEM_SERVER_JARS := true') 432 endif 433endif 434 435ifdef LOCAL_DEX_PREOPT 436 # System server jars must be copied into predefined locations expected by 437 # dexpreopt. Copy rule must be exposed to Ninja (as it uses these files as 438 # inputs), so it cannot go in dexpreopt.sh. 439 ifneq (,$(filter %:$(LOCAL_MODULE), $(PRODUCT_SYSTEM_SERVER_JARS))) 440 my_dexpreopt_jar_copy := $(OUT_DIR)/soong/system_server_dexjars/$(LOCAL_MODULE).jar 441 $(my_dexpreopt_jar_copy): PRIVATE_BUILT_MODULE := $(LOCAL_BUILT_MODULE) 442 $(my_dexpreopt_jar_copy): $(LOCAL_BUILT_MODULE) 443 @cp $(PRIVATE_BUILT_MODULE) $@ 444 endif 445 446 my_dexpreopt_script := $(intermediates)/dexpreopt.sh 447 my_dexpreopt_zip := $(intermediates)/dexpreopt.zip 448 .KATI_RESTAT: $(my_dexpreopt_script) 449 $(my_dexpreopt_script): PRIVATE_MODULE := $(LOCAL_MODULE) 450 $(my_dexpreopt_script): PRIVATE_GLOBAL_SOONG_CONFIG := $(DEX_PREOPT_SOONG_CONFIG_FOR_MAKE) 451 $(my_dexpreopt_script): PRIVATE_GLOBAL_CONFIG := $(DEX_PREOPT_CONFIG_FOR_MAKE) 452 $(my_dexpreopt_script): PRIVATE_MODULE_CONFIG := $(my_dexpreopt_config) 453 $(my_dexpreopt_script): $(DEXPREOPT_GEN) 454 $(my_dexpreopt_script): $(my_dexpreopt_jar_copy) 455 $(my_dexpreopt_script): $(my_dexpreopt_config) $(DEX_PREOPT_SOONG_CONFIG_FOR_MAKE) $(DEX_PREOPT_CONFIG_FOR_MAKE) 456 @echo "$(PRIVATE_MODULE) dexpreopt gen" 457 $(DEXPREOPT_GEN) \ 458 -global_soong $(PRIVATE_GLOBAL_SOONG_CONFIG) \ 459 -global $(PRIVATE_GLOBAL_CONFIG) \ 460 -module $(PRIVATE_MODULE_CONFIG) \ 461 -dexpreopt_script $@ \ 462 -out_dir $(OUT_DIR) 463 464 my_dexpreopt_deps := $(my_dex_jar) 465 my_dexpreopt_deps += $(if $(my_process_profile),$(LOCAL_DEX_PREOPT_PROFILE)) 466 my_dexpreopt_deps += \ 467 $(foreach lib, $(my_dexpreopt_libs) $(my_dexpreopt_libs_compat), \ 468 $(call intermediates-dir-for,JAVA_LIBRARIES,$(lib),,COMMON)/javalib.jar) 469 my_dexpreopt_deps += $(my_dexpreopt_images_deps) 470 my_dexpreopt_deps += $(DEXPREOPT_BOOTCLASSPATH_DEX_FILES) 471 ifeq ($(LOCAL_ENFORCE_USES_LIBRARIES),true) 472 my_dexpreopt_deps += $(intermediates.COMMON)/enforce_uses_libraries.status 473 endif 474 475 $(my_dexpreopt_zip): PRIVATE_MODULE := $(LOCAL_MODULE) 476 $(my_dexpreopt_zip): $(my_dexpreopt_deps) 477 $(my_dexpreopt_zip): | $(DEXPREOPT_GEN_DEPS) 478 $(my_dexpreopt_zip): .KATI_DEPFILE := $(my_dexpreopt_zip).d 479 $(my_dexpreopt_zip): PRIVATE_DEX := $(my_dex_jar) 480 $(my_dexpreopt_zip): PRIVATE_SCRIPT := $(my_dexpreopt_script) 481 $(my_dexpreopt_zip): $(my_dexpreopt_script) 482 @echo "$(PRIVATE_MODULE) dexpreopt" 483 bash $(PRIVATE_SCRIPT) $(PRIVATE_DEX) $@ 484 485 ifdef LOCAL_POST_INSTALL_CMD 486 # Add a shell command separator 487 LOCAL_POST_INSTALL_CMD += && 488 endif 489 490 LOCAL_POST_INSTALL_CMD += \ 491 for i in $$(zipinfo -1 $(my_dexpreopt_zip)); \ 492 do mkdir -p $(PRODUCT_OUT)/$$(dirname $$i); \ 493 done && \ 494 ( unzip -qoDD -d $(PRODUCT_OUT) $(my_dexpreopt_zip) 2>&1 | grep -v "zipfile is empty"; exit $${PIPESTATUS[0]} ) || \ 495 ( code=$$?; if [ $$code -ne 0 -a $$code -ne 1 ]; then exit $$code; fi ) 496 497 $(LOCAL_INSTALLED_MODULE): PRIVATE_POST_INSTALL_CMD := $(LOCAL_POST_INSTALL_CMD) 498 $(LOCAL_INSTALLED_MODULE): $(my_dexpreopt_zip) 499 500 $(my_all_targets): $(my_dexpreopt_zip) 501 502 my_dexpreopt_config := 503 my_dexpreopt_script := 504 my_dexpreopt_zip := 505 my_dexpreopt_config_for_postprocessing := 506endif # LOCAL_DEX_PREOPT 507endif # my_create_dexpreopt_config