1 # 2 # Copyright (C) 2008 The Android Open Source Project 3 # 4 # Licensed under the Apache License, Version 2.0 (the "License"); 5 # you may not use this file except in compliance with the License. 6 # You may obtain a copy of the License at 7 # 8 # http://www.apache.org/licenses/LICENSE-2.0 9 # 10 # Unless required by applicable law or agreed to in writing, software 11 # distributed under the License is distributed on an "AS IS" BASIS, 12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 # See the License for the specific language governing permissions and 14 # limitations under the License. 15 # 16 17 ########################################################### 18 ## Standard rules for building an application package. 19 ## 20 ## Additional inputs from base_rules.make: 21 ## LOCAL_PACKAGE_NAME: The name of the package; the directory 22 ## will be called this. 23 ## 24 ## MODULE, MODULE_PATH, and MODULE_SUFFIX will 25 ## be set for you. 26 ########################################################### 27 28 # If this makefile is being read from within an inheritance, 29 # use the new values. 30 skip_definition:= 31 ifdef LOCAL_PACKAGE_OVERRIDES 32 package_overridden := $(call set-inherited-package-variables) 33 ifeq ($(strip $(package_overridden)),) 34 skip_definition := true 35 endif 36 endif 37 38 ifndef skip_definition 39 40 LOCAL_PACKAGE_NAME := $(strip $(LOCAL_PACKAGE_NAME)) 41 ifeq ($(LOCAL_PACKAGE_NAME),) 42 $(error $(LOCAL_PATH): Package modules must define LOCAL_PACKAGE_NAME) 43 endif 44 45 ifneq ($(strip $(LOCAL_MODULE_SUFFIX)),) 46 $(error $(LOCAL_PATH): Package modules may not define LOCAL_MODULE_SUFFIX) 47 endif 48 LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) 49 50 ifneq ($(strip $(LOCAL_MODULE)),) 51 $(error $(LOCAL_PATH): Package modules may not define LOCAL_MODULE) 52 endif 53 LOCAL_MODULE := $(LOCAL_PACKAGE_NAME) 54 55 ifneq ($(strip $(LOCAL_MODULE_CLASS)),) 56 $(error $(LOCAL_PATH): Package modules may not set LOCAL_MODULE_CLASS) 57 endif 58 LOCAL_MODULE_CLASS := APPS 59 60 intermediates := $(call local-intermediates-dir) 61 intermediates.COMMON := $(call local-intermediates-dir,COMMON) 62 63 # Package LOCAL_MODULE_TAGS default to optional 64 LOCAL_MODULE_TAGS := $(strip $(LOCAL_MODULE_TAGS)) 65 ifeq ($(LOCAL_MODULE_TAGS),) 66 LOCAL_MODULE_TAGS := optional 67 endif 68 69 ifeq ($(filter tests, $(LOCAL_MODULE_TAGS)),) 70 # Force localization check if it's not tagged as tests. 71 LOCAL_AAPT_FLAGS := $(LOCAL_AAPT_FLAGS) -z 72 endif 73 74 need_compile_asset := 75 ifeq (,$(LOCAL_ASSET_DIR)) 76 LOCAL_ASSET_DIR := $(LOCAL_PATH)/assets 77 else 78 need_compile_asset := true 79 endif 80 81 # LOCAL_RESOURCE_DIR may point to resource generated during the build 82 need_compile_res := 83 ifeq (,$(LOCAL_RESOURCE_DIR)) 84 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res 85 else 86 need_compile_res := true 87 LOCAL_RESOURCE_DIR := $(foreach d,$(LOCAL_RESOURCE_DIR),$(call clean-path,$(d))) 88 endif 89 90 # If LOCAL_MODULE matches a rule in PRODUCT_MANIFEST_PACKAGE_NAME_OVERRIDES, 91 # override the manifest package name by the (first) rule matched 92 override_manifest_name := $(strip $(word 1,\ 93 $(foreach rule,$(PRODUCT_MANIFEST_PACKAGE_NAME_OVERRIDES),\ 94 $(eval _pkg_name_pat := $(call word-colon,1,$(rule)))\ 95 $(eval _manifest_name_pat := $(call word-colon,2,$(rule)))\ 96 $(if $(filter $(_pkg_name_pat),$(LOCAL_MODULE)),\ 97 $(patsubst $(_pkg_name_pat),$(_manifest_name_pat),$(LOCAL_MODULE))\ 98 )\ 99 )\ 100 )) 101 102 ifneq (,$(override_manifest_name)) 103 # Note: this can override LOCAL_MANIFEST_PACKAGE_NAME value set in Android.mk 104 LOCAL_MANIFEST_PACKAGE_NAME := $(override_manifest_name) 105 endif 106 107 include $(BUILD_SYSTEM)/force_aapt2.mk 108 109 # Process Support Library dependencies. 110 include $(BUILD_SYSTEM)/support_libraries.mk 111 112 # Determine whether auto-RRO is enabled for this package. 113 enforce_rro_enabled := 114 ifeq ($(PRODUCT_ENFORCE_RRO_TARGETS),*) 115 # * means all system APKs, so enable conditionally based on module path. 116 117 # Note that base_rules.mk has not yet been included, so it's likely that only 118 # one of LOCAL_MODULE_PATH and the LOCAL_X_MODULE flags has been set. 119 ifeq (,$(LOCAL_MODULE_PATH)) 120 non_system_module := $(filter true,\ 121 $(LOCAL_ODM_MODULE) \ 122 $(LOCAL_OEM_MODULE) \ 123 $(LOCAL_PRODUCT_MODULE) \ 124 $(LOCAL_PRODUCT_SERVICES_MODULE) \ 125 $(LOCAL_PROPRIETARY_MODULE) \ 126 $(LOCAL_VENDOR_MODULE)) 127 enforce_rro_enabled := $(if $(non_system_module),,true) 128 else ifneq ($(filter $(TARGET_OUT)/%,$(LOCAL_MODULE_PATH)),) 129 enforce_rro_enabled := true 130 endif 131 else ifneq (,$(filter $(LOCAL_PACKAGE_NAME), $(PRODUCT_ENFORCE_RRO_TARGETS))) 132 enforce_rro_enabled := true 133 endif 134 135 product_package_overlays := $(strip \ 136 $(wildcard $(foreach dir, $(PRODUCT_PACKAGE_OVERLAYS), \ 137 $(addprefix $(dir)/, $(LOCAL_RESOURCE_DIR))))) 138 device_package_overlays := $(strip \ 139 $(wildcard $(foreach dir, $(DEVICE_PACKAGE_OVERLAYS), \ 140 $(addprefix $(dir)/, $(LOCAL_RESOURCE_DIR))))) 141 142 static_resource_overlays := 143 runtime_resource_overlays_product := 144 runtime_resource_overlays_vendor := 145 ifdef enforce_rro_enabled 146 ifneq ($(PRODUCT_ENFORCE_RRO_EXCLUDED_OVERLAYS),) 147 # The PRODUCT_ exclusion variable applies to both inclusion variables.. 148 static_resource_overlays += $(filter $(addsuffix %,$(PRODUCT_ENFORCE_RRO_EXCLUDED_OVERLAYS)),$(product_package_overlays)) 149 static_resource_overlays += $(filter $(addsuffix %,$(PRODUCT_ENFORCE_RRO_EXCLUDED_OVERLAYS)),$(device_package_overlays)) 150 endif 151 runtime_resource_overlays_product := $(filter-out $(static_resource_overlays),$(product_package_overlays)) 152 runtime_resource_overlays_vendor := $(filter-out $(static_resource_overlays),$(device_package_overlays)) 153 else 154 static_resource_overlays := $(product_package_overlays) $(device_package_overlays) 155 endif 156 157 # Add the static overlays. Auto-RRO is created later, as it depends on 158 # other logic in this file. 159 LOCAL_RESOURCE_DIR := $(static_resource_overlays) $(LOCAL_RESOURCE_DIR) 160 161 all_assets := $(strip \ 162 $(foreach dir, $(LOCAL_ASSET_DIR), \ 163 $(addprefix $(dir)/, \ 164 $(patsubst assets/%,%, \ 165 $(call find-subdir-assets, $(dir)) \ 166 ) \ 167 ) \ 168 )) 169 170 ifneq ($(all_assets),) 171 need_compile_asset := true 172 endif 173 174 ifdef LOCAL_AAPT2_ONLY 175 LOCAL_USE_AAPT2 := true 176 endif 177 178 my_res_package := 179 ifeq ($(LOCAL_USE_AAPT2),true) 180 # In aapt2 the last takes precedence. 181 my_resource_dirs := $(call reverse-list,$(LOCAL_RESOURCE_DIR)) 182 my_res_dir := 183 my_overlay_res_dirs := 184 185 ifneq ($(strip $(LOCAL_STATIC_ANDROID_LIBRARIES) $(LOCAL_STATIC_JAVA_AAR_LIBRARIES)),) 186 # If we are using static android libraries, every source file becomes an overlay. 187 # This is to emulate old AAPT behavior which simulated library support. 188 my_res_dir := 189 my_overlay_res_dirs := $(my_resource_dirs) 190 else 191 # Without static libraries, the first directory is our directory, which can then be 192 # overlaid by the rest. (First directory in my_resource_dirs is last directory in 193 # $(LOCAL_RESOURCE_DIR) due to it being reversed. 194 my_res_dir := $(firstword $(my_resource_dirs)) 195 my_overlay_res_dirs := $(wordlist 2,999,$(my_resource_dirs)) 196 endif 197 198 my_overlay_resources := $(strip \ 199 $(foreach d,$(my_overlay_res_dirs),\ 200 $(addprefix $(d)/, \ 201 $(call find-subdir-assets,$(d))))) 202 203 my_res_resources := $(if $(my_res_dir),$(strip \ 204 $(addprefix $(my_res_dir)/, \ 205 $(call find-subdir-assets,$(my_res_dir))))) 206 207 all_resources := $(strip $(my_res_resources) $(my_overlay_resources)) 208 209 # The linked resource package. 210 my_res_package := $(intermediates)/package-res.apk 211 LOCAL_INTERMEDIATE_TARGETS += $(my_res_package) 212 213 ifeq ($(LOCAL_USE_AAPT2),true) 214 my_bundle_module := $(intermediates)/base.zip 215 LOCAL_INTERMEDIATE_TARGETS += $(my_bundle_module) 216 endif 217 218 # Always run aapt2, because we need to at least compile the AndroidManifest.xml. 219 need_compile_res := true 220 221 else # LOCAL_USE_AAPT2 222 all_resources := $(strip \ 223 $(foreach dir, $(LOCAL_RESOURCE_DIR), \ 224 $(addprefix $(dir)/, \ 225 $(patsubst res/%,%, \ 226 $(call find-subdir-assets,$(dir)) \ 227 ) \ 228 ) \ 229 )) 230 231 ifdef LOCAL_PACKAGE_SPLITS 232 LOCAL_AAPT_FLAGS += $(addprefix --split ,$(LOCAL_PACKAGE_SPLITS)) 233 endif 234 235 endif # LOCAL_USE_AAPT2 236 237 ifneq ($(all_resources),) 238 need_compile_res := true 239 endif 240 241 all_res_assets := $(strip $(all_assets) $(all_resources)) 242 243 # If no assets or resources were found, clear the directory variables so 244 # we don't try to build them. 245 ifneq (true,$(need_compile_asset)) 246 LOCAL_ASSET_DIR:= 247 endif 248 ifneq (true,$(need_compile_res)) 249 LOCAL_RESOURCE_DIR:= 250 R_file_stamp := 251 else 252 # Make sure that R_file_stamp inherits the proper PRIVATE vars. 253 # If R.stamp moves, be sure to update the framework makefile, 254 # which has intimate knowledge of its location. 255 R_file_stamp := $(intermediates.COMMON)/src/R.stamp 256 LOCAL_INTERMEDIATE_TARGETS += $(R_file_stamp) 257 endif 258 259 ifdef LOCAL_COMPRESSED_MODULE 260 ifneq (true,$(LOCAL_COMPRESSED_MODULE)) 261 $(call pretty-error, Unknown value for LOCAL_COMPRESSED_MODULE $(LOCAL_COMPRESSED_MODULE)) 262 endif 263 endif 264 265 ifdef LOCAL_COMPRESSED_MODULE 266 PACKAGES.$(LOCAL_PACKAGE_NAME).COMPRESSED := gz 267 LOCAL_BUILT_MODULE_STEM := package.apk.gz 268 LOCAL_INSTALLED_MODULE_STEM := $(LOCAL_MODULE).apk.gz 269 else # !LOCAL_COMPRESSED_MODULE 270 LOCAL_BUILT_MODULE_STEM := package.apk 271 LOCAL_INSTALLED_MODULE_STEM := $(LOCAL_MODULE).apk 272 endif 273 274 LOCAL_PROGUARD_ENABLED:=$(strip $(LOCAL_PROGUARD_ENABLED)) 275 ifndef LOCAL_PROGUARD_ENABLED 276 ifneq ($(DISABLE_PROGUARD),true) 277 LOCAL_PROGUARD_ENABLED :=full 278 endif 279 endif 280 ifeq ($(LOCAL_PROGUARD_ENABLED),disabled) 281 # the package explicitly request to disable proguard. 282 LOCAL_PROGUARD_ENABLED := 283 endif 284 proguard_options_file := 285 ifneq ($(LOCAL_PROGUARD_ENABLED),custom) 286 ifeq ($(need_compile_res),true) 287 proguard_options_file := $(intermediates.COMMON)/proguard_options 288 endif # need_compile_res 289 endif # !custom 290 LOCAL_PROGUARD_FLAGS := $(addprefix -include ,$(proguard_options_file)) $(LOCAL_PROGUARD_FLAGS) 291 292 ifeq (true,$(EMMA_INSTRUMENT)) 293 ifndef LOCAL_EMMA_INSTRUMENT 294 # No jacoco for test apks. 295 ifeq (,$(LOCAL_INSTRUMENTATION_FOR)) 296 LOCAL_EMMA_INSTRUMENT := true 297 endif # No test apk 298 endif # LOCAL_EMMA_INSTRUMENT is not set 299 else 300 LOCAL_EMMA_INSTRUMENT := false 301 endif # EMMA_INSTRUMENT is true 302 303 ifeq (true,$(LOCAL_EMMA_INSTRUMENT)) 304 ifeq (true,$(EMMA_INSTRUMENT_STATIC)) 305 ifneq ($(LOCAL_SRC_FILES)$(LOCAL_SRCJARS)$(LOCAL_STATIC_JAVA_LIBRARIES)$(LOCAL_SOURCE_FILES_ALL_GENERATED),) 306 # Only add jacocoagent if the package contains some java code 307 LOCAL_STATIC_JAVA_LIBRARIES += jacocoagent 308 # Exclude jacoco classes from proguard 309 LOCAL_PROGUARD_FLAGS += -include $(BUILD_SYSTEM)/proguard.jacoco.flags 310 endif # Contains java code 311 else 312 ifdef LOCAL_SDK_VERSION 313 ifdef TARGET_BUILD_APPS 314 # In unbundled build, merge the coverage library into the apk. 315 ifneq ($(LOCAL_SRC_FILES)$(LOCAL_STATIC_JAVA_LIBRARIES)$(LOCAL_SOURCE_FILES_ALL_GENERATED),) 316 # Only add jacocoagent if the package contains some java code 317 LOCAL_STATIC_JAVA_LIBRARIES += jacocoagent 318 # Exclude jacoco classes from proguard 319 LOCAL_PROGUARD_FLAGS += -include $(BUILD_SYSTEM)/proguard.jacoco.flags 320 endif # Contains java code 321 endif # TARGET_BUILD_APPS 322 endif # LOCAL_SDK_VERSION 323 endif # EMMA_INSTRUMENT_STATIC 324 endif # LOCAL_EMMA_INSTRUMENT 325 326 rs_compatibility_jni_libs := 327 328 # If the module is a compressed module, we don't pre-opt it because its final 329 # installation location will be the data partition. 330 ifdef LOCAL_COMPRESSED_MODULE 331 LOCAL_DEX_PREOPT := false 332 endif 333 334 # Default to use uncompressed native libraries in APKs if minSdkVersion >= marshmallow 335 ifndef LOCAL_USE_EMBEDDED_NATIVE_LIBS 336 LOCAL_USE_EMBEDDED_NATIVE_LIBS := $(call math_gt_or_eq, \ 337 $(patsubst $(PLATFORM_VERSION_CODENAME),100,$(call module-min-sdk-version)),23) 338 endif 339 340 include $(BUILD_SYSTEM)/android_manifest.mk 341 342 resource_export_package := 343 344 include $(BUILD_SYSTEM)/java_renderscript.mk 345 346 include $(BUILD_SYSTEM)/aapt_flags.mk 347 348 ifeq ($(need_compile_res),true) 349 350 ############################### 351 ## APK splits 352 built_apk_splits := 353 installed_apk_splits := 354 my_apk_split_configs := 355 356 ifdef LOCAL_PACKAGE_SPLITS 357 ifdef LOCAL_COMPRESSED_MODULE 358 $(error $(LOCAL_MODULE): LOCAL_COMPRESSED_MODULE is not currently supported for split installs) 359 endif # LOCAL_COMPRESSED_MODULE 360 361 my_apk_split_configs := $(LOCAL_PACKAGE_SPLITS) 362 my_split_suffixes := $(subst $(comma),_,$(my_apk_split_configs)) 363 built_apk_splits := $(foreach s,$(my_split_suffixes),$(intermediates)/package_$(s).apk) 364 endif 365 366 $(R_file_stamp) $(my_res_package): PRIVATE_AAPT_FLAGS := $(LOCAL_AAPT_FLAGS) 367 $(R_file_stamp) $(my_res_package): PRIVATE_TARGET_AAPT_CHARACTERISTICS := $(TARGET_AAPT_CHARACTERISTICS) 368 $(R_file_stamp) $(my_res_package): PRIVATE_MANIFEST_PACKAGE_NAME := $(LOCAL_MANIFEST_PACKAGE_NAME) 369 $(R_file_stamp) $(my_res_package): PRIVATE_MANIFEST_INSTRUMENTATION_FOR := $(LOCAL_MANIFEST_INSTRUMENTATION_FOR) 370 371 ############################### 372 ## AAPT/AAPT2 373 374 ifeq ($(LOCAL_USE_AAPT2),true) 375 my_compiled_res_base_dir := $(intermediates.COMMON)/flat-res 376 ifneq (,$(filter-out current,$(renderscript_target_api))) 377 ifneq ($(call math_gt_or_eq,$(renderscript_target_api),21),true) 378 my_generated_res_zips := $(rs_generated_res_zip) 379 endif # renderscript_target_api < 21 380 endif # renderscript_target_api is set 381 my_asset_dirs := $(LOCAL_ASSET_DIR) 382 my_full_asset_paths := $(all_assets) 383 384 # Add AAPT2 link specific flags. 385 $(my_res_package): PRIVATE_AAPT_FLAGS := $(LOCAL_AAPT_FLAGS) 386 ifndef LOCAL_AAPT_NAMESPACES 387 $(my_res_package): PRIVATE_AAPT_FLAGS += --no-static-lib-packages 388 endif 389 390 include $(BUILD_SYSTEM)/aapt2.mk 391 else # LOCAL_USE_AAPT2 392 393 my_srcjar := $(intermediates.COMMON)/aapt.srcjar 394 LOCAL_SRCJARS += $(my_srcjar) 395 $(R_file_stamp): PRIVATE_SRCJAR := $(my_srcjar) 396 $(R_file_stamp): PRIVATE_JAVA_GEN_DIR := $(intermediates.COMMON)/aapt 397 $(R_file_stamp): .KATI_IMPLICIT_OUTPUTS := $(my_srcjar) 398 # Since we don't know where the real R.java file is going to end up, 399 # we need to use another file to stand in its place. We'll just 400 # copy the generated file to src/R.stamp, which means it will 401 # have the same contents and timestamp as the actual file. 402 # 403 # At the same time, this will copy the R.java file to a central 404 # 'R' directory to make it easier to add the files to an IDE. 405 # 406 407 $(R_file_stamp): PRIVATE_RESOURCE_PUBLICS_OUTPUT := \ 408 $(intermediates.COMMON)/public_resources.xml 409 $(R_file_stamp): PRIVATE_PROGUARD_OPTIONS_FILE := $(proguard_options_file) 410 $(R_file_stamp): PRIVATE_RESOURCE_LIST := $(all_res_assets) 411 $(R_file_stamp): $(all_res_assets) $(full_android_manifest) $(rs_generated_res_zip) $(AAPT) $(SOONG_ZIP) | $(ACP) 412 @echo "target R.java/Manifest.java: $(PRIVATE_MODULE) ($@)" 413 @rm -rf $@ && mkdir -p $(dir $@) 414 $(create-resource-java-files) 415 $(call find-generated-R.java,$(PRIVATE_JAVA_GEN_DIR),$@) 416 417 $(proguard_options_file): $(R_file_stamp) 418 419 ifdef LOCAL_EXPORT_PACKAGE_RESOURCES 420 # Put this module's resources into a PRODUCT-agnositc package that 421 # other packages can use to build their own PRODUCT-agnostic R.java (etc.) 422 # files. 423 resource_export_package := $(intermediates.COMMON)/package-export.apk 424 $(R_file_stamp): $(resource_export_package) 425 426 # create-assets-package looks at PRODUCT_AAPT_CONFIG, but this target 427 # can't know anything about PRODUCT. Clear it out just for this target. 428 $(resource_export_package): PRIVATE_PRODUCT_AAPT_CONFIG := 429 $(resource_export_package): PRIVATE_PRODUCT_AAPT_PREF_CONFIG := 430 $(resource_export_package): PRIVATE_RESOURCE_LIST := $(all_res_assets) 431 $(resource_export_package): $(all_res_assets) $(full_android_manifest) $(rs_generated_res_zip) $(AAPT) 432 @echo "target Export Resources: $(PRIVATE_MODULE) ($@)" 433 $(call create-assets-package,$@) 434 endif 435 436 endif # LOCAL_USE_AAPT2 437 438 endif # need_compile_res 439 440 my_dex_jar := $(intermediates.COMMON)/dex.jar 441 442 called_from_package_internal := true 443 ################################# 444 include $(BUILD_SYSTEM)/java.mk 445 ################################# 446 called_from_package_internal := 447 448 ifeq ($(need_compile_res),true) 449 450 # Other modules should depend on the BUILT module if 451 # they want to use this module's R.java file. 452 $(LOCAL_BUILT_MODULE): $(R_file_stamp) 453 454 # The R.java file must exist by the time the java source 455 # list is generated 456 $(java_source_list_file): $(R_file_stamp) 457 458 endif # need_compile_res 459 460 LOCAL_SDK_RES_VERSION:=$(strip $(LOCAL_SDK_RES_VERSION)) 461 ifeq ($(LOCAL_SDK_RES_VERSION),) 462 LOCAL_SDK_RES_VERSION:=$(LOCAL_SDK_VERSION) 463 endif 464 465 $(LOCAL_INTERMEDIATE_TARGETS): \ 466 PRIVATE_ANDROID_MANIFEST := $(full_android_manifest) 467 468 framework_res_package_export := 469 470 ifneq ($(LOCAL_NO_STANDARD_LIBRARIES),true) 471 # Most packages should link against the resources defined by framework-res. 472 # Even if they don't have their own resources, they may use framework 473 # resources. 474 ifeq ($(LOCAL_SDK_RES_VERSION),core_current) 475 # core_current doesn't contain any framework resources. 476 else ifneq ($(filter-out current system_current test_current,$(LOCAL_SDK_RES_VERSION))$(if $(TARGET_BUILD_APPS_USE_PREBUILT_SDK),$(filter current system_current test_current,$(LOCAL_SDK_RES_VERSION))),) 477 # for released sdk versions, the platform resources were built into android.jar. 478 framework_res_package_export := \ 479 $(call resolve-prebuilt-sdk-jar-path,$(LOCAL_SDK_RES_VERSION)) 480 else # LOCAL_SDK_RES_VERSION 481 framework_res_package_export := \ 482 $(call intermediates-dir-for,APPS,framework-res,,COMMON)/package-export.apk 483 endif # LOCAL_SDK_RES_VERSION 484 endif # LOCAL_NO_STANDARD_LIBRARIES 485 486 all_library_res_package_exports := \ 487 $(framework_res_package_export) \ 488 $(foreach lib,$(LOCAL_RES_LIBRARIES),\ 489 $(call intermediates-dir-for,APPS,$(lib),,COMMON)/package-export.apk) 490 491 all_library_res_package_export_deps := \ 492 $(framework_res_package_export) \ 493 $(foreach lib,$(LOCAL_RES_LIBRARIES),\ 494 $(call intermediates-dir-for,APPS,$(lib),,COMMON)/src/R.stamp) 495 $(resource_export_package) $(R_file_stamp) $(LOCAL_BUILT_MODULE): $(all_library_res_package_export_deps) 496 $(LOCAL_INTERMEDIATE_TARGETS): \ 497 PRIVATE_AAPT_INCLUDES := $(all_library_res_package_exports) 498 499 ifeq ($(LOCAL_USE_AAPT2),true) 500 $(my_res_package) : $(all_library_res_package_export_deps) 501 endif 502 503 # These four are set above for $(R_stamp_file) and $(my_res_package), but 504 # $(LOCAL_BUILT_MODULE) is not set before java.mk, so they have to be set again 505 # here. 506 $(LOCAL_BUILT_MODULE): PRIVATE_AAPT_FLAGS := $(LOCAL_AAPT_FLAGS) 507 $(LOCAL_BUILT_MODULE): PRIVATE_TARGET_AAPT_CHARACTERISTICS := $(TARGET_AAPT_CHARACTERISTICS) 508 $(LOCAL_BUILT_MODULE): PRIVATE_MANIFEST_PACKAGE_NAME := $(LOCAL_MANIFEST_PACKAGE_NAME) 509 $(LOCAL_BUILT_MODULE): PRIVATE_MANIFEST_INSTRUMENTATION_FOR := $(LOCAL_MANIFEST_INSTRUMENTATION_FOR) 510 511 ifneq ($(full_classes_jar),) 512 $(LOCAL_BUILT_MODULE): PRIVATE_DEX_FILE := $(built_dex) 513 # Use the jarjar processed arhive as the initial package file. 514 $(LOCAL_BUILT_MODULE): PRIVATE_SOURCE_ARCHIVE := $(full_classes_pre_proguard_jar) 515 $(LOCAL_BUILT_MODULE): $(built_dex) 516 else 517 $(LOCAL_BUILT_MODULE): PRIVATE_DEX_FILE := 518 $(LOCAL_BUILT_MODULE): PRIVATE_SOURCE_ARCHIVE := 519 endif # full_classes_jar 520 521 include $(BUILD_SYSTEM)/install_jni_libs.mk 522 523 # Pick a key to sign the package with. If this package hasn't specified 524 # an explicit certificate, use the default. 525 # Secure release builds will have their packages signed after the fact, 526 # so it's ok for these private keys to be in the clear. 527 ifeq ($(LOCAL_CERTIFICATE),) 528 LOCAL_CERTIFICATE := $(DEFAULT_SYSTEM_DEV_CERTIFICATE) 529 endif 530 531 ifeq ($(LOCAL_CERTIFICATE),EXTERNAL) 532 # The special value "EXTERNAL" means that we will sign it with the 533 # default devkey, apply predexopt, but then expect the final .apk 534 # (after dexopting) to be signed by an outside tool. 535 LOCAL_CERTIFICATE := $(DEFAULT_SYSTEM_DEV_CERTIFICATE) 536 PACKAGES.$(LOCAL_PACKAGE_NAME).EXTERNAL_KEY := 1 537 endif 538 539 # If this is not an absolute certificate, assign it to a generic one. 540 ifeq ($(dir $(strip $(LOCAL_CERTIFICATE))),./) 541 LOCAL_CERTIFICATE := $(dir $(DEFAULT_SYSTEM_DEV_CERTIFICATE))$(LOCAL_CERTIFICATE) 542 endif 543 include $(BUILD_SYSTEM)/app_certificate_validate.mk 544 private_key := $(LOCAL_CERTIFICATE).pk8 545 certificate := $(LOCAL_CERTIFICATE).x509.pem 546 additional_certificates := $(foreach c,$(LOCAL_ADDITIONAL_CERTIFICATES), $(c).x509.pem $(c).pk8) 547 548 $(LOCAL_BUILT_MODULE): $(private_key) $(certificate) $(SIGNAPK_JAR) 549 $(LOCAL_BUILT_MODULE): PRIVATE_PRIVATE_KEY := $(private_key) 550 $(LOCAL_BUILT_MODULE): PRIVATE_CERTIFICATE := $(certificate) 551 552 PACKAGES.$(LOCAL_PACKAGE_NAME).PRIVATE_KEY := $(private_key) 553 PACKAGES.$(LOCAL_PACKAGE_NAME).CERTIFICATE := $(certificate) 554 555 $(LOCAL_BUILT_MODULE): $(additional_certificates) 556 $(LOCAL_BUILT_MODULE): PRIVATE_ADDITIONAL_CERTIFICATES := $(additional_certificates) 557 558 # Define the rule to build the actual package. 559 # PRIVATE_JNI_SHARED_LIBRARIES is a list of <abi>:<path_of_built_lib>. 560 $(LOCAL_BUILT_MODULE): PRIVATE_JNI_SHARED_LIBRARIES := $(jni_shared_libraries_with_abis) 561 # PRIVATE_JNI_SHARED_LIBRARIES_ABI is a list of ABI names. 562 $(LOCAL_BUILT_MODULE): PRIVATE_JNI_SHARED_LIBRARIES_ABI := $(jni_shared_libraries_abis) 563 ifneq ($(TARGET_BUILD_APPS),) 564 # Include all resources for unbundled apps. 565 LOCAL_AAPT_INCLUDE_ALL_RESOURCES := true 566 endif 567 ifeq ($(LOCAL_AAPT_INCLUDE_ALL_RESOURCES),true) 568 $(my_res_package) $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_CONFIG := 569 $(my_res_package) $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_PREF_CONFIG := 570 else 571 $(my_res_package) $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_CONFIG := $(PRODUCT_AAPT_CONFIG) 572 ifdef LOCAL_PACKAGE_SPLITS 573 $(my_res_package) $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_PREF_CONFIG := 574 else 575 $(my_res_package) $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_PREF_CONFIG := $(PRODUCT_AAPT_PREF_CONFIG) 576 endif 577 endif 578 579 # Run veridex on product, product_services and vendor modules. 580 # We skip it for unbundled app builds where we cannot build veridex. 581 module_run_appcompat := 582 ifeq (true,$(non_system_module)) 583 ifeq (,$(TARGET_BUILD_APPS)$(filter true,$(TARGET_BUILD_PDK))) # ! unbundled app build 584 ifneq ($(UNSAFE_DISABLE_HIDDENAPI_FLAGS),true) 585 module_run_appcompat := true 586 endif 587 endif 588 endif 589 590 ifeq ($(module_run_appcompat),true) 591 $(LOCAL_BUILT_MODULE) : $(appcompat-files) 592 $(LOCAL_BUILT_MODULE): PRIVATE_INSTALLED_MODULE := $(LOCAL_INSTALLED_MODULE) 593 endif 594 595 $(LOCAL_BUILT_MODULE): PRIVATE_RESOURCE_INTERMEDIATES_DIR := $(intermediates.COMMON)/resources 596 $(LOCAL_BUILT_MODULE) : $(jni_shared_libraries) 597 $(LOCAL_BUILT_MODULE) : $(JAR_ARGS) $(SOONG_ZIP) $(MERGE_ZIPS) $(ZIP2ZIP) 598 ifeq ($(LOCAL_USE_AAPT2),true) 599 $(LOCAL_BUILT_MODULE): PRIVATE_RES_PACKAGE := $(my_res_package) 600 $(LOCAL_BUILT_MODULE) : $(my_res_package) $(AAPT2) | $(ACP) 601 else 602 $(LOCAL_BUILT_MODULE): PRIVATE_RESOURCE_LIST := $(all_res_assets) 603 $(LOCAL_BUILT_MODULE) : $(all_res_assets) $(full_android_manifest) $(AAPT) $(ZIPALIGN) 604 endif # LOCAL_USE_AAPT2 605 ifdef LOCAL_COMPRESSED_MODULE 606 $(LOCAL_BUILT_MODULE) : $(MINIGZIP) 607 endif 608 ifeq (true, $(LOCAL_UNCOMPRESS_DEX)) 609 $(LOCAL_BUILT_MODULE) : $(ZIP2ZIP) 610 endif 611 ifneq ($(BUILD_PLATFORM_ZIP),) 612 $(LOCAL_BUILT_MODULE) : .KATI_IMPLICIT_OUTPUTS := $(dir $(LOCAL_BUILT_MODULE))package.dex.apk 613 endif 614 ifdef LOCAL_DEX_PREOPT 615 $(LOCAL_BUILT_MODULE) : PRIVATE_STRIP_SCRIPT := $(intermediates)/strip.sh 616 $(LOCAL_BUILT_MODULE) : $(intermediates)/strip.sh 617 $(LOCAL_BUILT_MODULE) : | $(DEXPREOPT_STRIP_DEPS) 618 $(LOCAL_BUILT_MODULE): .KATI_DEPFILE := $(LOCAL_BUILT_MODULE).d 619 endif 620 $(LOCAL_BUILT_MODULE): PRIVATE_USE_EMBEDDED_NATIVE_LIBS := $(LOCAL_USE_EMBEDDED_NATIVE_LIBS) 621 $(LOCAL_BUILT_MODULE): 622 @echo "target Package: $(PRIVATE_MODULE) ($@)" 623 rm -rf $@.parts 624 mkdir -p $@.parts 625 ifeq ($(LOCAL_USE_AAPT2),true) 626 cp -f $(PRIVATE_RES_PACKAGE) $@.parts/apk.zip 627 else # ! LOCAL_USE_AAPT2 628 $(call create-assets-package,$@.parts/apk.zip) 629 endif # LOCAL_USE_AAPT2 630 ifneq ($(jni_shared_libraries),) 631 $(call create-jni-shared-libs-package,$@.parts/jni.zip,$(PRIVATE_USE_EMBEDDED_NATIVE_LIBS)) 632 endif 633 ifeq ($(full_classes_jar),) 634 # We don't build jar, need to add the Java resources here. 635 $(if $(PRIVATE_EXTRA_JAR_ARGS),$(call create-java-resources-jar,$@.parts/res.zip)) 636 else # full_classes_jar 637 $(call create-dex-jar,$@.parts/dex.zip,$(PRIVATE_DEX_FILE)) 638 $(call extract-resources-jar,$@.parts/res.zip,$(PRIVATE_SOURCE_ARCHIVE)) 639 endif # full_classes_jar 640 $(MERGE_ZIPS) $@ $@.parts/*.zip 641 rm -rf $@.parts 642 ifeq (true, $(LOCAL_UNCOMPRESS_DEX)) 643 @# No need to align, sign-package below will do it. 644 $(uncompress-dexs) 645 endif 646 # Run appcompat before stripping the classes.dex file. 647 ifeq ($(module_run_appcompat),true) 648 ifeq ($(LOCAL_USE_AAPT2),true) 649 $(call appcompat-header, aapt2) 650 else 651 $(appcompat-header) 652 endif 653 $(run-appcompat) 654 endif # module_run_appcompat 655 ifdef LOCAL_DEX_PREOPT 656 ifneq ($(BUILD_PLATFORM_ZIP),) 657 @# Keep a copy of apk with classes.dex unstripped 658 $(hide) cp -f $@ $(dir $@)package.dex.apk 659 endif # BUILD_PLATFORM_ZIP 660 mv -f $@ $@.tmp 661 $(PRIVATE_STRIP_SCRIPT) $@.tmp $@ 662 endif # LOCAL_DEX_PREOPT 663 $(sign-package) 664 ifdef LOCAL_COMPRESSED_MODULE 665 $(compress-package) 666 endif # LOCAL_COMPRESSED_MODULE 667 668 ifeq ($(LOCAL_USE_AAPT2),true) 669 my_package_res_pb := $(intermediates)/package-res.pb.apk 670 $(my_package_res_pb): $(my_res_package) $(AAPT2) 671 $(AAPT2) convert --output-format proto $< -o $@ 672 673 $(my_bundle_module): $(my_package_res_pb) 674 $(my_bundle_module): PRIVATE_RES_PACKAGE := $(my_package_res_pb) 675 676 $(my_bundle_module): $(jni_shared_libraries) 677 $(my_bundle_module): PRIVATE_JNI_SHARED_LIBRARIES := $(jni_shared_libraries_with_abis) 678 $(my_bundle_module): PRIVATE_JNI_SHARED_LIBRARIES_ABI := $(jni_shared_libraries_abis) 679 680 ifneq ($(full_classes_jar),) 681 $(my_bundle_module): PRIVATE_DEX_FILE := $(built_dex) 682 # Use the jarjar processed archive as the initial package file. 683 $(my_bundle_module): PRIVATE_SOURCE_ARCHIVE := $(full_classes_pre_proguard_jar) 684 $(my_bundle_module): $(built_dex) 685 else 686 $(my_bundle_module): PRIVATE_DEX_FILE := 687 $(my_bundle_module): PRIVATE_SOURCE_ARCHIVE := 688 endif # full_classes_jar 689 690 $(my_bundle_module): $(MERGE_ZIPS) $(SOONG_ZIP) $(ZIP2ZIP) 691 @echo "target Bundle: $(PRIVATE_MODULE) ($@)" 692 rm -rf $@.parts 693 mkdir -p $@.parts 694 $(ZIP2ZIP) -i $(PRIVATE_RES_PACKAGE) -o $@.parts/apk.zip AndroidManifest.xml:manifest/AndroidManifest.xml resources.pb "res/**/*" "assets/**/*" 695 ifneq ($(jni_shared_libraries),) 696 $(call create-jni-shared-libs-package,$@.parts/jni.zip) 697 endif 698 ifeq ($(full_classes_jar),) 699 # We don't build jar, need to add the Java resources here. 700 $(if $(PRIVATE_EXTRA_JAR_ARGS),\ 701 $(call create-java-resources-jar,$@.parts/res.zip) && \ 702 $(ZIP2ZIP) -i $@.parts/res.zip -o $@.parts/res.zip.tmp "**/*:root/" && \ 703 mv -f $@.parts/res.zip.tmp $@.parts/res.zip) 704 else # full_classes_jar 705 $(call create-dex-jar,$@.parts/dex.zip,$(PRIVATE_DEX_FILE)) 706 $(ZIP2ZIP) -i $@.parts/dex.zip -o $@.parts/dex.zip.tmp "classes*.dex:dex/" 707 mv -f $@.parts/dex.zip.tmp $@.parts/dex.zip 708 $(call extract-resources-jar,$@.parts/res.zip,$(PRIVATE_SOURCE_ARCHIVE)) 709 $(ZIP2ZIP) -i $@.parts/res.zip -o $@.parts/res.zip.tmp "**/*:root/" 710 mv -f $@.parts/res.zip.tmp $@.parts/res.zip 711 endif # full_classes_jar 712 $(MERGE_ZIPS) $@ $@.parts/*.zip 713 rm -rf $@.parts 714 ALL_MODULES.$(LOCAL_MODULE).BUNDLE := $(my_bundle_module) 715 endif 716 717 ############################### 718 ## Build dpi-specific apks, if it's apps_only build. 719 ifdef TARGET_BUILD_APPS 720 ifdef LOCAL_DPI_VARIANTS 721 $(foreach d, $(LOCAL_DPI_VARIANTS), \ 722 $(eval my_dpi := $(d)) \ 723 $(eval include $(BUILD_SYSTEM)/dpi_specific_apk.mk)) 724 endif 725 endif 726 727 ############################### 728 ## Rule to build a jar containing dex files to dexpreopt without waiting for 729 ## the APK 730 ifdef LOCAL_DEX_PREOPT 731 $(my_dex_jar): PRIVATE_DEX_FILE := $(built_dex) 732 $(my_dex_jar): $(built_dex) 733 $(hide) mkdir -p $(dir $@) && rm -f $@ 734 $(call create-dex-jar,$@,$(PRIVATE_DEX_FILE)) 735 endif 736 737 ############################### 738 ## APK splits 739 ifdef LOCAL_PACKAGE_SPLITS 740 # The splits should have been built in the same command building the base apk. 741 # This rule just runs signing. 742 # Note that we explicily check the existence of the split apk and remove the 743 # built base apk if the split apk isn't there. 744 # That way the build system will rerun the aapt after the user changes the splitting parameters. 745 $(built_apk_splits): PRIVATE_PRIVATE_KEY := $(private_key) 746 $(built_apk_splits): PRIVATE_CERTIFICATE := $(certificate) 747 $(built_apk_splits) : $(intermediates)/%.apk : $(LOCAL_BUILT_MODULE) 748 $(hide) if [ ! -f $@ ]; then \ 749 echo 'No $@ generated, check your apk splitting parameters.' 1>&2; \ 750 rm $<; exit 1; \ 751 fi 752 $(sign-package) 753 754 # Rules to install the splits 755 installed_apk_splits := $(foreach s,$(my_split_suffixes),$(my_module_path)/$(LOCAL_MODULE)_$(s).apk) 756 $(installed_apk_splits) : $(my_module_path)/$(LOCAL_MODULE)_%.apk : $(intermediates)/package_%.apk 757 @echo "Install: $@" 758 $(copy-file-to-new-target) 759 760 # Register the additional built and installed files. 761 ALL_MODULES.$(my_register_name).INSTALLED += $(installed_apk_splits) 762 ALL_MODULES.$(my_register_name).BUILT_INSTALLED += \ 763 $(foreach s,$(my_split_suffixes),$(intermediates)/package_$(s).apk:$(my_module_path)/$(LOCAL_MODULE)_$(s).apk) 764 765 # Make sure to install the splits when you run "make <module_name>". 766 $(my_all_targets): $(installed_apk_splits) 767 768 ifdef LOCAL_COMPATIBILITY_SUITE 769 770 $(foreach suite, $(LOCAL_COMPATIBILITY_SUITE), \ 771 $(eval my_compat_dist_$(suite) := $(foreach dir, $(call compatibility_suite_dirs,$(suite)), \ 772 $(foreach s,$(my_split_suffixes),\ 773 $(call compat-copy-pair,$(intermediates)/package_$(s).apk,$(dir)/$(LOCAL_MODULE)_$(s).apk))))) 774 775 $(call create-suite-dependencies) 776 777 endif # LOCAL_COMPATIBILITY_SUITE 778 endif # LOCAL_PACKAGE_SPLITS 779 780 # Save information about this package 781 PACKAGES.$(LOCAL_PACKAGE_NAME).OVERRIDES := $(strip $(LOCAL_OVERRIDES_PACKAGES)) 782 PACKAGES.$(LOCAL_PACKAGE_NAME).RESOURCE_FILES := $(all_resources) 783 784 PACKAGES := $(PACKAGES) $(LOCAL_PACKAGE_NAME) 785 786 endif # skip_definition 787 788 # Reset internal variables. 789 all_res_assets := 790 791 ifneq (,$(runtime_resource_overlays_product)$(runtime_resource_overlays_vendor)) 792 ifdef LOCAL_EXPORT_PACKAGE_RESOURCES 793 enforce_rro_use_res_lib := true 794 else 795 enforce_rro_use_res_lib := false 796 endif 797 798 ifdef LOCAL_MANIFEST_PACKAGE_NAME 799 enforce_rro_is_manifest_package_name := true 800 enforce_rro_manifest_package_info := $(LOCAL_MANIFEST_PACKAGE_NAME) 801 else 802 enforce_rro_is_manifest_package_name := false 803 enforce_rro_manifest_package_info := $(full_android_manifest) 804 endif 805 806 ifdef runtime_resource_overlays_product 807 $(call append_enforce_rro_sources, \ 808 $(my_register_name), \ 809 $(enforce_rro_is_manifest_package_name), \ 810 $(enforce_rro_manifest_package_info), \ 811 $(enforce_rro_use_res_lib), \ 812 $(runtime_resource_overlays_product), \ 813 product \ 814 ) 815 endif 816 ifdef runtime_resource_overlays_vendor 817 $(call append_enforce_rro_sources, \ 818 $(my_register_name), \ 819 $(enforce_rro_is_manifest_package_name), \ 820 $(enforce_rro_manifest_package_info), \ 821 $(enforce_rro_use_res_lib), \ 822 $(runtime_resource_overlays_vendor), \ 823 vendor \ 824 ) 825 endif 826 endif 827