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