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 package_resource_overlays := $(strip \ 91 $(wildcard $(foreach dir, $(PRODUCT_PACKAGE_OVERLAYS), \ 92 $(addprefix $(dir)/, $(LOCAL_RESOURCE_DIR)))) \ 93 $(wildcard $(foreach dir, $(DEVICE_PACKAGE_OVERLAYS), \ 94 $(addprefix $(dir)/, $(LOCAL_RESOURCE_DIR))))) 95 96 enforce_rro_enabled := 97 ifneq ($(PRODUCT_ENFORCE_RRO_TARGETS),) 98 ifneq ($(package_resource_overlays),) 99 ifeq ($(PRODUCT_ENFORCE_RRO_TARGETS),*) 100 enforce_rro_enabled := true 101 else ifneq (,$(filter $(LOCAL_PACKAGE_NAME), $(PRODUCT_ENFORCE_RRO_TARGETS))) 102 enforce_rro_enabled := true 103 endif 104 endif 105 106 ifdef enforce_rro_enabled 107 ifeq (,$(LOCAL_MODULE_PATH)) 108 ifeq (true,$(LOCAL_PROPRIETARY_MODULE)) 109 enforce_rro_enabled := 110 else ifeq (true,$(LOCAL_OEM_MODULE)) 111 enforce_rro_enabled := 112 else ifeq (true,$(LOCAL_ODM_MODULE)) 113 enforce_rro_enabled := 114 else ifeq (true,$(LOCAL_PRODUCT_MODULE)) 115 enforce_rro_enabled := 116 endif 117 else ifeq ($(filter $(TARGET_OUT)/%,$(LOCAL_MODULE_PATH)),) 118 enforce_rro_enabled := 119 endif 120 endif 121 endif 122 123 ifdef enforce_rro_enabled 124 ifneq ($(PRODUCT_ENFORCE_RRO_EXCLUDED_OVERLAYS),) 125 static_only_resource_overlays := $(filter $(addsuffix %,$(PRODUCT_ENFORCE_RRO_EXCLUDED_OVERLAYS)),$(package_resource_overlays)) 126 ifneq ($(static_only_resource_overlays),) 127 package_resource_overlays := $(filter-out $(static_only_resource_overlays),$(package_resource_overlays)) 128 LOCAL_RESOURCE_DIR := $(static_only_resource_overlays) $(LOCAL_RESOURCE_DIR) 129 ifeq ($(package_resource_overlays),) 130 enforce_rro_enabled := 131 endif 132 endif 133 endif 134 else 135 LOCAL_RESOURCE_DIR := $(package_resource_overlays) $(LOCAL_RESOURCE_DIR) 136 endif 137 138 all_assets := $(strip \ 139 $(foreach dir, $(LOCAL_ASSET_DIR), \ 140 $(addprefix $(dir)/, \ 141 $(patsubst assets/%,%, \ 142 $(call find-subdir-assets, $(dir)) \ 143 ) \ 144 ) \ 145 )) 146 147 ifneq ($(all_assets),) 148 need_compile_asset := true 149 endif 150 151 ifdef LOCAL_AAPT2_ONLY 152 LOCAL_USE_AAPT2 := true 153 endif 154 155 my_res_package := 156 ifdef LOCAL_USE_AAPT2 157 # In aapt2 the last takes precedence. 158 my_resource_dirs := $(call reverse-list,$(LOCAL_RESOURCE_DIR)) 159 my_res_dir := 160 my_overlay_res_dirs := 161 162 ifneq ($(LOCAL_STATIC_ANDROID_LIBRARIES),) 163 # If we are using static android libraries, every source file becomes an overlay. 164 # This is to emulate old AAPT behavior which simulated library support. 165 my_res_dir := 166 my_overlay_res_dirs := $(my_resource_dirs) 167 else 168 # Without static libraries, the first directory is our directory, which can then be 169 # overlaid by the rest. (First directory in my_resource_dirs is last directory in 170 # $(LOCAL_RESOURCE_DIR) due to it being reversed. 171 my_res_dir := $(firstword $(my_resource_dirs)) 172 my_overlay_res_dirs := $(wordlist 2,999,$(my_resource_dirs)) 173 endif 174 175 my_overlay_resources := $(strip \ 176 $(foreach d,$(my_overlay_res_dirs),\ 177 $(addprefix $(d)/, \ 178 $(call find-subdir-assets,$(d))))) 179 180 my_res_resources := $(if $(my_res_dir),$(strip \ 181 $(addprefix $(my_res_dir)/, \ 182 $(call find-subdir-assets,$(my_res_dir))))) 183 184 all_resources := $(strip $(my_res_resources) $(my_overlay_resources)) 185 186 # The linked resource package. 187 my_res_package := $(intermediates)/package-res.apk 188 LOCAL_INTERMEDIATE_TARGETS += $(my_res_package) 189 190 # Always run aapt2, because we need to at least compile the AndroidManifest.xml. 191 need_compile_res := true 192 193 else # LOCAL_USE_AAPT2 194 all_resources := $(strip \ 195 $(foreach dir, $(LOCAL_RESOURCE_DIR), \ 196 $(addprefix $(dir)/, \ 197 $(patsubst res/%,%, \ 198 $(call find-subdir-assets,$(dir)) \ 199 ) \ 200 ) \ 201 )) 202 203 ifdef LOCAL_PACKAGE_SPLITS 204 LOCAL_AAPT_FLAGS += $(addprefix --split ,$(LOCAL_PACKAGE_SPLITS)) 205 endif 206 207 endif # LOCAL_USE_AAPT2 208 209 ifneq ($(all_resources),) 210 need_compile_res := true 211 endif 212 213 all_res_assets := $(strip $(all_assets) $(all_resources)) 214 215 # If no assets or resources were found, clear the directory variables so 216 # we don't try to build them. 217 ifneq (true,$(need_compile_asset)) 218 LOCAL_ASSET_DIR:= 219 endif 220 ifneq (true,$(need_compile_res)) 221 LOCAL_RESOURCE_DIR:= 222 R_file_stamp := 223 else 224 # Make sure that R_file_stamp inherits the proper PRIVATE vars. 225 # If R.stamp moves, be sure to update the framework makefile, 226 # which has intimate knowledge of its location. 227 R_file_stamp := $(intermediates.COMMON)/src/R.stamp 228 LOCAL_INTERMEDIATE_TARGETS += $(R_file_stamp) 229 endif 230 231 ifdef LOCAL_COMPRESSED_MODULE 232 ifneq (true,$(LOCAL_COMPRESSED_MODULE)) 233 $(call pretty-error, Unknown value for LOCAL_COMPRESSED_MODULE $(LOCAL_COMPRESSED_MODULE)) 234 endif 235 endif 236 237 ifdef LOCAL_COMPRESSED_MODULE 238 PACKAGES.$(LOCAL_PACKAGE_NAME).COMPRESSED := gz 239 LOCAL_BUILT_MODULE_STEM := package.apk.gz 240 LOCAL_INSTALLED_MODULE_STEM := $(LOCAL_MODULE).apk.gz 241 else # !LOCAL_COMPRESSED_MODULE 242 LOCAL_BUILT_MODULE_STEM := package.apk 243 LOCAL_INSTALLED_MODULE_STEM := $(LOCAL_MODULE).apk 244 endif 245 246 LOCAL_PROGUARD_ENABLED:=$(strip $(LOCAL_PROGUARD_ENABLED)) 247 ifndef LOCAL_PROGUARD_ENABLED 248 ifneq ($(DISABLE_PROGUARD),true) 249 LOCAL_PROGUARD_ENABLED :=full 250 endif 251 endif 252 ifeq ($(LOCAL_PROGUARD_ENABLED),disabled) 253 # the package explicitly request to disable proguard. 254 LOCAL_PROGUARD_ENABLED := 255 endif 256 proguard_options_file := 257 ifneq ($(LOCAL_PROGUARD_ENABLED),custom) 258 ifeq ($(need_compile_res),true) 259 proguard_options_file := $(intermediates.COMMON)/proguard_options 260 endif # need_compile_res 261 endif # !custom 262 LOCAL_PROGUARD_FLAGS := $(addprefix -include ,$(proguard_options_file)) $(LOCAL_PROGUARD_FLAGS) 263 264 ifeq (true,$(EMMA_INSTRUMENT)) 265 ifndef LOCAL_EMMA_INSTRUMENT 266 # No jacoco for test apks. 267 ifeq (,$(LOCAL_INSTRUMENTATION_FOR)) 268 LOCAL_EMMA_INSTRUMENT := true 269 endif # No test apk 270 endif # LOCAL_EMMA_INSTRUMENT is not set 271 else 272 LOCAL_EMMA_INSTRUMENT := false 273 endif # EMMA_INSTRUMENT is true 274 275 ifeq (true,$(LOCAL_EMMA_INSTRUMENT)) 276 ifeq (true,$(EMMA_INSTRUMENT_STATIC)) 277 ifneq ($(LOCAL_SRC_FILES)$(LOCAL_SRCJARS)$(LOCAL_STATIC_JAVA_LIBRARIES)$(LOCAL_SOURCE_FILES_ALL_GENERATED),) 278 # Only add jacocoagent if the package contains some java code 279 LOCAL_STATIC_JAVA_LIBRARIES += jacocoagent 280 # Exclude jacoco classes from proguard 281 LOCAL_PROGUARD_FLAGS += -include $(BUILD_SYSTEM)/proguard.jacoco.flags 282 endif # Contains java code 283 else 284 ifdef LOCAL_SDK_VERSION 285 ifdef TARGET_BUILD_APPS 286 # In unbundled build, merge the coverage library into the apk. 287 ifneq ($(LOCAL_SRC_FILES)$(LOCAL_STATIC_JAVA_LIBRARIES)$(LOCAL_SOURCE_FILES_ALL_GENERATED),) 288 # Only add jacocoagent if the package contains some java code 289 LOCAL_STATIC_JAVA_LIBRARIES += jacocoagent 290 # Exclude jacoco classes from proguard 291 LOCAL_PROGUARD_FLAGS += -include $(BUILD_SYSTEM)/proguard.jacoco.flags 292 endif # Contains java code 293 endif # TARGET_BUILD_APPS 294 endif # LOCAL_SDK_VERSION 295 endif # EMMA_INSTRUMENT_STATIC 296 endif # LOCAL_EMMA_INSTRUMENT 297 298 rs_compatibility_jni_libs := 299 300 ifeq ($(LOCAL_DATA_BINDING),true) 301 data_binding_intermediates := $(intermediates.COMMON)/data-binding 302 303 LOCAL_JAVACFLAGS += -processorpath $(DATA_BINDING_COMPILER) -s $(data_binding_intermediates)/anno-src 304 305 LOCAL_STATIC_JAVA_LIBRARIES += databinding-baselibrary 306 LOCAL_STATIC_JAVA_AAR_LIBRARIES += databinding-library databinding-adapters 307 308 data_binding_res_in := $(LOCAL_RESOURCE_DIR) 309 data_binding_res_out := $(data_binding_intermediates)/res 310 311 # Replace with the processed merged res dir. 312 LOCAL_RESOURCE_DIR := $(data_binding_res_out) 313 314 LOCAL_AAPT_FLAGS += --auto-add-overlay --extra-packages com.android.databinding.library 315 endif # LOCAL_DATA_BINDING 316 317 # Process Support Library dependencies. 318 include $(BUILD_SYSTEM)/support_libraries.mk 319 320 # If the module is a compressed module, we don't pre-opt it because its final 321 # installation location will be the data partition. 322 ifdef LOCAL_COMPRESSED_MODULE 323 LOCAL_DEX_PREOPT := false 324 endif 325 326 include $(BUILD_SYSTEM)/android_manifest.mk 327 328 resource_export_package := 329 330 include $(BUILD_SYSTEM)/java_renderscript.mk 331 332 include $(BUILD_SYSTEM)/aapt_flags.mk 333 334 ifeq ($(need_compile_res),true) 335 336 ############################### 337 ## APK splits 338 built_apk_splits := 339 installed_apk_splits := 340 my_apk_split_configs := 341 342 ifdef LOCAL_PACKAGE_SPLITS 343 ifdef LOCAL_COMPRESSED_MODULE 344 $(error $(LOCAL_MODULE): LOCAL_COMPRESSED_MODULE is not currently supported for split installs) 345 endif # LOCAL_COMPRESSED_MODULE 346 347 my_apk_split_configs := $(LOCAL_PACKAGE_SPLITS) 348 my_split_suffixes := $(subst $(comma),_,$(my_apk_split_configs)) 349 built_apk_splits := $(foreach s,$(my_split_suffixes),$(intermediates)/package_$(s).apk) 350 endif 351 352 $(R_file_stamp) $(my_res_package): PRIVATE_AAPT_FLAGS := $(LOCAL_AAPT_FLAGS) 353 $(R_file_stamp) $(my_res_package): PRIVATE_TARGET_AAPT_CHARACTERISTICS := $(TARGET_AAPT_CHARACTERISTICS) 354 $(R_file_stamp) $(my_res_package): PRIVATE_MANIFEST_PACKAGE_NAME := $(LOCAL_MANIFEST_PACKAGE_NAME) 355 $(R_file_stamp) $(my_res_package): PRIVATE_MANIFEST_INSTRUMENTATION_FOR := $(LOCAL_MANIFEST_INSTRUMENTATION_FOR) 356 357 ############################### 358 ## AAPT/AAPT2 359 360 ifdef LOCAL_USE_AAPT2 361 my_compiled_res_base_dir := $(intermediates.COMMON)/flat-res 362 ifneq (,$(renderscript_target_api)) 363 ifneq ($(call math_gt_or_eq,$(renderscript_target_api),21),true) 364 my_generated_res_zips := $(rs_generated_res_zip) 365 endif # renderscript_target_api < 21 366 endif # renderscript_target_api is set 367 my_asset_dirs := $(LOCAL_ASSET_DIR) 368 my_full_asset_paths := $(all_assets) 369 370 # Add AAPT2 link specific flags. 371 $(my_res_package): PRIVATE_AAPT_FLAGS := $(LOCAL_AAPT_FLAGS) 372 ifndef LOCAL_AAPT_NAMESPACES 373 $(my_res_package): PRIVATE_AAPT_FLAGS += --no-static-lib-packages 374 endif 375 376 include $(BUILD_SYSTEM)/aapt2.mk 377 else # LOCAL_USE_AAPT2 378 379 my_srcjar := $(intermediates.COMMON)/aapt.srcjar 380 LOCAL_SRCJARS += $(my_srcjar) 381 $(R_file_stamp): PRIVATE_SRCJAR := $(my_srcjar) 382 $(R_file_stamp): PRIVATE_JAVA_GEN_DIR := $(intermediates.COMMON)/aapt 383 $(R_file_stamp): .KATI_IMPLICIT_OUTPUTS := $(my_srcjar) 384 # Since we don't know where the real R.java file is going to end up, 385 # we need to use another file to stand in its place. We'll just 386 # copy the generated file to src/R.stamp, which means it will 387 # have the same contents and timestamp as the actual file. 388 # 389 # At the same time, this will copy the R.java file to a central 390 # 'R' directory to make it easier to add the files to an IDE. 391 # 392 393 $(R_file_stamp): PRIVATE_RESOURCE_PUBLICS_OUTPUT := \ 394 $(intermediates.COMMON)/public_resources.xml 395 $(R_file_stamp): PRIVATE_PROGUARD_OPTIONS_FILE := $(proguard_options_file) 396 $(R_file_stamp): PRIVATE_RESOURCE_LIST := $(all_res_assets) 397 $(R_file_stamp): $(all_res_assets) $(full_android_manifest) $(rs_generated_res_zip) $(AAPT) $(SOONG_ZIP) | $(ACP) 398 @echo "target R.java/Manifest.java: $(PRIVATE_MODULE) ($@)" 399 @rm -rf $@ && mkdir -p $(dir $@) 400 $(create-resource-java-files) 401 $(call find-generated-R.java,$(PRIVATE_JAVA_GEN_DIR),$@) 402 403 $(proguard_options_file): $(R_file_stamp) 404 405 ifdef LOCAL_EXPORT_PACKAGE_RESOURCES 406 # Put this module's resources into a PRODUCT-agnositc package that 407 # other packages can use to build their own PRODUCT-agnostic R.java (etc.) 408 # files. 409 resource_export_package := $(intermediates.COMMON)/package-export.apk 410 $(R_file_stamp): $(resource_export_package) 411 412 # add-assets-to-package looks at PRODUCT_AAPT_CONFIG, but this target 413 # can't know anything about PRODUCT. Clear it out just for this target. 414 $(resource_export_package): PRIVATE_PRODUCT_AAPT_CONFIG := 415 $(resource_export_package): PRIVATE_PRODUCT_AAPT_PREF_CONFIG := 416 $(resource_export_package): PRIVATE_RESOURCE_LIST := $(all_res_assets) 417 $(resource_export_package): $(all_res_assets) $(full_android_manifest) $(rs_generated_res_zip) $(AAPT) 418 @echo "target Export Resources: $(PRIVATE_MODULE) ($@)" 419 $(create-empty-package) 420 $(add-assets-to-package) 421 endif 422 423 endif # LOCAL_USE_AAPT2 424 425 endif # need_compile_res 426 427 called_from_package_internal := true 428 ################################# 429 include $(BUILD_SYSTEM)/java.mk 430 ################################# 431 called_from_package_internal := 432 433 ifeq ($(need_compile_res),true) 434 435 # Other modules should depend on the BUILT module if 436 # they want to use this module's R.java file. 437 $(LOCAL_BUILT_MODULE): $(R_file_stamp) 438 439 # The R.java file must exist by the time the java source 440 # list is generated 441 $(java_source_list_file): $(R_file_stamp) 442 443 endif # need_compile_res 444 445 LOCAL_SDK_RES_VERSION:=$(strip $(LOCAL_SDK_RES_VERSION)) 446 ifeq ($(LOCAL_SDK_RES_VERSION),) 447 LOCAL_SDK_RES_VERSION:=$(LOCAL_SDK_VERSION) 448 endif 449 450 $(LOCAL_INTERMEDIATE_TARGETS): \ 451 PRIVATE_ANDROID_MANIFEST := $(full_android_manifest) 452 453 ifeq ($(LOCAL_DATA_BINDING),true) 454 data_binding_stamp := $(data_binding_intermediates)/data-binding.stamp 455 $(data_binding_stamp): PRIVATE_INTERMEDIATES := $(data_binding_intermediates) 456 $(data_binding_stamp): PRIVATE_MANIFEST := $(full_android_manifest) 457 # Generate code into $(LOCAL_INTERMEDIATE_SOURCE_DIR) so that the generated .java files 458 # will be automatically picked up by function compile-java. 459 $(data_binding_stamp): PRIVATE_SRC_OUT := $(LOCAL_INTERMEDIATE_SOURCE_DIR)/data-binding 460 $(data_binding_stamp): PRIVATE_XML_OUT := $(data_binding_intermediates)/xml 461 $(data_binding_stamp): PRIVATE_RES_OUT := $(data_binding_res_out) 462 $(data_binding_stamp): PRIVATE_RES_IN := $(data_binding_res_in) 463 $(data_binding_stamp): PRIVATE_ANNO_SRC_DIR := $(data_binding_intermediates)/anno-src 464 465 $(data_binding_stamp) : $(all_res_assets) $(full_android_manifest) \ 466 $(DATA_BINDING_COMPILER) 467 @echo "Data-binding process: $@" 468 @rm -rf $(PRIVATE_INTERMEDIATES) $(PRIVATE_SRC_OUT) && \ 469 mkdir -p $(PRIVATE_INTERMEDIATES) $(PRIVATE_SRC_OUT) \ 470 $(PRIVATE_XML_OUT) $(PRIVATE_RES_OUT) $(PRIVATE_ANNO_SRC_DIR) 471 $(hide) $(JAVA) -classpath $(DATA_BINDING_COMPILER) android.databinding.tool.MakeCopy \ 472 $(PRIVATE_MANIFEST) $(PRIVATE_SRC_OUT) $(PRIVATE_XML_OUT) $(PRIVATE_RES_OUT) $(PRIVATE_RES_IN) 473 $(hide) touch $@ 474 475 # Make sure the data-binding process happens before javac and generation of R.java. 476 $(R_file_stamp): $(data_binding_stamp) 477 $(java_source_list_file): $(data_binding_stamp) 478 $(full_classes_compiled_jar): $(data_binding_stamp) 479 endif # LOCAL_DATA_BINDING 480 481 framework_res_package_export := 482 483 ifneq ($(LOCAL_NO_STANDARD_LIBRARIES),true) 484 # Most packages should link against the resources defined by framework-res. 485 # Even if they don't have their own resources, they may use framework 486 # resources. 487 ifeq ($(LOCAL_SDK_RES_VERSION),core_current) 488 # core_current doesn't contain any framework resources. 489 else ifneq ($(filter-out current system_current test_current,$(LOCAL_SDK_RES_VERSION))$(if $(TARGET_BUILD_APPS),$(filter current system_current test_current,$(LOCAL_SDK_RES_VERSION))),) 490 # for released sdk versions, the platform resources were built into android.jar. 491 framework_res_package_export := \ 492 $(HISTORICAL_SDK_VERSIONS_ROOT)/$(LOCAL_SDK_RES_VERSION)/android.jar 493 else # LOCAL_SDK_RES_VERSION 494 framework_res_package_export := \ 495 $(call intermediates-dir-for,APPS,framework-res,,COMMON)/package-export.apk 496 endif # LOCAL_SDK_RES_VERSION 497 endif # LOCAL_NO_STANDARD_LIBRARIES 498 499 all_library_res_package_exports := \ 500 $(framework_res_package_export) \ 501 $(foreach lib,$(LOCAL_RES_LIBRARIES),\ 502 $(call intermediates-dir-for,APPS,$(lib),,COMMON)/package-export.apk) 503 504 all_library_res_package_export_deps := \ 505 $(framework_res_package_export) \ 506 $(foreach lib,$(LOCAL_RES_LIBRARIES),\ 507 $(call intermediates-dir-for,APPS,$(lib),,COMMON)/src/R.stamp) 508 $(resource_export_package) $(R_file_stamp) $(LOCAL_BUILT_MODULE): $(all_library_res_package_export_deps) 509 $(LOCAL_INTERMEDIATE_TARGETS): \ 510 PRIVATE_AAPT_INCLUDES := $(all_library_res_package_exports) 511 512 ifdef LOCAL_USE_AAPT2 513 $(my_res_package) : $(all_library_res_package_export_deps) 514 endif 515 516 # These four are set above for $(R_stamp_file) and $(my_res_package), but 517 # $(LOCAL_BUILT_MODULE) is not set before java.mk, so they have to be set again 518 # here. 519 $(LOCAL_BUILT_MODULE): PRIVATE_AAPT_FLAGS := $(LOCAL_AAPT_FLAGS) 520 $(LOCAL_BUILT_MODULE): PRIVATE_TARGET_AAPT_CHARACTERISTICS := $(TARGET_AAPT_CHARACTERISTICS) 521 $(LOCAL_BUILT_MODULE): PRIVATE_MANIFEST_PACKAGE_NAME := $(LOCAL_MANIFEST_PACKAGE_NAME) 522 $(LOCAL_BUILT_MODULE): PRIVATE_MANIFEST_INSTRUMENTATION_FOR := $(LOCAL_MANIFEST_INSTRUMENTATION_FOR) 523 524 ifneq ($(full_classes_jar),) 525 $(LOCAL_BUILT_MODULE): PRIVATE_DEX_FILE := $(built_dex) 526 # Use the jarjar processed arhive as the initial package file. 527 $(LOCAL_BUILT_MODULE): PRIVATE_SOURCE_ARCHIVE := $(full_classes_pre_proguard_jar) 528 $(LOCAL_BUILT_MODULE): $(built_dex) 529 else 530 $(LOCAL_BUILT_MODULE): PRIVATE_DEX_FILE := 531 $(LOCAL_BUILT_MODULE): PRIVATE_SOURCE_ARCHIVE := 532 endif # full_classes_jar 533 534 include $(BUILD_SYSTEM)/install_jni_libs.mk 535 536 # Pick a key to sign the package with. If this package hasn't specified 537 # an explicit certificate, use the default. 538 # Secure release builds will have their packages signed after the fact, 539 # so it's ok for these private keys to be in the clear. 540 ifeq ($(LOCAL_CERTIFICATE),) 541 LOCAL_CERTIFICATE := $(DEFAULT_SYSTEM_DEV_CERTIFICATE) 542 endif 543 544 ifeq ($(LOCAL_CERTIFICATE),EXTERNAL) 545 # The special value "EXTERNAL" means that we will sign it with the 546 # default devkey, apply predexopt, but then expect the final .apk 547 # (after dexopting) to be signed by an outside tool. 548 LOCAL_CERTIFICATE := $(DEFAULT_SYSTEM_DEV_CERTIFICATE) 549 PACKAGES.$(LOCAL_PACKAGE_NAME).EXTERNAL_KEY := 1 550 endif 551 552 # If this is not an absolute certificate, assign it to a generic one. 553 ifeq ($(dir $(strip $(LOCAL_CERTIFICATE))),./) 554 LOCAL_CERTIFICATE := $(dir $(DEFAULT_SYSTEM_DEV_CERTIFICATE))$(LOCAL_CERTIFICATE) 555 endif 556 private_key := $(LOCAL_CERTIFICATE).pk8 557 certificate := $(LOCAL_CERTIFICATE).x509.pem 558 additional_certificates := $(foreach c,$(LOCAL_ADDITIONAL_CERTIFICATES), $(c).x509.pem $(c).pk8) 559 560 $(LOCAL_BUILT_MODULE): $(private_key) $(certificate) $(SIGNAPK_JAR) 561 $(LOCAL_BUILT_MODULE): PRIVATE_PRIVATE_KEY := $(private_key) 562 $(LOCAL_BUILT_MODULE): PRIVATE_CERTIFICATE := $(certificate) 563 564 PACKAGES.$(LOCAL_PACKAGE_NAME).PRIVATE_KEY := $(private_key) 565 PACKAGES.$(LOCAL_PACKAGE_NAME).CERTIFICATE := $(certificate) 566 567 $(LOCAL_BUILT_MODULE): $(additional_certificates) 568 $(LOCAL_BUILT_MODULE): PRIVATE_ADDITIONAL_CERTIFICATES := $(additional_certificates) 569 570 # Define the rule to build the actual package. 571 # PRIVATE_JNI_SHARED_LIBRARIES is a list of <abi>:<path_of_built_lib>. 572 $(LOCAL_BUILT_MODULE): PRIVATE_JNI_SHARED_LIBRARIES := $(jni_shared_libraries_with_abis) 573 # PRIVATE_JNI_SHARED_LIBRARIES_ABI is a list of ABI names. 574 $(LOCAL_BUILT_MODULE): PRIVATE_JNI_SHARED_LIBRARIES_ABI := $(jni_shared_libraries_abis) 575 ifneq ($(TARGET_BUILD_APPS),) 576 # Include all resources for unbundled apps. 577 LOCAL_AAPT_INCLUDE_ALL_RESOURCES := true 578 endif 579 ifeq ($(LOCAL_AAPT_INCLUDE_ALL_RESOURCES),true) 580 $(my_res_package) $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_CONFIG := 581 $(my_res_package) $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_PREF_CONFIG := 582 else 583 $(my_res_package) $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_CONFIG := $(PRODUCT_AAPT_CONFIG) 584 ifdef LOCAL_PACKAGE_SPLITS 585 $(my_res_package) $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_PREF_CONFIG := 586 else 587 $(my_res_package) $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_PREF_CONFIG := $(PRODUCT_AAPT_PREF_CONFIG) 588 endif 589 endif 590 591 $(LOCAL_BUILT_MODULE): PRIVATE_DONT_DELETE_JAR_DIRS := $(LOCAL_DONT_DELETE_JAR_DIRS) 592 $(LOCAL_BUILT_MODULE): PRIVATE_RESOURCE_INTERMEDIATES_DIR := $(intermediates.COMMON)/resources 593 $(LOCAL_BUILT_MODULE): PRIVATE_FULL_CLASSES_JAR := $(full_classes_jar) 594 $(LOCAL_BUILT_MODULE) : $(jni_shared_libraries) 595 $(LOCAL_BUILT_MODULE) : $(JAR_ARGS) 596 ifdef LOCAL_USE_AAPT2 597 $(LOCAL_BUILT_MODULE): PRIVATE_RES_PACKAGE := $(my_res_package) 598 $(LOCAL_BUILT_MODULE) : $(my_res_package) $(AAPT2) | $(ACP) 599 else 600 $(LOCAL_BUILT_MODULE): PRIVATE_RESOURCE_LIST := $(all_res_assets) 601 $(LOCAL_BUILT_MODULE) : $(all_res_assets) $(full_android_manifest) $(AAPT) $(ZIPALIGN) 602 endif # LOCAL_USE_AAPT2 603 ifdef LOCAL_COMPRESSED_MODULE 604 $(LOCAL_BUILT_MODULE) : $(MINIGZIP) 605 endif 606 @echo "target Package: $(PRIVATE_MODULE) ($@)" 607 ifdef LOCAL_USE_AAPT2 608 $(call copy-file-to-new-target) 609 else # ! LOCAL_USE_AAPT2 610 $(if $(PRIVATE_SOURCE_ARCHIVE),\ 611 $(call initialize-package-file,$(PRIVATE_SOURCE_ARCHIVE),$@),\ 612 $(create-empty-package)) 613 $(add-assets-to-package) 614 endif # LOCAL_USE_AAPT2 615 ifneq ($(jni_shared_libraries),) 616 $(add-jni-shared-libs-to-package) 617 endif 618 ifeq ($(full_classes_jar),) 619 # We don't build jar, need to add the Java resources here. 620 $(if $(PRIVATE_EXTRA_JAR_ARGS),$(call add-java-resources-to,$@)) 621 else # full_classes_jar 622 $(add-dex-to-package) 623 ifdef LOCAL_USE_AAPT2 624 $(call add-jar-resources-to-package,$@,$(PRIVATE_FULL_CLASSES_JAR),$(PRIVATE_RESOURCE_INTERMEDIATES_DIR)) 625 endif 626 endif # full_classes_jar 627 ifeq (true, $(LOCAL_UNCOMPRESS_DEX)) 628 @# No need to align, sign-package below will do it. 629 $(uncompress-dexs) 630 endif 631 ifdef LOCAL_DEX_PREOPT 632 ifneq ($(BUILD_PLATFORM_ZIP),) 633 @# Keep a copy of apk with classes.dex unstripped 634 $(hide) cp -f $@ $(dir $@)package.dex.apk 635 endif # BUILD_PLATFORM_ZIP 636 ifneq (nostripping,$(LOCAL_DEX_PREOPT)) 637 $(call dexpreopt-remove-classes.dex,$@) 638 endif 639 endif # LOCAL_DEX_PREOPT 640 $(sign-package) 641 ifdef LOCAL_COMPRESSED_MODULE 642 $(compress-package) 643 endif # LOCAL_COMPRESSED_MODULE 644 645 ############################### 646 ## Build dpi-specific apks, if it's apps_only build. 647 ifdef TARGET_BUILD_APPS 648 ifdef LOCAL_DPI_VARIANTS 649 $(foreach d, $(LOCAL_DPI_VARIANTS), \ 650 $(eval my_dpi := $(d)) \ 651 $(eval include $(BUILD_SYSTEM)/dpi_specific_apk.mk)) 652 endif 653 endif 654 655 ############################### 656 ## Rule to build the odex file 657 ifdef LOCAL_DEX_PREOPT 658 $(built_odex): PRIVATE_DEX_FILE := $(built_dex) 659 # Use pattern rule - we may have multiple built odex files. 660 $(built_odex) : $(dir $(LOCAL_BUILT_MODULE))% : $(built_dex) 661 $(hide) mkdir -p $(dir $@) && rm -f $@ 662 $(add-dex-to-package) 663 ifeq (true, $(LOCAL_UNCOMPRESS_DEX)) 664 $(uncompress-dexs) 665 $(align-package) 666 endif 667 $(hide) mv $@ $@.input 668 $(call dexpreopt-one-file,$@.input,$@) 669 $(hide) rm $@.input 670 endif 671 672 ############################### 673 ## APK splits 674 ifdef LOCAL_PACKAGE_SPLITS 675 # The splits should have been built in the same command building the base apk. 676 # This rule just runs signing. 677 # Note that we explicily check the existence of the split apk and remove the 678 # built base apk if the split apk isn't there. 679 # That way the build system will rerun the aapt after the user changes the splitting parameters. 680 $(built_apk_splits): PRIVATE_PRIVATE_KEY := $(private_key) 681 $(built_apk_splits): PRIVATE_CERTIFICATE := $(certificate) 682 $(built_apk_splits) : $(intermediates)/%.apk : $(LOCAL_BUILT_MODULE) 683 $(hide) if [ ! -f $@ ]; then \ 684 echo 'No $@ generated, check your apk splitting parameters.' 1>&2; \ 685 rm $<; exit 1; \ 686 fi 687 $(sign-package) 688 689 # Rules to install the splits 690 installed_apk_splits := $(foreach s,$(my_split_suffixes),$(my_module_path)/$(LOCAL_MODULE)_$(s).apk) 691 $(installed_apk_splits) : $(my_module_path)/$(LOCAL_MODULE)_%.apk : $(intermediates)/package_%.apk 692 @echo "Install: $@" 693 $(copy-file-to-new-target) 694 695 # Register the additional built and installed files. 696 ALL_MODULES.$(my_register_name).INSTALLED += $(installed_apk_splits) 697 ALL_MODULES.$(my_register_name).BUILT_INSTALLED += \ 698 $(foreach s,$(my_split_suffixes),$(intermediates)/package_$(s).apk:$(my_module_path)/$(LOCAL_MODULE)_$(s).apk) 699 700 # Make sure to install the splits when you run "make <module_name>". 701 $(my_all_targets): $(installed_apk_splits) 702 703 ifdef LOCAL_COMPATIBILITY_SUITE 704 705 $(foreach suite, $(LOCAL_COMPATIBILITY_SUITE), \ 706 $(eval my_compat_dist_$(suite) := $(foreach dir, $(call compatibility_suite_dirs,$(suite)), \ 707 $(foreach s,$(my_split_suffixes),\ 708 $(intermediates)/package_$(s).apk:$(dir)/$(LOCAL_MODULE)_$(s).apk)))) 709 710 $(call create-suite-dependencies) 711 712 endif # LOCAL_COMPATIBILITY_SUITE 713 endif # LOCAL_PACKAGE_SPLITS 714 715 # Save information about this package 716 PACKAGES.$(LOCAL_PACKAGE_NAME).OVERRIDES := $(strip $(LOCAL_OVERRIDES_PACKAGES)) 717 PACKAGES.$(LOCAL_PACKAGE_NAME).RESOURCE_FILES := $(all_resources) 718 719 PACKAGES := $(PACKAGES) $(LOCAL_PACKAGE_NAME) 720 721 endif # skip_definition 722 723 # Reset internal variables. 724 all_res_assets := 725 726 ifdef enforce_rro_enabled 727 ifdef LOCAL_EXPORT_PACKAGE_RESOURCES 728 enforce_rro_use_res_lib := true 729 else 730 enforce_rro_use_res_lib := false 731 endif 732 733 ifdef LOCAL_MANIFEST_PACKAGE_NAME 734 enforce_rro_is_manifest_package_name := true 735 enforce_rro_manifest_package_info := $(LOCAL_MANIFEST_PACKAGE_NAME) 736 else 737 enforce_rro_is_manifest_package_name := false 738 enforce_rro_manifest_package_info := $(full_android_manifest) 739 endif 740 741 $(call append_enforce_rro_sources, \ 742 $(my_register_name), \ 743 $(enforce_rro_is_manifest_package_name), \ 744 $(enforce_rro_manifest_package_info), \ 745 $(enforce_rro_use_res_lib), \ 746 $(package_resource_overlays) \ 747 ) 748 endif # enforce_rro_enabled 749