• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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