blob: d1fb4e899224174007c9f30dd764a32d9b58b043 [file] [log] [blame]
Brian Carlstromced4bff2013-11-14 23:44:56 -08001# 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
Nicolas Geoffray3972a472018-01-09 11:46:30 +00003# Output variables: LOCAL_DEX_PREOPT, LOCAL_UNCOMPRESS_DEX, built_odex,
4# dexpreopt_boot_jar_module
5
Victor Hsiehe53dd7b2018-10-22 11:25:05 -07006ifeq (true,$(LOCAL_PREFER_INTEGRITY))
7 LOCAL_UNCOMPRESS_DEX := true
8else
9 LOCAL_UNCOMPRESS_DEX :=
10endif
11
Nicolas Geoffray3972a472018-01-09 11:46:30 +000012# We explicitly uncompress APKs of privileged apps, and used by
13# privileged apps
Nicolas Geoffray3972a472018-01-09 11:46:30 +000014ifneq (true,$(DONT_UNCOMPRESS_PRIV_APPS_DEXS))
Colin Cross0a69bb62018-10-09 16:14:44 -070015 ifeq (true,$(LOCAL_PRIVILEGED_MODULE))
Nicolas Geoffray3972a472018-01-09 11:46:30 +000016 LOCAL_UNCOMPRESS_DEX := true
Colin Crossc18757e2018-10-09 16:33:27 -070017 endif
18
Nicolas Geoffray3972a472018-01-09 11:46:30 +000019 ifneq (,$(filter $(PRODUCT_LOADED_BY_PRIVILEGED_MODULES), $(LOCAL_MODULE)))
20 LOCAL_UNCOMPRESS_DEX := true
Colin Crossc18757e2018-10-09 16:33:27 -070021 endif
Nicolas Geoffray3972a472018-01-09 11:46:30 +000022endif # DONT_UNCOMPRESS_PRIV_APPS_DEXS
Brian Carlstromced4bff2013-11-14 23:44:56 -080023
24# Setting LOCAL_DEX_PREOPT based on WITH_DEXPREOPT, LOCAL_DEX_PREOPT, etc
25LOCAL_DEX_PREOPT := $(strip $(LOCAL_DEX_PREOPT))
Colin Crossc18757e2018-10-09 16:33:27 -070026ifndef LOCAL_DEX_PREOPT # LOCAL_DEX_PREOPT undefined
27 LOCAL_DEX_PREOPT := $(DEX_PREOPT_DEFAULT)
Colin Crossfc782ad2018-10-22 13:44:27 -070028endif
29
Brian Carlstromced4bff2013-11-14 23:44:56 -080030ifeq (false,$(LOCAL_DEX_PREOPT))
31 LOCAL_DEX_PREOPT :=
32endif
Colin Cross0a69bb62018-10-09 16:14:44 -070033
Colin Crossc18757e2018-10-09 16:33:27 -070034# Only enable preopt for non tests.
35ifneq (,$(filter $(LOCAL_MODULE_TAGS),tests))
36 LOCAL_DEX_PREOPT :=
37endif
38
39# If we have product-specific config for this module?
Colin Cross3aa2f8f2018-10-05 14:41:04 -070040ifneq (,$(filter $(LOCAL_MODULE),$(DEXPREOPT_DISABLED_MODULES)))
Colin Crossc18757e2018-10-09 16:33:27 -070041 LOCAL_DEX_PREOPT :=
42endif
43
44# Disable preopt for TARGET_BUILD_APPS
45ifneq (,$(TARGET_BUILD_APPS))
46 LOCAL_DEX_PREOPT :=
47endif
48
49# Disable preopt if not WITH_DEXPREOPT
50ifneq (true,$(WITH_DEXPREOPT))
51 LOCAL_DEX_PREOPT :=
52endif
53
Brian Carlstromced4bff2013-11-14 23:44:56 -080054ifdef LOCAL_UNINSTALLABLE_MODULE
Colin Cross0a69bb62018-10-09 16:14:44 -070055 LOCAL_DEX_PREOPT :=
Brian Carlstromced4bff2013-11-14 23:44:56 -080056endif
Colin Cross0a69bb62018-10-09 16:14:44 -070057
Colin Crossf229de42017-10-05 16:01:00 -070058ifeq (,$(strip $(built_dex)$(my_prebuilt_src_file)$(LOCAL_SOONG_DEX_JAR))) # contains no java code
Colin Cross0a69bb62018-10-09 16:14:44 -070059 LOCAL_DEX_PREOPT :=
Brian Carlstromced4bff2013-11-14 23:44:56 -080060endif
Colin Cross0a69bb62018-10-09 16:14:44 -070061
Mathieu Chartier418258c2017-08-28 14:19:35 -070062# if WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY=true and module is not in boot class path skip
63# Also preopt system server jars since selinux prevents system server from loading anything from
64# /data. If we don't do this they will need to be extracted which is not favorable for RAM usage
Mathieu Chartier0fbb8362017-09-15 13:40:48 -070065# or performance. If my_preopt_for_extracted_apk is true, we ignore the only preopt boot image
66# options.
67ifneq (true,$(my_preopt_for_extracted_apk))
Colin Cross0a69bb62018-10-09 16:14:44 -070068 ifeq (true,$(WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY))
69 ifeq ($(filter $(PRODUCT_SYSTEM_SERVER_JARS) $(DEXPREOPT_BOOT_JARS_MODULES),$(LOCAL_MODULE)),)
70 LOCAL_DEX_PREOPT :=
71 endif
72 endif
Mathieu Chartier0fbb8362017-09-15 13:40:48 -070073endif
74
Calin Juravlef99ab752018-04-19 20:32:57 -070075my_process_profile :=
76my_profile_is_text_listing :=
Mathieu Chartier192b91c2017-02-08 18:30:31 -080077
Mathieu Chartier6324c2d2017-05-05 17:22:37 -070078ifeq (false,$(WITH_DEX_PREOPT_GENERATE_PROFILE))
Colin Cross0a69bb62018-10-09 16:14:44 -070079 LOCAL_DEX_PREOPT_GENERATE_PROFILE := false
Mathieu Chartier6324c2d2017-05-05 17:22:37 -070080endif
81
82ifndef LOCAL_DEX_PREOPT_GENERATE_PROFILE
Colin Cross0a69bb62018-10-09 16:14:44 -070083 # If LOCAL_DEX_PREOPT_GENERATE_PROFILE is not defined, default it based on the existence of the
84 # profile class listing. TODO: Use product specific directory here.
85 my_classes_directory := $(PRODUCT_DEX_PREOPT_PROFILE_DIR)
86 LOCAL_DEX_PREOPT_PROFILE := $(my_classes_directory)/$(LOCAL_MODULE).prof
Calin Juravle7d701352018-04-25 15:25:46 -070087
Colin Cross0a69bb62018-10-09 16:14:44 -070088 ifneq (,$(wildcard $(LOCAL_DEX_PREOPT_PROFILE)))
89 my_process_profile := true
Colin Crosse736c582018-11-16 21:26:33 -080090 my_profile_is_text_listing :=
Colin Cross0a69bb62018-10-09 16:14:44 -070091 endif
Calin Juravlef99ab752018-04-19 20:32:57 -070092else
Colin Cross0a69bb62018-10-09 16:14:44 -070093 my_process_profile := $(LOCAL_DEX_PREOPT_GENERATE_PROFILE)
94 my_profile_is_text_listing := true
95 LOCAL_DEX_PREOPT_PROFILE := $(LOCAL_DEX_PREOPT_PROFILE_CLASS_LISTING)
Mathieu Chartier6324c2d2017-05-05 17:22:37 -070096endif
Mathieu Chartier48762292017-09-13 22:08:45 -070097
Calin Juravlef99ab752018-04-19 20:32:57 -070098ifeq (true,$(my_process_profile))
Colin Cross0a69bb62018-10-09 16:14:44 -070099 ifndef LOCAL_DEX_PREOPT_PROFILE
100 $(call pretty-error,Must have specified class listing (LOCAL_DEX_PREOPT_PROFILE))
101 endif
102 ifeq (,$(dex_preopt_profile_src_file))
103 $(call pretty-error, Internal error: dex_preopt_profile_src_file must be set)
104 endif
Mathieu Chartier48762292017-09-13 22:08:45 -0700105endif
106
Colin Crosse736c582018-11-16 21:26:33 -0800107# If LOCAL_ENFORCE_USES_LIBRARIES is not set, default to true if either of LOCAL_USES_LIBRARIES or
108# LOCAL_OPTIONAL_USES_LIBRARIES are specified.
109ifeq (,$(LOCAL_ENFORCE_USES_LIBRARIES))
110 # Will change the default to true unconditionally in the future.
111 ifneq (,$(LOCAL_OPTIONAL_USES_LIBRARIES))
112 LOCAL_ENFORCE_USES_LIBRARIES := true
113 endif
114 ifneq (,$(LOCAL_USES_LIBRARIES))
115 LOCAL_ENFORCE_USES_LIBRARIES := true
116 endif
117endif
118
119my_dexpreopt_archs :=
120
Mathieu Chartier48762292017-09-13 22:08:45 -0700121ifdef LOCAL_DEX_PREOPT
Colin Crosse736c582018-11-16 21:26:33 -0800122 ifeq ($(LOCAL_MODULE_CLASS),JAVA_LIBRARIES)
123 my_module_multilib := $(LOCAL_MULTILIB)
124 # If the module is not an SDK library and it's a system server jar, only preopt the primary arch.
125 my_filtered_lib_name := $(patsubst %.impl,%,$(LOCAL_MODULE))
126 ifeq (,$(filter $(JAVA_SDK_LIBRARIES),$(my_filtered_lib_name)))
127 # For a Java library, by default we build odex for both 1st arch and 2nd arch.
128 # But it can be overridden with "LOCAL_MULTILIB := first".
129 ifneq (,$(filter $(PRODUCT_SYSTEM_SERVER_JARS),$(LOCAL_MODULE)))
130 # For system server jars, we build for only "first".
Colin Cross0a69bb62018-10-09 16:14:44 -0700131 my_module_multilib := first
132 endif
Colin Cross0a69bb62018-10-09 16:14:44 -0700133 endif
134
Colin Crosse736c582018-11-16 21:26:33 -0800135 # Only preopt primary arch for translated arch since there is only an image there.
136 ifeq ($(TARGET_TRANSLATE_2ND_ARCH),true)
137 my_module_multilib := first
Mathieu Chartierc5536ff2017-05-05 14:59:06 -0700138 endif
Nicolas Geoffrayb08ada12017-03-22 12:36:05 +0000139
Colin Crosse736c582018-11-16 21:26:33 -0800140 # #################################################
141 # Odex for the 1st arch
142 my_dexpreopt_archs += $(TARGET_ARCH)
143 # Odex for the 2nd arch
144 ifdef TARGET_2ND_ARCH
145 ifneq ($(TARGET_TRANSLATE_2ND_ARCH),true)
146 ifneq (first,$(my_module_multilib))
147 my_dexpreopt_archs += $(TARGET_2ND_ARCH)
148 endif # my_module_multilib is not first.
149 endif # TARGET_TRANSLATE_2ND_ARCH not true
150 endif # TARGET_2ND_ARCH
151 # #################################################
152 else # must be APPS
153 # The preferred arch
154 # Save the module multilib since setup_one_odex modifies it.
155 my_2nd_arch_prefix := $(LOCAL_2ND_ARCH_VAR_PREFIX)
156 my_dexpreopt_archs += $(TARGET_$(my_2nd_arch_prefix)ARCH)
157 ifdef TARGET_2ND_ARCH
158 ifeq ($(my_module_multilib),both)
159 # The non-preferred arch
160 my_2nd_arch_prefix := $(if $(LOCAL_2ND_ARCH_VAR_PREFIX),,$(TARGET_2ND_ARCH_VAR_PREFIX))
161 my_dexpreopt_archs += $(TARGET_$(my_2nd_arch_prefix)ARCH)
162 endif # LOCAL_MULTILIB is both
163 endif # TARGET_2ND_ARCH
164 endif # LOCAL_MODULE_CLASS
Andreas Gampecdfe46b2018-03-19 14:28:15 -0700165
Colin Cross0a69bb62018-10-09 16:14:44 -0700166 # Record dex-preopt config.
167 DEXPREOPT.$(LOCAL_MODULE).DEX_PREOPT := $(LOCAL_DEX_PREOPT)
168 DEXPREOPT.$(LOCAL_MODULE).MULTILIB := $(LOCAL_MULTILIB)
169 DEXPREOPT.$(LOCAL_MODULE).DEX_PREOPT_FLAGS := $(LOCAL_DEX_PREOPT_FLAGS)
170 DEXPREOPT.$(LOCAL_MODULE).PRIVILEGED_MODULE := $(LOCAL_PRIVILEGED_MODULE)
171 DEXPREOPT.$(LOCAL_MODULE).VENDOR_MODULE := $(LOCAL_VENDOR_MODULE)
172 DEXPREOPT.$(LOCAL_MODULE).TARGET_ARCH := $(LOCAL_MODULE_TARGET_ARCH)
Colin Cross0a69bb62018-10-09 16:14:44 -0700173 DEXPREOPT.$(LOCAL_MODULE).INSTALLED_STRIPPED := $(LOCAL_INSTALLED_MODULE)
174 DEXPREOPT.MODULES.$(LOCAL_MODULE_CLASS) := $(sort \
175 $(DEXPREOPT.MODULES.$(LOCAL_MODULE_CLASS)) $(LOCAL_MODULE))
Ying Wangfbc5b9f2016-03-11 10:32:01 -0800176
Colin Crosse736c582018-11-16 21:26:33 -0800177 $(call json_start)
178
179 $(call add_json_str, Name, $(LOCAL_MODULE))
180 $(call add_json_str, DexLocation, $(patsubst $(PRODUCT_OUT)%,%,$(LOCAL_INSTALLED_MODULE)))
181 $(call add_json_str, BuildPath, $(LOCAL_BUILT_MODULE))
182 $(call add_json_str, DexPath, $$1)
183 $(call add_json_str, ExtrasOutputPath, $$2)
184 $(call add_json_bool, PreferIntegrity, $(filter true,$(LOCAL_PREFER_INTEGRITY)))
185 $(call add_json_bool, Privileged, $(filter true,$(LOCAL_PRIVILEGED_MODULE)))
186 $(call add_json_bool, UncompressedDex, $(filter true,$(LOCAL_UNCOMPRESS_DEX)))
187 $(call add_json_bool, HasApkLibraries, $(LOCAL_APK_LIBRARIES))
188 $(call add_json_list, PreoptFlags, $(LOCAL_DEX_PREOPT_FLAGS))
189 $(call add_json_str, ProfileClassListing, $(if $(my_process_profile),$(LOCAL_DEX_PREOPT_PROFILE)))
190 $(call add_json_bool, ProfileIsTextListing, $(my_profile_is_text_listing))
191 $(call add_json_bool, EnforceUsesLibraries, $(LOCAL_ENFORCE_USES_LIBRARIES))
192 $(call add_json_list, OptionalUsesLibraries, $(LOCAL_OPTIONAL_USES_LIBRARIES))
193 $(call add_json_list, UsesLibraries, $(LOCAL_USES_LIBRARIES))
194 $(call add_json_map, LibraryPaths)
195 $(foreach lib,$(sort $(LOCAL_USES_LIBRARIES) $(LOCAL_OPTIONAL_USES_LIBRARIES) org.apache.http.legacy.impl),\
196 $(call add_json_str, $(lib), $(call intermediates-dir-for,JAVA_LIBRARIES,$(lib),,COMMON)/javalib.jar))
197 $(call end_json_map)
198 $(call add_json_list, Archs, $(my_dexpreopt_archs))
199 $(call add_json_str, DexPreoptImageLocation, $(LOCAL_DEX_PREOPT_IMAGE_LOCATION))
200 $(call add_json_bool, PreoptExtractedApk, $(my_preopt_for_extracted_apk))
201 $(call add_json_bool, NoCreateAppImage, $(filter false,$(LOCAL_DEX_PREOPT_APP_IMAGE)))
202 $(call add_json_bool, ForceCreateAppImage, $(filter true,$(LOCAL_DEX_PREOPT_APP_IMAGE)))
203 $(call add_json_bool, PresignedPrebuilt, $(filter PRESIGNED,$(LOCAL_CERTIFICATE)))
204
205 $(call add_json_str, StripInputPath, $$1)
206 $(call add_json_str, StripOutputPath, $$2)
207
208 $(call json_end)
209
210 my_dexpreopt_config := $(intermediates)/dexpreopt.config
211 my_dexpreopt_script := $(intermediates)/dexpreopt.sh
212 my_strip_script := $(intermediates)/strip.sh
213 my_dexpreopt_zip := $(intermediates)/dexpreopt.zip
214
215 $(my_dexpreopt_config): PRIVATE_MODULE := $(LOCAL_MODULE)
216 $(my_dexpreopt_config): PRIVATE_CONTENTS := $(json_contents)
217 $(my_dexpreopt_config):
218 @echo "$(PRIVATE_MODULE) dexpreopt.config"
219 echo -e -n '$(subst $(newline),\n,$(subst ','\'',$(subst \,\\,$(PRIVATE_CONTENTS))))' > $@
220
221 .KATI_RESTAT: $(my_dexpreopt_script) $(my_strip_script)
222 $(my_dexpreopt_script): PRIVATE_MODULE := $(LOCAL_MODULE)
223 $(my_dexpreopt_script): PRIVATE_GLOBAL_CONFIG := $(PRODUCT_OUT)/dexpreopt.config
224 $(my_dexpreopt_script): PRIVATE_MODULE_CONFIG := $(my_dexpreopt_config)
225 $(my_dexpreopt_script): PRIVATE_STRIP_SCRIPT := $(my_strip_script)
226 $(my_dexpreopt_script): .KATI_IMPLICIT_OUTPUTS := $(my_strip_script)
227 $(my_dexpreopt_script): $(DEXPREOPT_GEN)
228 $(my_dexpreopt_script): $(my_dexpreopt_config) $(PRODUCT_OUT)/dexpreopt.config
229 @echo "$(PRIVATE_MODULE) dexpreopt gen"
230 $(DEXPREOPT_GEN) -global $(PRIVATE_GLOBAL_CONFIG) -module $(PRIVATE_MODULE_CONFIG) \
231 -extras_zip '"$$2"' -dexpreopt_script $@ -strip_script $(PRIVATE_STRIP_SCRIPT)
232
233 my_dexpreopt_deps := $(my_dex_jar)
234 my_dexpreopt_deps += $(if $(my_process_profile),$(LOCAL_DEX_PREOPT_PROFILE))
235 my_dexpreopt_deps += \
236 $(foreach lib,$(sort $(LOCAL_USES_LIBRARIES) $(LOCAL_OPTIONAL_USES_LIBRARIES) org.apache.http.legacy.impl),\
237 $(call intermediates-dir-for,JAVA_LIBRARIES,$(lib),,COMMON)/javalib.jar)
238 my_dexpreopt_deps += $(LOCAL_DEX_PREOPT_IMAGE_LOCATION)
239 # TODO: default boot images
240
241 $(my_dexpreopt_zip): PRIVATE_MODULE := $(LOCAL_MODULE)
242 $(my_dexpreopt_zip): $(my_dexpreopt_deps)
243 $(my_dexpreopt_zip): | $(DEXPREOPT_GEN_DEPS)
244 $(my_dexpreopt_zip): .KATI_DEPFILE := $(my_dexpreopt_zip).d
245 $(my_dexpreopt_zip): PRIVATE_DEX := $(my_dex_jar)
246 $(my_dexpreopt_zip): PRIVATE_SCRIPT := $(my_dexpreopt_script)
247 $(my_dexpreopt_zip): $(my_dexpreopt_script)
248 @echo "$(PRIVATE_MODULE) dexpreopt"
249 bash $(PRIVATE_SCRIPT) $(PRIVATE_DEX) $@
250
251 ifdef LOCAL_POST_INSTALL_CMD
252 # Add a shell command separator
253 LOCAL_POST_INSTALL_CMD += &&
254 endif
255
256 LOCAL_POST_INSTALL_CMD += unzip -qo -d $(PRODUCT_OUT) $(my_dexpreopt_zip)
257 $(LOCAL_INSTALLED_MODULE): PRIVATE_POST_INSTALL_CMD := $(LOCAL_POST_INSTALL_CMD)
258 $(LOCAL_INSTALLED_MODULE): $(my_dexpreopt_zip)
259
260 $(my_all_targets): $(my_dexpreopt_zip)
261
262 my_dexpreopt_config :=
263 my_dexpreopt_script :=
264 my_strip_script :=
265 my_dexpreopt_zip :=
Brian Carlstromced4bff2013-11-14 23:44:56 -0800266endif # LOCAL_DEX_PREOPT