diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2019-11-11 21:14:39 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2019-11-11 21:14:39 +0000 |
commit | 9b789bbdb594d08c581e385928a729eb670a6301 (patch) | |
tree | e5c856e4cb7f1d0b1161c1f0c151dac848b7fd85 | |
parent | a3a9dec14cd9265df9abf9c61b13e24d5f1263d6 (diff) | |
parent | afb0ff8fea3d8cfa6c44f7d7b62a4f71d62a88da (diff) | |
download | build-android10-mainline-resolv-release.tar.gz |
Snap for 6001391 from afb0ff8fea3d8cfa6c44f7d7b62a4f71d62a88da to qt-aml-resolv-releaseandroid-mainline-10.0.0_r8android10-mainline-resolv-release
Change-Id: Ife33beccd903b7a0124e86f57f538a2f60ce6c8a
45 files changed, 788 insertions, 409 deletions
diff --git a/CleanSpec.mk b/CleanSpec.mk index 949e88dc08..6c5ecd901d 100644 --- a/CleanSpec.mk +++ b/CleanSpec.mk @@ -689,6 +689,16 @@ $(call add-clean-step, rm -rf $(PRODUCT_OUT)/*/*app/*/oat) # that they live in the ART APEX (b/142944799). $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/framework/*.jar) +# Remove symlinks for VNDK apexes +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/vndk-*) + +# Switch to symlinks for VNDK libs +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib*/vndk-*) + +# Remove Android Core Library artifacts from the system partition +# again, as the original change removing them was reverted. +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/framework/*.jar) + # ************************************************ # NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST # ************************************************ diff --git a/core/Makefile b/core/Makefile index 9c60855d4a..3a0c0cd1dd 100644 --- a/core/Makefile +++ b/core/Makefile @@ -3616,36 +3616,6 @@ ifeq (,$(TARGET_BUILD_APPS)) ifeq (true,$(PRODUCT_BUILD_SUPER_PARTITION)) -# (1): list of items like "system", "vendor", "product", "system_ext" -# return: map each item into a command ( wrapped in $$() ) that reads the size -define read-size-of-partitions -$(foreach image,$(call images-for-partitions,$(1)),$$($(SPARSE_IMG) --get_partition_size $(image))) -endef - -# round result to BOARD_SUPER_PARTITION_ALIGNMENT -#$(1): the calculated size -ifeq (,$(BOARD_SUPER_PARTITION_ALIGNMENT)) -define round-partition-size -$(1) -endef -else -define round-partition-size -$$((($(1)+$(BOARD_SUPER_PARTITION_ALIGNMENT)-1)/$(BOARD_SUPER_PARTITION_ALIGNMENT)*$(BOARD_SUPER_PARTITION_ALIGNMENT))) -endef -endif - -define super-slot-suffix -$(if $(filter true,$(AB_OTA_UPDATER)),$(if $(filter true,$(PRODUCT_RETROFIT_DYNAMIC_PARTITIONS)),,_a)) -endef - -ifndef BOARD_SUPER_PARTITION_WARN_LIMIT -BOARD_SUPER_PARTITION_WARN_LIMIT := $$(($(BOARD_SUPER_PARTITION_SIZE) * 95 / 100)) -endif - -ifndef BOARD_SUPER_PARTITION_ERROR_LIMIT -BOARD_SUPER_PARTITION_ERROR_LIMIT := $(BOARD_SUPER_PARTITION_SIZE) -endif - droid_targets: check-all-partition-sizes .PHONY: check-all-partition-sizes check-all-partition-sizes-nodeps @@ -3654,103 +3624,28 @@ check_all_partition_sizes_file := $(call intermediates-dir-for,PACKAGING,check-a check-all-partition-sizes: $(check_all_partition_sizes_file) -# Add image dependencies so that generated_*_image_info.txt are written before checking. $(check_all_partition_sizes_file): \ - $(SPARSE_IMG) \ + $(CHECK_PARTITION_SIZES) \ $(call images-for-partitions,$(BOARD_SUPER_PARTITION_PARTITION_LIST)) -ifeq ($(PRODUCT_RETROFIT_DYNAMIC_PARTITIONS),true) -# Check sum(super partition block devices) == super partition -# Non-retrofit devices already defines BOARD_SUPER_PARTITION_SUPER_DEVICE_SIZE = BOARD_SUPER_PARTITION_SIZE -define check-super-partition-size - size_list="$(foreach device,$(call to-upper,$(BOARD_SUPER_PARTITION_BLOCK_DEVICES)),$(BOARD_SUPER_PARTITION_$(device)_DEVICE_SIZE))"; \ - sum_sizes_expr=$$(sed -e 's/ /+/g' <<< "$${size_list}"); \ - max_size_expr="$(BOARD_SUPER_PARTITION_SIZE)"; \ - if [ $$(( $${sum_sizes_expr} )) -ne $$(( $${max_size_expr} )) ]; then \ - echo "The sum of super partition block device sizes is not equal to BOARD_SUPER_PARTITION_SIZE:"; \ - echo $${sum_sizes_expr} '!=' $${max_size_expr}; \ - exit 1; \ - else \ - echo "The sum of super partition block device sizes is equal to BOARD_SUPER_PARTITION_SIZE:"; \ - echo $${sum_sizes_expr} '==' $${max_size_expr}; \ - fi -endef -endif - -# $(1): human-readable max size string -# $(2): max size expression -# $(3): list of partition names -# $(4): human-readable warn size string -# $(5): warn size expression -# $(6): human readable error size string -# $(7): error size expression -define check-sum-of-partition-sizes - partition_size_list="$$(for i in $(call read-size-of-partitions,$(3)); do \ - echo $(call round-partition-size,$${i}); \ - done)"; \ - sum_sizes_expr=$$(tr '\n' '+' <<< "$${partition_size_list}" | sed 's/+$$//'); \ - if [ $$(( $${sum_sizes_expr} )) -gt $$(( $(2) )) ]; then \ - echo "The sum of sizes of [$(strip $(3))] is larger than $(strip $(1)):"; \ - echo $${sum_sizes_expr} '==' $$(( $${sum_sizes_expr} )) '>' "$(2)" '==' $$(( $(2) )); \ - exit 1; \ - else \ - if [[ ! -z "$(7)" ]] && [ $$(( $${sum_sizes_expr} )) -gt $$(( $(7) )) ]; then \ - echo "!!!! ERROR !!!! The sum of sizes of [$(strip $(3))] is larger than $(strip $(6)):"; \ - echo $${sum_sizes_expr} '==' $$(( $${sum_sizes_expr} )) '>' "$(7)" '==' $$(( $(7) )); \ - echo "Super partition is" $$(( $$(( $$(( $${sum_sizes_expr} )) * 100)) / $$(( $(2) )) )) "percent occupied!"; \ - exit 1; \ - fi; \ - if [[ ! -z "$(5)" ]] && [ $$(( $${sum_sizes_expr} )) -gt $$(( $(5) )) ]; then \ - echo "!!!! WARNING !!!! The sum of sizes of [$(strip $(3))] is larger than $(strip $(4)):"; \ - echo $${sum_sizes_expr} '==' $$(( $${sum_sizes_expr} )) '>' "$(5)" '==' $$(( $(5) )); \ - echo "Super partition is" $$(( $$(( $$(( $${sum_sizes_expr} )) * 100)) / $$(( $(2) )) )) "percent occupied!"; \ - fi; \ - echo "The sum of sizes of [$(strip $(3))] is within $(strip $(1)):"; \ - echo $${sum_sizes_expr} '==' $$(( $${sum_sizes_expr} )) '<=' "$(2)" '==' $$(( $(2) )); \ - fi; -endef - +# $(1): misc_info.txt define check-all-partition-sizes-target - # Check sum(all partitions) <= super partition (/ 2 for A/B devices launched with dynamic partitions) - $(if $(BOARD_SUPER_PARTITION_SIZE),$(if $(BOARD_SUPER_PARTITION_PARTITION_LIST), \ - $(call check-sum-of-partition-sizes,BOARD_SUPER_PARTITION_SIZE$(if $(call super-slot-suffix), / 2), \ - $(BOARD_SUPER_PARTITION_SIZE)$(if $(call super-slot-suffix), / 2),$(BOARD_SUPER_PARTITION_PARTITION_LIST), \ - BOARD_SUPER_PARTITION_WARN_LIMIT$(if $(call super-slot-suffix), / 2), \ - $(BOARD_SUPER_PARTITION_WARN_LIMIT)$(if $(call super-slot-suffix), / 2), \ - BOARD_SUPER_PARTITION_ERROR_LIMIT$(if $(call super-slot-suffix), / 2), \ - $(BOARD_SUPER_PARTITION_ERROR_LIMIT)$(if $(call super-slot-suffix), / 2)) \ - )) - - # For each group, check sum(partitions in group) <= group size - $(foreach group,$(call to-upper,$(BOARD_SUPER_PARTITION_GROUPS)), \ - $(if $(BOARD_$(group)_SIZE),$(if $(BOARD_$(group)_PARTITION_LIST), \ - $(call check-sum-of-partition-sizes,BOARD_$(group)_SIZE,$(BOARD_$(group)_SIZE),$(BOARD_$(group)_PARTITION_LIST))))) - - # Check sum(all group sizes) <= super partition (/ 2 for A/B devices launched with dynamic partitions) - if [[ ! -z $(BOARD_SUPER_PARTITION_SIZE) ]]; then \ - group_size_list="$(foreach group,$(call to-upper,$(BOARD_SUPER_PARTITION_GROUPS)),$(BOARD_$(group)_SIZE))"; \ - sum_sizes_expr=$$(sed -e 's/ /+/g' <<< "$${group_size_list}"); \ - max_size_tail=$(if $(call super-slot-suffix)," / 2"); \ - max_size_expr="$(BOARD_SUPER_PARTITION_SIZE)$${max_size_tail}"; \ - if [ $$(( $${sum_sizes_expr} )) -gt $$(( $${max_size_expr} )) ]; then \ - echo "The sum of sizes of [$(strip $(BOARD_SUPER_PARTITION_GROUPS))] is larger than BOARD_SUPER_PARTITION_SIZE$${max_size_tail}:"; \ - echo $${sum_sizes_expr} '==' $$(( $${sum_sizes_expr} )) '>' $${max_size_expr} '==' $$(( $${max_size_expr} )); \ - exit 1; \ - else \ - echo "The sum of sizes of [$(strip $(BOARD_SUPER_PARTITION_GROUPS))] is within BOARD_SUPER_PARTITION_SIZE$${max_size_tail}:"; \ - echo $${sum_sizes_expr} '==' $$(( $${sum_sizes_expr} )) '<=' $${max_size_expr} '==' $$(( $${max_size_expr} )); \ - fi \ - fi + mkdir -p $(dir $(1)) + rm -f $(1) + $(call dump-super-image-info, $(1)) + $(foreach partition,$(BOARD_SUPER_PARTITION_PARTITION_LIST), \ + echo "$(partition)_image="$(call images-for-partitions,$(partition)) >> $(1);) + $(CHECK_PARTITION_SIZES) -v $(1) endef $(check_all_partition_sizes_file): - $(call check-all-partition-sizes-target) - $(call check-super-partition-size) + $(call check-all-partition-sizes-target, \ + $(call intermediates-dir-for,PACKAGING,check-all-partition-sizes)/misc_info.txt) touch $@ check-all-partition-sizes-nodeps: - $(call check-all-partition-sizes-target) - $(call check-super-partition-size) + $(call check-all-partition-sizes-target, \ + $(call intermediates-dir-for,PACKAGING,check-all-partition-sizes-nodeps)/misc_info.txt) endif # PRODUCT_BUILD_SUPER_PARTITION @@ -4161,6 +4056,15 @@ define fs_config (cd $(1); find . -type d | sed 's,$$,/,'; find . \! -type d) | cut -c 3- | sort | sed 's,^,$(2),' | $(HOST_OUT_EXECUTABLES)/fs_config -C -D $(TARGET_OUT) -S $(SELINUX_FC) -R "$(2)" endef +# Filter out vendor from the list for AOSP targets. +# $(1): list +define filter-out-missing-vendor +$(if $(INSTALLED_VENDORIMAGE_TARGET),$(1),$(filter-out vendor,$(1))) +endef + +# Information related to dynamic partitions and virtual A/B. This information +# is needed for building the super image (see dump-super-image-info) and +# building OTA packages. # $(1): file define dump-dynamic-partitions-info $(if $(filter true,$(PRODUCT_USE_DYNAMIC_PARTITIONS)), \ @@ -4178,17 +4082,29 @@ define dump-dynamic-partitions-info $(foreach device,$(BOARD_SUPER_PARTITION_BLOCK_DEVICES), \ echo "super_$(device)_device_size=$(BOARD_SUPER_PARTITION_$(call to-upper,$(device))_DEVICE_SIZE)" >> $(1);) $(if $(BOARD_SUPER_PARTITION_PARTITION_LIST), \ - echo "dynamic_partition_list=$(BOARD_SUPER_PARTITION_PARTITION_LIST)" >> $(1)) + echo "dynamic_partition_list=$(call filter-out-missing-vendor, $(BOARD_SUPER_PARTITION_PARTITION_LIST))" >> $(1)) $(if $(BOARD_SUPER_PARTITION_GROUPS), echo "super_partition_groups=$(BOARD_SUPER_PARTITION_GROUPS)" >> $(1)) $(foreach group,$(BOARD_SUPER_PARTITION_GROUPS), \ echo "super_$(group)_group_size=$(BOARD_$(call to-upper,$(group))_SIZE)" >> $(1); \ $(if $(BOARD_$(call to-upper,$(group))_PARTITION_LIST), \ - echo "super_$(group)_partition_list=$(BOARD_$(call to-upper,$(group))_PARTITION_LIST)" >> $(1);)) + echo "super_$(group)_partition_list=$(call filter-out-missing-vendor, $(BOARD_$(call to-upper,$(group))_PARTITION_LIST))" >> $(1);)) $(if $(filter true,$(TARGET_USERIMAGES_SPARSE_EXT_DISABLED)), \ echo "build_non_sparse_super_partition=true" >> $(1)) $(if $(filter true,$(BOARD_SUPER_IMAGE_IN_UPDATE_PACKAGE)), \ echo "super_image_in_update_package=true" >> $(1)) + $(if $(BOARD_SUPER_PARTITION_SIZE), \ + echo "super_partition_size=$(BOARD_SUPER_PARTITION_SIZE)" >> $(1)) + $(if $(BOARD_SUPER_PARTITION_ALIGNMENT), \ + echo "super_partition_alignment=$(BOARD_SUPER_PARTITION_ALIGNMENT)" >> $(1)) + $(if $(BOARD_SUPER_PARTITION_WARN_LIMIT), \ + echo "super_partition_warn_limit=$(BOARD_SUPER_PARTITION_WARN_LIMIT)" >> $(1)) + $(if $(BOARD_SUPER_PARTITION_ERROR_LIMIT), \ + echo "super_partition_error_limit=$(BOARD_SUPER_PARTITION_ERROR_LIMIT)" >> $(1)) + $(if $(filter true,$(PRODUCT_VIRTUAL_AB_OTA)), \ + echo "virtual_ab=true" >> $(1)) + $(if $(filter true,$(PRODUCT_VIRTUAL_AB_OTA_RETROFIT)), \ + echo "virtual_ab_retrofit=true" >> $(1)) endef # By conditionally including the dependency of the target files package on the @@ -4509,21 +4425,10 @@ endif ifdef BUILT_KERNEL_VERSION_FILE $(hide) cp $(BUILT_KERNEL_VERSION_FILE) $(zip_root)/META/kernel_version.txt endif -ifneq ($(BOARD_SUPER_PARTITION_GROUPS),) - $(hide) echo "super_partition_groups=$(BOARD_SUPER_PARTITION_GROUPS)" > $(zip_root)/META/dynamic_partitions_info.txt - @# Remove 'vendor' from the group partition list if the image is not available. This should only - @# happen to AOSP targets built without vendor.img. We can't remove the partition from the - @# BoardConfig file, as it's still needed elsewhere (e.g. when creating super_empty.img). - $(foreach group,$(BOARD_SUPER_PARTITION_GROUPS), \ - $(eval _group_partition_list := $(BOARD_$(call to-upper,$(group))_PARTITION_LIST)) \ - $(if $(INSTALLED_VENDORIMAGE_TARGET),,$(eval _group_partition_list := $(filter-out vendor,$(_group_partition_list)))) \ - echo "$(group)_size=$(BOARD_$(call to-upper,$(group))_SIZE)" >> $(zip_root)/META/dynamic_partitions_info.txt; \ - $(if $(_group_partition_list), \ - echo "$(group)_partition_list=$(_group_partition_list)" >> $(zip_root)/META/dynamic_partitions_info.txt;)) -endif # BOARD_SUPER_PARTITION_GROUPS -ifeq ($(PRODUCT_VIRTUAL_AB_OTA),true) - echo "virtual_ab=true" >> $(zip_root)/META/dynamic_partitions_info.txt -endif # PRODUCT_VIRTUAL_AB_OTA + rm -rf $(zip_root)/META/dynamic_partitions_info.txt +ifeq (true,$(PRODUCT_USE_DYNAMIC_PARTITIONS)) + $(call dump-dynamic-partitions-info, $(zip_root)/META/dynamic_partitions_info.txt) +endif PATH=$(INTERNAL_USERIMAGES_BINARY_PATHS):$$PATH MKBOOTIMG=$(MKBOOTIMG) \ $(ADD_IMG_TO_TARGET_FILES) -a -v -p $(HOST_OUT) $(zip_root) ifeq ($(BUILD_QEMU_IMAGES),true) @@ -4815,6 +4720,8 @@ define build-superimage-target $(call dump-super-image-info,$(2)) $(foreach p,$(BOARD_SUPER_PARTITION_PARTITION_LIST), \ echo "$(p)_image=$(INSTALLED_$(call to-upper,$(p))IMAGE_TARGET)" >> $(2);) + $(if $(BUILDING_SYSTEM_OTHER_IMAGE), $(if $(filter system,$(BOARD_SUPER_PARTITION_PARTITION_LIST)), \ + echo "system_other_image=$(INSTALLED_SYSTEMOTHERIMAGE_TARGET)" >> $(2);)) mkdir -p $(dir $(1)) PATH=$(dir $(LPMAKE)):$$PATH \ $(BUILD_SUPER_IMAGE) -v $(2) $(1) @@ -4824,6 +4731,12 @@ INSTALLED_SUPERIMAGE_TARGET := $(PRODUCT_OUT)/super.img INSTALLED_SUPERIMAGE_DEPENDENCIES := $(LPMAKE) $(BUILD_SUPER_IMAGE) \ $(foreach p, $(BOARD_SUPER_PARTITION_PARTITION_LIST), $(INSTALLED_$(call to-upper,$(p))IMAGE_TARGET)) +ifdef BUILDING_SYSTEM_OTHER_IMAGE +ifneq ($(filter system,$(BOARD_SUPER_PARTITION_PARTITION_LIST)),) +INSTALLED_SUPERIMAGE_DEPENDENCIES += $(INSTALLED_SYSTEMOTHERIMAGE_TARGET) +endif +endif + # If BOARD_BUILD_SUPER_IMAGE_BY_DEFAULT is set, super.img is built from images in the # $(PRODUCT_OUT) directory, and is built to $(PRODUCT_OUT)/super.img. Also, it will # be built for non-dist builds. This is useful for devices that uses super.img directly, e.g. @@ -5184,6 +5097,19 @@ include $(TOPDIR)development/build/tools/sdk_repo.mk endif # ----------------------------------------------------------------- +# Soong generates the list of all shared libraries that are depended on by fuzz +# targets. It saves this list as a source:destination pair to +# FUZZ_TARGET_SHARED_DEPS_INSTALL_PAIRS, where the source is the path to the +# build of the unstripped shared library, and the destination is the +# /data/fuzz/$ARCH/lib (for device) or /fuzz/$ARCH/lib (for host) directory +# where fuzz target shared libraries are to be "reinstalled". The +# copy-many-files below generates the rules to copy the unstripped shared +# libraries to the device or host "reinstallation" directory. These rules are +# depended on by each module in soong_cc_prebuilt.mk, where the module will have +# a dependency on each shared library that it needs to be "reinstalled". +FUZZ_SHARED_DEPS := $(call copy-many-files,$(strip $(FUZZ_TARGET_SHARED_DEPS_INSTALL_PAIRS))) + +# ----------------------------------------------------------------- # The rule to build all fuzz targets, and package them. # Note: The packages are created in Soong, and in a perfect world, # we'd be able to create the phony rule there. But, if we want to @@ -5194,5 +5120,5 @@ endif # directory`, because kati will see 'fuzz' as being a file, not a # phony target. .PHONY: fuzz -fuzz: $(SOONG_FUZZ_PACKAGING_ARCH_MODULES) +fuzz: $(SOONG_FUZZ_PACKAGING_ARCH_MODULES) $(ALL_FUZZ_TARGETS) $(call dist-for-goals,fuzz,$(SOONG_FUZZ_PACKAGING_ARCH_MODULES)) diff --git a/core/base_rules.mk b/core/base_rules.mk index 32c580734a..6b80a1580d 100644 --- a/core/base_rules.mk +++ b/core/base_rules.mk @@ -321,6 +321,8 @@ ifneq ($(LOCAL_OVERRIDES_MODULES),) EXECUTABLES.$(LOCAL_MODULE).OVERRIDES := $(strip $(LOCAL_OVERRIDES_MODULES)) else ifeq ($(LOCAL_MODULE_CLASS),SHARED_LIBRARIES) SHARED_LIBRARIES.$(LOCAL_MODULE).OVERRIDES := $(strip $(LOCAL_OVERRIDES_MODULES)) + else ifeq ($(LOCAL_MODULE_CLASS),ETC) + ETC.$(LOCAL_MODULE).OVERRIDES := $(strip $(LOCAL_OVERRIDES_MODULES)) else $(call pretty-error,LOCAL_MODULE_CLASS := $(LOCAL_MODULE_CLASS) cannot use LOCAL_OVERRIDES_MODULES) endif diff --git a/core/clear_vars.mk b/core/clear_vars.mk index 4818c01172..9ff978bee1 100644 --- a/core/clear_vars.mk +++ b/core/clear_vars.mk @@ -106,6 +106,7 @@ LOCAL_FULL_LIBS_MANIFEST_FILES:= LOCAL_FULL_MANIFEST_FILE:= LOCAL_FULL_TEST_CONFIG:= LOCAL_FUZZ_ENGINE:= +LOCAL_FUZZ_INSTALLED_SHARED_DEPS:= LOCAL_GCNO_FILES:= LOCAL_GENERATED_SOURCES:= # Group static libraries with "-Wl,--start-group" and "-Wl,--end-group" when linking. diff --git a/core/config.mk b/core/config.mk index 241ac8d071..a1bbe1802e 100644 --- a/core/config.mk +++ b/core/config.mk @@ -602,6 +602,7 @@ IMG_FROM_TARGET_FILES := $(HOST_OUT_EXECUTABLES)/img_from_target_files$(HOST_EXE MAKE_RECOVERY_PATCH := $(HOST_OUT_EXECUTABLES)/make_recovery_patch$(HOST_EXECUTABLE_SUFFIX) OTA_FROM_TARGET_FILES := $(HOST_OUT_EXECUTABLES)/ota_from_target_files$(HOST_EXECUTABLE_SUFFIX) SPARSE_IMG := $(HOST_OUT_EXECUTABLES)/sparse_img$(HOST_EXECUTABLE_SUFFIX) +CHECK_PARTITION_SIZES := $(HOST_OUT_EXECUTABLES)/check_partition_sizes$(HOST_EXECUTABLE_SUFFIX) PROGUARD_HOME := external/proguard PROGUARD := $(PROGUARD_HOME)/bin/proguard.sh @@ -627,16 +628,6 @@ JETIFIER := prebuilts/sdk/tools/jetifier/jetifier-standalone/bin/jetifier-standa EXTRACT_KERNEL := build/make/tools/extract_kernel.py -USE_OPENJDK9 := true - -ifeq ($(EXPERIMENTAL_JAVA_LANGUAGE_LEVEL_9),) -TARGET_OPENJDK9 := true -else ifeq ($(EXPERIMENTAL_JAVA_LANGUAGE_LEVEL_9),true) -TARGET_OPENJDK9 := true -else ifeq ($(EXPERIMENTAL_JAVA_LANGUAGE_LEVEL_9),false) -TARGET_OPENJDK9 := -endif - # Path to tools.jar HOST_JDK_TOOLS_JAR := $(ANDROID_JAVA8_HOME)/lib/tools.jar diff --git a/core/config_sanitizers.mk b/core/config_sanitizers.mk index 2439f7962a..efb21e7c6a 100644 --- a/core/config_sanitizers.mk +++ b/core/config_sanitizers.mk @@ -182,7 +182,9 @@ ifneq ($(filter hwaddress,$(my_sanitize)),) my_shared_libraries += $($(LOCAL_2ND_ARCH_VAR_PREFIX)HWADDRESS_SANITIZER_RUNTIME_LIBRARY) ifneq ($(filter EXECUTABLES NATIVE_TESTS,$(LOCAL_MODULE_CLASS)),) ifeq ($(LOCAL_FORCE_STATIC_EXECUTABLE),true) - my_static_libraries := $(my_static_libraries) $($(LOCAL_2ND_ARCH_VAR_PREFIX)HWADDRESS_SANITIZER_STATIC_LIBRARY) + my_static_libraries := $(my_static_libraries) \ + $($(LOCAL_2ND_ARCH_VAR_PREFIX)HWADDRESS_SANITIZER_STATIC_LIBRARY) \ + libdl endif endif endif diff --git a/core/cxx_stl_setup.mk b/core/cxx_stl_setup.mk index 95b1090811..6571d99be5 100644 --- a/core/cxx_stl_setup.mk +++ b/core/cxx_stl_setup.mk @@ -82,7 +82,7 @@ ifneq ($(filter $(my_cxx_stl),libc++ libc++_static),) endif ifeq ($(my_link_type),static) - my_static_libraries += libm libc libdl + my_static_libraries += libm libc endif endif else ifeq ($(my_cxx_stl),ndk) diff --git a/core/definitions.mk b/core/definitions.mk index 1bf7fa9f31..8eb1142bf0 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -2099,8 +2099,12 @@ $(hide) if [ -s $(PRIVATE_JAVA_SOURCE_LIST) -o -n "$(PRIVATE_SRCJARS)" ] ; then --output $@.premerged --temp_dir $(dir $@)/classes-turbine \ --sources \@$(PRIVATE_JAVA_SOURCE_LIST) --source_jars $(PRIVATE_SRCJARS) \ --javacopts $(PRIVATE_JAVACFLAGS) $(COMMON_JDK_FLAGS) -- \ - $(addprefix --bootclasspath ,$(strip $(PRIVATE_BOOTCLASSPATH))) \ - $(addprefix --classpath ,$(strip $(PRIVATE_ALL_JAVA_HEADER_LIBRARIES))) \ + $(if $(PRIVATE_USE_SYSTEM_MODULES), \ + --system $(PRIVATE_SYSTEM_MODULES_DIR), \ + --bootclasspath $(strip $(PRIVATE_BOOTCLASSPATH))) \ + --classpath $(strip $(if $(PRIVATE_USE_SYSTEM_MODULES), \ + $(filter-out $(PRIVATE_SYSTEM_MODULES_LIBS),$(PRIVATE_BOOTCLASSPATH))) \ + $(PRIVATE_ALL_JAVA_HEADER_LIBRARIES)) \ || ( rm -rf $(dir $@)/classes-turbine ; exit 41 ) && \ $(MERGE_ZIPS) -j --ignore-duplicates -stripDir META-INF $@.tmp $@.premerged $(PRIVATE_STATIC_JAVA_HEADER_LIBRARIES) ; \ else \ diff --git a/core/dex_preopt_config.mk b/core/dex_preopt_config.mk index 387581533d..64ad8d9a3c 100644 --- a/core/dex_preopt_config.mk +++ b/core/dex_preopt_config.mk @@ -80,7 +80,7 @@ ifeq ($(WRITE_SOONG_VARIABLES),true) $(call json_start) - $(call add_json_bool, DisablePreopt, $(call invert_bool,$(filter true,$(WITH_DEXPREOPT)))) + $(call add_json_bool, DisablePreopt, $(call invert_bool,$(and $(filter true,$(PRODUCT_USES_DEFAULT_ART_CONFIG)),$(filter true,$(WITH_DEXPREOPT))))) $(call add_json_list, DisablePreoptModules, $(DEXPREOPT_DISABLED_MODULES)) $(call add_json_bool, OnlyPreoptBootImageAndSystemServer, $(filter true,$(WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY))) $(call add_json_bool, GenerateApexImage, $(filter true,$(DEXPREOPT_GENERATE_APEX_IMAGE))) diff --git a/core/envsetup.mk b/core/envsetup.mk index 0c58cd6ae0..d35cb7e9bb 100644 --- a/core/envsetup.mk +++ b/core/envsetup.mk @@ -259,14 +259,6 @@ endef # Java libraries in the ART apex build rule. ART_APEX_JARS := core-oj core-libart core-icu4j okhttp bouncycastle apache-xml TARGET_CORE_JARS := $(ART_APEX_JARS) conscrypt -ifeq ($(EMMA_INSTRUMENT),true) - ifneq ($(EMMA_INSTRUMENT_STATIC),true) - # For instrumented build, if Jacoco is not being included statically - # in instrumented packages then include Jacoco classes into the - # bootclasspath. - TARGET_CORE_JARS += jacocoagent - endif # EMMA_INSTRUMENT_STATIC -endif # EMMA_INSTRUMENT HOST_CORE_JARS := $(addsuffix -hostdex,$(TARGET_CORE_JARS)) ################################################################# diff --git a/core/java.mk b/core/java.mk index d08045032b..99774cf1bd 100644 --- a/core/java.mk +++ b/core/java.mk @@ -358,9 +358,7 @@ include $(BUILD_SYSTEM)/jacoco.mk # Temporarily enable --multi-dex until proguard supports v53 class files # ( http://b/67673860 ) or we move away from proguard altogether. -ifdef TARGET_OPENJDK9 LOCAL_DX_FLAGS := $(filter-out --multi-dex,$(LOCAL_DX_FLAGS)) --multi-dex -endif full_classes_pre_proguard_jar := $(LOCAL_FULL_CLASSES_JACOCO_JAR) diff --git a/core/java_common.mk b/core/java_common.mk index dfe75f3257..f6e01d226f 100644 --- a/core/java_common.mk +++ b/core/java_common.mk @@ -33,8 +33,7 @@ ifeq (,$(LOCAL_JAVA_LANGUAGE_VERSION)) # TODO(ccross): allow 1.9 for current and unbundled once we have SDK system modules LOCAL_JAVA_LANGUAGE_VERSION := 1.8 else - # DEFAULT_JAVA_LANGUAGE_VERSION is 1.8, unless TARGET_OPENJDK9 in which case it is 1.9 - LOCAL_JAVA_LANGUAGE_VERSION := $(DEFAULT_JAVA_LANGUAGE_VERSION) + LOCAL_JAVA_LANGUAGE_VERSION := 1.9 endif endif LOCAL_JAVACFLAGS += -source $(LOCAL_JAVA_LANGUAGE_VERSION) -target $(LOCAL_JAVA_LANGUAGE_VERSION) diff --git a/core/local_systemsdk.mk b/core/local_systemsdk.mk index 6c022f2daf..2b73f93209 100644 --- a/core/local_systemsdk.mk +++ b/core/local_systemsdk.mk @@ -16,16 +16,20 @@ ifdef BOARD_SYSTEMSDK_VERSIONS # Apps and jars in vendor or odm partition are forced to build against System SDK. - _is_vendor_app := + _cannot_use_platform_apis := ifneq (,$(filter true,$(LOCAL_VENDOR_MODULE) $(LOCAL_ODM_MODULE) $(LOCAL_PROPRIETARY_MODULE))) # Note: no need to check LOCAL_MODULE_PATH* since LOCAL_[VENDOR|ODM|OEM]_MODULE is already # set correctly before this is included. - _is_vendor_app := true + _cannot_use_platform_apis := true + else ifeq ($(LOCAL_PRODUCT_MODULE),true) + ifeq ($(PRODUCT_ENFORCE_PRODUCT_PARTITION_INTERFACE),true) + _cannot_use_platform_apis := true + endif endif ifneq (,$(filter JAVA_LIBRARIES APPS,$(LOCAL_MODULE_CLASS))) ifndef LOCAL_SDK_VERSION - ifeq ($(_is_vendor_app),true) - ifeq (,$(filter %__auto_generated_rro_vendor,$(LOCAL_MODULE))) + ifeq ($(_cannot_use_platform_apis),true) + ifeq (,$(findstring __auto_generated_rro_,$(LOCAL_MODULE))) # Runtime resource overlays are exempted from building against System SDK. # TODO(b/35859726): remove this exception LOCAL_SDK_VERSION := system_current @@ -39,7 +43,7 @@ endif # The range of support versions becomes narrower when BOARD_SYSTEMSDK_VERSIONS # is set, which is a subset of PLATFORM_SYSTEMSDK_VERSIONS. ifneq (,$(call has-system-sdk-version,$(LOCAL_SDK_VERSION))) - ifneq ($(_is_vendor_app),true) + ifneq ($(_cannot_use_platform_apis),true) # apps bundled in system partition can use all system sdk versions provided by the platform _supported_systemsdk_versions := $(PLATFORM_SYSTEMSDK_VERSIONS) else ifdef BOARD_SYSTEMSDK_VERSIONS diff --git a/core/main.mk b/core/main.mk index a5e2456156..730cbd0cd3 100644 --- a/core/main.mk +++ b/core/main.mk @@ -220,9 +220,6 @@ ifneq ($(TARGET_BUILD_VARIANT),user) ADDITIONAL_BUILD_PROPERTIES += persist.debug.dalvik.vm.core_platform_api_policy=just-warn endif -# Define ro.sanitize.<name> properties for all global sanitizers. -ADDITIONAL_BUILD_PROPERTIES += $(foreach s,$(SANITIZE_TARGET),ro.sanitize.$(s)=true) - # Sets the default value of ro.postinstall.fstab.prefix to /system. # Device board config should override the value to /product when needed by: # @@ -970,7 +967,7 @@ $(foreach export,$(EXPORTS_LIST),$(eval $(call add-dependency,$$(EXPORTS.$$(expo # Expand a list of modules to the modules that they override (if any) # $(1): The list of modules. define module-overrides -$(foreach m,$(1),$(PACKAGES.$(m).OVERRIDES) $(EXECUTABLES.$(m).OVERRIDES) $(SHARED_LIBRARIES.$(m).OVERRIDES)) +$(foreach m,$(1),$(PACKAGES.$(m).OVERRIDES) $(EXECUTABLES.$(m).OVERRIDES) $(SHARED_LIBRARIES.$(m).OVERRIDES) $(ETC.$(m).OVERRIDES)) endef ########################################################### @@ -1045,14 +1042,13 @@ endef # 32-bit variant, if it exits. See the select-bitness-of-required-modules definition. # $(1): product makefile define product-installed-files - $(eval _mk := $(strip $(1))) \ $(eval _pif_modules := \ - $(PRODUCTS.$(_mk).PRODUCT_PACKAGES) \ - $(if $(filter eng,$(tags_to_install)),$(PRODUCTS.$(_mk).PRODUCT_PACKAGES_ENG)) \ - $(if $(filter debug,$(tags_to_install)),$(PRODUCTS.$(_mk).PRODUCT_PACKAGES_DEBUG)) \ - $(if $(filter tests,$(tags_to_install)),$(PRODUCTS.$(_mk).PRODUCT_PACKAGES_TESTS)) \ - $(if $(filter asan,$(tags_to_install)),$(PRODUCTS.$(_mk).PRODUCT_PACKAGES_DEBUG_ASAN)) \ - $(if $(filter java_coverage,$(tags_to_install)),$(PRODUCTS.$(_mk).PRODUCT_PACKAGES_DEBUG_JAVA_COVERAGE)) \ + $(call get-product-var,$(1),PRODUCT_PACKAGES) \ + $(if $(filter eng,$(tags_to_install)),$(call get-product-var,$(1),PRODUCT_PACKAGES_ENG)) \ + $(if $(filter debug,$(tags_to_install)),$(call get-product-var,$(1),PRODUCT_PACKAGES_DEBUG)) \ + $(if $(filter tests,$(tags_to_install)),$(call get-product-var,$(1),PRODUCT_PACKAGES_TESTS)) \ + $(if $(filter asan,$(tags_to_install)),$(call get-product-var,$(1),PRODUCT_PACKAGES_DEBUG_ASAN)) \ + $(if $(filter java_coverage,$(tags_to_install)),$(call get-product-var,$(1),PRODUCT_PACKAGES_DEBUG_JAVA_COVERAGE)) \ $(call auto-included-modules) \ ) \ $(eval ### Filter out the overridden packages and executables before doing expansion) \ @@ -1071,13 +1067,13 @@ define product-installed-files $(call expand-required-modules,_pif_modules,$(_pif_modules),$(_pif_overrides)) \ $(filter-out $(HOST_OUT_ROOT)/%,$(call module-installed-files, $(_pif_modules))) \ $(call resolve-product-relative-paths,\ - $(foreach cf,$(PRODUCTS.$(_mk).PRODUCT_COPY_FILES),$(call word-colon,2,$(cf)))) + $(foreach cf,$(call get-product-var,$(1),PRODUCT_COPY_FILES),$(call word-colon,2,$(cf)))) endef # Similar to product-installed-files above, but handles PRODUCT_HOST_PACKAGES instead # This does support the :32 / :64 syntax, but does not support module overrides. define host-installed-files - $(eval _hif_modules := $(PRODUCTS.$(strip $(1)).PRODUCT_HOST_PACKAGES)) \ + $(eval _hif_modules := $(call get-product-var,$(1),PRODUCT_HOST_PACKAGES)) \ $(eval ### Resolve the :32 :64 module name) \ $(eval _hif_modules_32 := $(patsubst %:32,%,$(filter %:32, $(_hif_modules)))) \ $(eval _hif_modules_64 := $(patsubst %:64,%,$(filter %:64, $(_hif_modules)))) \ @@ -1109,11 +1105,11 @@ $(if $(strip $(1)), \ endef # Check that libraries that should only be in APEXes don't end up in the system -# image. For the Runtime APEX this complements the checks in +# image. For the ART APEX this complements the checks in # art/build/apex/art_apex_test.py. # TODO(b/128708192): Implement this restriction in Soong instead. -# Runtime APEX libraries +# ART APEX (native) libraries APEX_MODULE_LIBS := \ libadbconnection.so \ libadbconnectiond.so \ @@ -1129,14 +1125,10 @@ APEX_MODULE_LIBS := \ libartd-dexlayout.so \ libartd.so \ libartpalette.so \ - libc.so \ - libc_malloc_debug.so \ - libc_malloc_hooks.so \ libdexfile.so \ libdexfile_external.so \ libdexfiled.so \ libdexfiled_external.so \ - libdl.so \ libdt_fd_forward.so \ libdt_socket.so \ libicui18n.so \ @@ -1144,11 +1136,9 @@ APEX_MODULE_LIBS := \ libicu_jni.so \ libjavacore.so \ libjdwp.so \ - libm.so \ libnativebridge.so \ libnativehelper.so \ libnativeloader.so \ - libneuralnetworks.so \ libnpt.so \ libopenjdk.so \ libopenjdkjvm.so \ @@ -1160,16 +1150,45 @@ APEX_MODULE_LIBS := \ libprofiled.so \ libsigchain.so \ +# Runtime (Bionic) APEX (native) libraries +APEX_MODULE_LIBS += \ + libc.so \ + libc_malloc_debug.so \ + libc_malloc_hooks.so \ + libdl.so \ + libm.so \ + # Conscrypt APEX libraries APEX_MODULE_LIBS += \ libjavacrypto.so \ +# Android Neural Network API (NNAPI) APEX (native) libraries +APEX_MODULE_LIBS += \ + libneuralnetworks.so \ + +# ART APEX JARs (Java libraries) +APEX_MODULE_LIBS += \ + apache-xml.jar \ + bouncycastle.jar \ + core-icu4j.jar \ + core-libart.jar \ + core-oj.jar \ + okhttp.jar \ + +# Conscrypt APEX JARs (Java libraries) +APEX_MODULE_LIBS += \ + conscrypt.jar \ + # An option to disable the check below, for local use since some build targets # still may create these libraries in /system (b/129006418). DISABLE_APEX_LIBS_ABSENCE_CHECK ?= +# Allow APEX libraries under /system/apex, which happens when APEX flattening +# is enabled. +APEX_LIBS_ABSENCE_CHECK_EXCLUDE := apex + # Bionic should not be in /system, except for the bootstrap instance. -APEX_LIBS_ABSENCE_CHECK_EXCLUDE := lib/bootstrap lib64/bootstrap +APEX_LIBS_ABSENCE_CHECK_EXCLUDE += lib/bootstrap lib64/bootstrap # Exclude lib/arm and lib64/arm64 which contain the native bridge proxy libs. They # are compiled for the guest architecture and used with an entirely different @@ -1216,12 +1235,14 @@ else # APEX might be misconfigured or something is wrong in the build system. # Please reach out to the APEX package owners and/or soong-team@, or # android-building@googlegroups.com externally. + # + # Likewise, we check for the absence of APEX Java libraries (JARs). define check-apex-libs-absence $(call maybe-print-list-and-error, \ $(filter $(foreach lib,$(APEX_MODULE_LIBS),%/$(lib)), \ $(filter-out $(foreach dir,$(APEX_LIBS_ABSENCE_CHECK_EXCLUDE), \ $(TARGET_OUT)/$(if $(findstring %,$(dir)),$(dir),$(dir)/%)), \ - $(filter $(TARGET_OUT)/lib/% $(TARGET_OUT)/lib64/%,$(1)))), \ + $(filter $(TARGET_OUT),$(1)))), \ APEX libraries found in product_target_FILES (see comment for check-apex-libs-absence in \ build/make/core/main.mk for details)) endef @@ -1235,11 +1256,13 @@ else # try "m installclean && m systemimage" to get a correct system image. For # local work you can also disable the check with the # DISABLE_APEX_LIBS_ABSENCE_CHECK environment variable. + # + # Likewise, we check for the absence of APEX Java libraries (JARs). define check-apex-libs-absence-on-disk $(hide) ( \ cd $(TARGET_OUT) && \ - findres=$$(find lib* \ - $(foreach dir,$(APEX_LIBS_ABSENCE_CHECK_EXCLUDE),-path "$(subst %,*,$(dir))" -prune -o) \ + findres=$$(find . \ + $(foreach dir,$(APEX_LIBS_ABSENCE_CHECK_EXCLUDE),-path "./$(subst %,*,$(dir))" -prune -o) \ -type f \( -false $(foreach lib,$(APEX_MODULE_LIBS),-o -name $(lib)) \) \ -print) && \ if [ -n "$$findres" ]; then \ @@ -1253,8 +1276,6 @@ else endef endif -# TODO(b/142944799): Implement Java library absence check for Core Libraries. - ifdef FULL_BUILD ifneq (true,$(ALLOW_MISSING_DEPENDENCIES)) # Check to ensure that all modules in PRODUCT_PACKAGES exist (opt in per product) @@ -1293,11 +1314,11 @@ ifdef FULL_BUILD # Some modules produce only host installed files when building with TARGET_BUILD_APPS ifeq ($(TARGET_BUILD_APPS),) - _modules := $(foreach m,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES) \ - $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES_DEBUG) \ - $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES_DEBUG_ASAN) \ - $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES_ENG) \ - $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES_TESTS),\ + _modules := $(foreach m,$(PRODUCT_PACKAGES) \ + $(PRODUCT_PACKAGES_DEBUG) \ + $(PRODUCT_PACKAGES_DEBUG_ASAN) \ + $(PRODUCT_PACKAGES_ENG) \ + $(PRODUCT_PACKAGES_TESTS),\ $(if $(ALL_MODULES.$(m).INSTALLED),\ $(if $(filter-out $(HOST_OUT_ROOT)/%,$(ALL_MODULES.$(m).INSTALLED)),,\ $(m)))) diff --git a/core/notice_files.mk b/core/notice_files.mk index 680a0b1c4f..9df1c1125a 100644 --- a/core/notice_files.mk +++ b/core/notice_files.mk @@ -71,8 +71,11 @@ else # javalib.jar is the default name for the build module (and isn't meaningful) # If that's what we have, substitute the module name instead. These files # aren't included on the device, so this name is synthetic anyway. + # Extra path "static" is added to try to avoid name conflict between the notice file of + # this 'uninstallable' Java module and the notice file for another 'installable' Java module + # whose stem is the same as this module's name. ifneq ($(filter javalib.jar,$(module_leaf)),) - module_leaf := $(LOCAL_MODULE).jar + module_leaf := static/$(LOCAL_MODULE).jar endif module_installed_filename := \ $(patsubst $(PRODUCT_OUT)/%,%,$($(my_prefix)OUT_JAVA_LIBRARIES))/$(module_leaf) diff --git a/core/pdk_config.mk b/core/pdk_config.mk index 4a069d3d10..922e0ef2d6 100644 --- a/core/pdk_config.mk +++ b/core/pdk_config.mk @@ -22,7 +22,7 @@ PDK_PLATFORM_JAVA_ZIP_JAVA_TARGET_LIB_DIR += \ target/common/obj/JAVA_LIBRARIES/core-libart_intermediates \ target/common/obj/JAVA_LIBRARIES/core-icu4j_intermediates \ target/common/obj/JAVA_LIBRARIES/ext_intermediates \ - target/common/obj/JAVA_LIBRARIES/framework_intermediates \ + target/common/obj/JAVA_LIBRARIES/framework-minus-apex_intermediates \ target/common/obj/JAVA_LIBRARIES/hwbinder_intermediates \ target/common/obj/JAVA_LIBRARIES/ims-common_intermediates \ target/common/obj/JAVA_LIBRARIES/okhttp_intermediates \ diff --git a/core/product-graph.mk b/core/product-graph.mk index b97a69d644..968d01be0f 100644 --- a/core/product-graph.mk +++ b/core/product-graph.mk @@ -33,7 +33,6 @@ define all-products-inner ) endef - this_makefile := build/make/core/product-graph.mk products_graph := $(OUT_DIR)/products.dot @@ -71,7 +70,7 @@ endef # $(2) the output file define emit-product-node-props $(hide) echo \"$(1)\" [ \ -label=\"$(dir $(1))\\n$(notdir $(1))\\n\\n$(subst $(close_parenthesis),,$(subst $(open_parethesis),,$(PRODUCTS.$(strip $(1)).PRODUCT_MODEL)))\\n$(PRODUCTS.$(strip $(1)).PRODUCT_DEVICE)\" \ +label=\"$(dir $(1))\\n$(notdir $(1))\\n\\n$(subst $(close_parenthesis),,$(subst $(open_parethesis),,$(call get-product-var,$(1),PRODUCT_MODEL)))\\n$(call get-product-var,$(1),PRODUCT_DEVICE)\" \ style=\"filled\" fillcolor=\"$(strip $(call node-color,$(1)))\" \ colorscheme=\"svg\" fontcolor=\"darkblue\" href=\"products/$(1).html\" \ ] >> $(2) @@ -105,35 +104,35 @@ $(OUT_DIR)/products/$(strip $(1)).txt: $(this_makefile) $(hide) rm -f $$@ $(hide) mkdir -p $$(dir $$@) $(hide) echo 'FILE=$(strip $(1))' >> $$@ - $(hide) echo 'PRODUCT_NAME=$$(PRODUCTS.$(strip $(1)).PRODUCT_NAME)' >> $$@ - $(hide) echo 'PRODUCT_MODEL=$$(PRODUCTS.$(strip $(1)).PRODUCT_MODEL)' >> $$@ - $(hide) echo 'PRODUCT_LOCALES=$$(PRODUCTS.$(strip $(1)).PRODUCT_LOCALES)' >> $$@ - $(hide) echo 'PRODUCT_AAPT_CONFIG=$$(PRODUCTS.$(strip $(1)).PRODUCT_AAPT_CONFIG)' >> $$@ - $(hide) echo 'PRODUCT_AAPT_PREF_CONFIG=$$(PRODUCTS.$(strip $(1)).PRODUCT_AAPT_PREF_CONFIG)' >> $$@ - $(hide) echo 'PRODUCT_PACKAGES=$$(PRODUCTS.$(strip $(1)).PRODUCT_PACKAGES)' >> $$@ - $(hide) echo 'PRODUCT_DEVICE=$$(PRODUCTS.$(strip $(1)).PRODUCT_DEVICE)' >> $$@ - $(hide) echo 'PRODUCT_MANUFACTURER=$$(PRODUCTS.$(strip $(1)).PRODUCT_MANUFACTURER)' >> $$@ - $(hide) echo 'PRODUCT_PROPERTY_OVERRIDES=$$(PRODUCTS.$(strip $(1)).PRODUCT_PROPERTY_OVERRIDES)' >> $$@ - $(hide) echo 'PRODUCT_DEFAULT_PROPERTY_OVERRIDES=$$(PRODUCTS.$(strip $(1)).PRODUCT_DEFAULT_PROPERTY_OVERRIDES)' >> $$@ - $(hide) echo 'PRODUCT_SYSTEM_DEFAULT_PROPERTIES=$$(PRODUCTS.$(strip $(1)).PRODUCT_SYSTEM_DEFAULT_PROPERTIES)' >> $$@ - $(hide) echo 'PRODUCT_PRODUCT_PROPERTIES=$$(PRODUCTS.$(strip $(1)).PRODUCT_PRODUCT_PROPERTIES)' >> $$@ - $(hide) echo 'PRODUCT_SYSTEM_EXT_PROPERTIES=$$(PRODUCTS.$(strip $(1)).PRODUCT_SYSTEM_EXT_PROPERTIES)' >> $$@ - $(hide) echo 'PRODUCT_ODM_PROPERTIES=$$(PRODUCTS.$(strip $(1)).PRODUCT_ODM_PROPERTIES)' >> $$@ - $(hide) echo 'PRODUCT_CHARACTERISTICS=$$(PRODUCTS.$(strip $(1)).PRODUCT_CHARACTERISTICS)' >> $$@ - $(hide) echo 'PRODUCT_COPY_FILES=$$(PRODUCTS.$(strip $(1)).PRODUCT_COPY_FILES)' >> $$@ - $(hide) echo 'PRODUCT_OTA_PUBLIC_KEYS=$$(PRODUCTS.$(strip $(1)).PRODUCT_OTA_PUBLIC_KEYS)' >> $$@ - $(hide) echo 'PRODUCT_EXTRA_RECOVERY_KEYS=$$(PRODUCTS.$(strip $(1)).PRODUCT_EXTRA_RECOVERY_KEYS)' >> $$@ - $(hide) echo 'PRODUCT_PACKAGE_OVERLAYS=$$(PRODUCTS.$(strip $(1)).PRODUCT_PACKAGE_OVERLAYS)' >> $$@ - $(hide) echo 'DEVICE_PACKAGE_OVERLAYS=$$(PRODUCTS.$(strip $(1)).DEVICE_PACKAGE_OVERLAYS)' >> $$@ - $(hide) echo 'PRODUCT_SDK_ADDON_NAME=$$(PRODUCTS.$(strip $(1)).PRODUCT_SDK_ADDON_NAME)' >> $$@ - $(hide) echo 'PRODUCT_SDK_ADDON_COPY_FILES=$$(PRODUCTS.$(strip $(1)).PRODUCT_SDK_ADDON_COPY_FILES)' >> $$@ - $(hide) echo 'PRODUCT_SDK_ADDON_COPY_MODULES=$$(PRODUCTS.$(strip $(1)).PRODUCT_SDK_ADDON_COPY_MODULES)' >> $$@ - $(hide) echo 'PRODUCT_SDK_ADDON_DOC_MODULES=$$(PRODUCTS.$(strip $(1)).PRODUCT_SDK_ADDON_DOC_MODULES)' >> $$@ - $(hide) echo 'PRODUCT_DEFAULT_WIFI_CHANNELS=$$(PRODUCTS.$(strip $(1)).PRODUCT_DEFAULT_WIFI_CHANNELS)' >> $$@ - $(hide) echo 'PRODUCT_DEFAULT_DEV_CERTIFICATE=$$(PRODUCTS.$(strip $(1)).PRODUCT_DEFAULT_DEV_CERTIFICATE)' >> $$@ - $(hide) echo 'PRODUCT_MAINLINE_SEPOLICY_DEV_CERTIFICATES=$$(PRODUCTS.$(strip $(1)).PRODUCT_MAINLINE_SEPOLICY_DEV_CERTIFICATES)' >> $$@ - $(hide) echo 'PRODUCT_RESTRICT_VENDOR_FILES=$$(PRODUCTS.$(strip $(1)).PRODUCT_RESTRICT_VENDOR_FILES)' >> $$@ - $(hide) echo 'PRODUCT_VENDOR_KERNEL_HEADERS=$$(PRODUCTS.$(strip $(1)).PRODUCT_VENDOR_KERNEL_HEADERS)' >> $$@ + $(hide) echo 'PRODUCT_NAME=$(call get-product-var,$(1),PRODUCT_NAME)' >> $$@ + $(hide) echo 'PRODUCT_MODEL=$(call get-product-var,$(1),PRODUCT_MODEL)' >> $$@ + $(hide) echo 'PRODUCT_LOCALES=$(call get-product-var,$(1),PRODUCT_LOCALES)' >> $$@ + $(hide) echo 'PRODUCT_AAPT_CONFIG=$(call get-product-var,$(1),PRODUCT_AAPT_CONFIG)' >> $$@ + $(hide) echo 'PRODUCT_AAPT_PREF_CONFIG=$(call get-product-var,$(1),PRODUCT_AAPT_PREF_CONFIG)' >> $$@ + $(hide) echo 'PRODUCT_PACKAGES=$(call get-product-var,$(1),PRODUCT_PACKAGES)' >> $$@ + $(hide) echo 'PRODUCT_DEVICE=$(call get-product-var,$(1),PRODUCT_DEVICE)' >> $$@ + $(hide) echo 'PRODUCT_MANUFACTURER=$(call get-product-var,$(1),PRODUCT_MANUFACTURER)' >> $$@ + $(hide) echo 'PRODUCT_PROPERTY_OVERRIDES=$(call get-product-var,$(1),PRODUCT_PROPERTY_OVERRIDES)' >> $$@ + $(hide) echo 'PRODUCT_DEFAULT_PROPERTY_OVERRIDES=$(call get-product-var,$(1),PRODUCT_DEFAULT_PROPERTY_OVERRIDES)' >> $$@ + $(hide) echo 'PRODUCT_SYSTEM_DEFAULT_PROPERTIES=$(call get-product-var,$(1),PRODUCT_SYSTEM_DEFAULT_PROPERTIES)' >> $$@ + $(hide) echo 'PRODUCT_PRODUCT_PROPERTIES=$(call get-product-var,$(1),PRODUCT_PRODUCT_PROPERTIES)' >> $$@ + $(hide) echo 'PRODUCT_SYSTEM_EXT_PROPERTIES=$(call get-product-var,$(1),PRODUCT_SYSTEM_EXT_PROPERTIES)' >> $$@ + $(hide) echo 'PRODUCT_ODM_PROPERTIES=$(call get-product-var,$(1),PRODUCT_ODM_PROPERTIES)' >> $$@ + $(hide) echo 'PRODUCT_CHARACTERISTICS=$(call get-product-var,$(1),PRODUCT_CHARACTERISTICS)' >> $$@ + $(hide) echo 'PRODUCT_COPY_FILES=$(call get-product-var,$(1),PRODUCT_COPY_FILES)' >> $$@ + $(hide) echo 'PRODUCT_OTA_PUBLIC_KEYS=$(call get-product-var,$(1),PRODUCT_OTA_PUBLIC_KEYS)' >> $$@ + $(hide) echo 'PRODUCT_EXTRA_RECOVERY_KEYS=$(call get-product-var,$(1),PRODUCT_EXTRA_RECOVERY_KEYS)' >> $$@ + $(hide) echo 'PRODUCT_PACKAGE_OVERLAYS=$(call get-product-var,$(1),PRODUCT_PACKAGE_OVERLAYS)' >> $$@ + $(hide) echo 'DEVICE_PACKAGE_OVERLAYS=$(call get-product-var,$(1),DEVICE_PACKAGE_OVERLAYS)' >> $$@ + $(hide) echo 'PRODUCT_SDK_ADDON_NAME=$(call get-product-var,$(1),PRODUCT_SDK_ADDON_NAME)' >> $$@ + $(hide) echo 'PRODUCT_SDK_ADDON_COPY_FILES=$(call get-product-var,$(1),PRODUCT_SDK_ADDON_COPY_FILES)' >> $$@ + $(hide) echo 'PRODUCT_SDK_ADDON_COPY_MODULES=$(call get-product-var,$(1),PRODUCT_SDK_ADDON_COPY_MODULES)' >> $$@ + $(hide) echo 'PRODUCT_SDK_ADDON_DOC_MODULES=$(call get-product-var,$(1),PRODUCT_SDK_ADDON_DOC_MODULES)' >> $$@ + $(hide) echo 'PRODUCT_DEFAULT_WIFI_CHANNELS=$(call get-product-var,$(1),PRODUCT_DEFAULT_WIFI_CHANNELS)' >> $$@ + $(hide) echo 'PRODUCT_DEFAULT_DEV_CERTIFICATE=$(call get-product-var,$(1),PRODUCT_DEFAULT_DEV_CERTIFICATE)' >> $$@ + $(hide) echo 'PRODUCT_MAINLINE_SEPOLICY_DEV_CERTIFICATES=$(call get-product-var,$(1),PRODUCT_MAINLINE_SEPOLICY_DEV_CERTIFICATES)' >> $$@ + $(hide) echo 'PRODUCT_RESTRICT_VENDOR_FILES=$(call get-product-var,$(1),PRODUCT_RESTRICT_VENDOR_FILES)' >> $$@ + $(hide) echo 'PRODUCT_VENDOR_KERNEL_HEADERS=$(call get-product-var,$(1),PRODUCT_VENDOR_KERNEL_HEADERS)' >> $$@ $(call product-debug-filename, $(p)): \ $(OUT_DIR)/products/$(strip $(1)).txt \ diff --git a/core/product.mk b/core/product.mk index 2c89fab4a6..102e6a5c19 100644 --- a/core/product.mk +++ b/core/product.mk @@ -376,13 +376,16 @@ _product_single_value_vars += PRODUCT_VIRTUAL_AB_OTA # If set, device retrofits virtual A/B. _product_single_value_vars += PRODUCT_VIRTUAL_AB_OTA_RETROFIT +# If set, Java module in product partition cannot use hidden APIs. +_product_single_value_vars += PRODUCT_ENFORCE_PRODUCT_PARTITION_INTERFACE + .KATI_READONLY := _product_single_value_vars _product_list_vars _product_var_list :=$= $(_product_single_value_vars) $(_product_list_vars) define dump-product $(warning ==== $(1) ====)\ $(foreach v,$(_product_var_list),\ -$(warning PRODUCTS.$(1).$(v) := $(PRODUCTS.$(1).$(v))))\ +$(warning PRODUCTS.$(1).$(v) := $(call get-product-var,$(1),$(v))))\ $(warning --------) endef @@ -547,6 +550,8 @@ define readonly-final-product-vars $(call readonly-variables,$(_readonly_late_variables)) endef +# Macro re-defined inside strip-product-vars. +get-product-var = $(PRODUCTS.$(strip $(1)).$(2)) # # Strip the variables in _product_var_list and a few build-system # internal variables, and assign the ones for the current product @@ -558,6 +563,8 @@ $(foreach v,\ PRODUCT_ENFORCE_PACKAGES_EXIST \ PRODUCT_ENFORCE_PACKAGES_EXIST_WHITELIST, \ $(eval $(v) := $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).$(v)))) \ + $(eval get-product-var = $$(if $$(filter $$(1),$$(INTERNAL_PRODUCT)),$$($$(2)),$$(PRODUCTS.$$(strip $$(1)).$$(2)))) \ + $(KATI_obsolete_var PRODUCTS.$(INTERNAL_PRODUCT).$(v),Use $(v) instead) \ ) endef diff --git a/core/product_config.mk b/core/product_config.mk index 1293c94fcf..4fc7bf6a2f 100644 --- a/core/product_config.mk +++ b/core/product_config.mk @@ -184,6 +184,18 @@ current_product_makefile := all_product_makefiles := all_product_configs := +# Jacoco agent JARS to be built and installed, if any. +ifeq ($(EMMA_INSTRUMENT),true) + ifneq ($(EMMA_INSTRUMENT_STATIC),true) + # For instrumented build, if Jacoco is not being included statically + # in instrumented packages then include Jacoco classes into the + # bootclasspath. + $(foreach product,$(PRODUCTS),\ + $(eval PRODUCTS.$(product).PRODUCT_PACKAGES += jacocoagent)\ + $(eval PRODUCTS.$(product).PRODUCT_BOOT_JARS += jacocoagent)) + endif # EMMA_INSTRUMENT_STATIC +endif # EMMA_INSTRUMENT + ############################################################################ # Strip and assign the PRODUCT_ variables. $(call strip-product-vars) diff --git a/core/soong_cc_prebuilt.mk b/core/soong_cc_prebuilt.mk index 9e3f0d3a17..2d5089d0e0 100644 --- a/core/soong_cc_prebuilt.mk +++ b/core/soong_cc_prebuilt.mk @@ -120,11 +120,12 @@ ifeq ($(LOCAL_VNDK_DEPEND_ON_CORE_VARIANT),true) endif ifeq ($(LOCAL_VNDK_DEPEND_ON_CORE_VARIANT),true) +$(LOCAL_BUILT_MODULE): PRIVATE_TOOLS_PREFIX := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)TOOLS_PREFIX) $(LOCAL_BUILT_MODULE): $(LOCAL_PREBUILT_MODULE_FILE) $(LIBRARY_IDENTITY_CHECK_SCRIPT) $(call verify-vndk-libs-identical,\ $(PRIVATE_CORE_VARIANT),\ $<,\ - $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)TOOLS_PREFIX)) + $(PRIVATE_TOOLS_PREFIX)) $(copy-file-to-target) else $(LOCAL_BUILT_MODULE): $(LOCAL_PREBUILT_MODULE_FILE) @@ -219,3 +220,9 @@ installed_static_library_notice_file_targets := \ $(notice_target): | $(installed_static_library_notice_file_targets) $(LOCAL_INSTALLED_MODULE): | $(notice_target) + +# Reinstall shared library dependencies of fuzz targets to /data/fuzz/ (for +# target) or /data/ (for host). +ifdef LOCAL_IS_FUZZ_TARGET +$(LOCAL_INSTALLED_MODULE): $(LOCAL_FUZZ_INSTALLED_SHARED_DEPS) +endif diff --git a/core/soong_config.mk b/core/soong_config.mk index bcd025ba98..7ce59f1559 100644 --- a/core/soong_config.mk +++ b/core/soong_config.mk @@ -105,6 +105,8 @@ $(call add_json_bool, EnableXOM, $(call invert_bool,$(fi $(call add_json_list, XOMExcludePaths, $(XOM_EXCLUDE_PATHS) $(PRODUCT_XOM_EXCLUDE_PATHS)) $(call add_json_list, IntegerOverflowExcludePaths, $(INTEGER_OVERFLOW_EXCLUDE_PATHS) $(PRODUCT_INTEGER_OVERFLOW_EXCLUDE_PATHS)) +$(call add_json_bool, Experimental_mte, $(filter true,$(TARGET_EXPERIMENTAL_MTE))) + $(call add_json_bool, DisableScudo, $(filter true,$(PRODUCT_DISABLE_SCUDO))) $(call add_json_bool, ClangTidy, $(filter 1 true,$(WITH_TIDY))) @@ -195,6 +197,8 @@ $(foreach namespace,$(SOONG_CONFIG_NAMESPACES),\ $(call end_json_map)) $(call end_json_map) +$(call add_json_bool, EnforceProductPartitionInterface, $(PRODUCT_ENFORCE_PRODUCT_PARTITION_INTERFACE)) + $(call json_end) $(file >$(SOONG_VARIABLES).tmp,$(json_contents)) diff --git a/core/tasks/vndk.mk b/core/tasks/vndk.mk index 3c4d942eed..dccb5f630f 100644 --- a/core/tasks/vndk.mk +++ b/core/tasks/vndk.mk @@ -23,88 +23,10 @@ ifneq (,$(PLATFORM_VNDK_VERSION)) # BOARD_VNDK_RUNTIME_DISABLE must not be set to 'true'. ifneq ($(BOARD_VNDK_RUNTIME_DISABLE),true) -# Returns list of src:dest paths of the intermediate objs -# -# Args: -# $(1): list of module and filename pairs (e.g., ld.config.txt:ld.config.27.txt ...) -define paths-of-intermediates -$(strip \ - $(foreach pair,$(1), \ - $(eval module := $(call word-colon,1,$(pair))) \ - $(eval built := $(ALL_MODULES.$(module).BUILT_INSTALLED)) \ - $(eval filename := $(call word-colon,2,$(pair))) \ - $(if $(wordlist 2,100,$(built)), \ - $(error Unable to handle multiple built files ($(module)): $(built))) \ - $(if $(built),$(call word-colon,1,$(built)):$(filename)) \ - ) \ -) -endef - -vndk_prebuilt_txts := \ - ld.config.txt \ - vndksp.libraries.txt \ - llndk.libraries.txt - -vndk_snapshot_top := $(call intermediates-dir-for,PACKAGING,vndk-snapshot) -vndk_snapshot_out := $(vndk_snapshot_top)/vndk-snapshot -vndk_snapshot_soong_dir := $(call intermediates-dir-for,PACKAGING,vndk-snapshot-soong) - -####################################### -# vndk_snapshot_zip -vndk_snapshot_variant := $(vndk_snapshot_out)/$(TARGET_ARCH) -vndk_snapshot_zip := $(PRODUCT_OUT)/android-vndk-$(TARGET_PRODUCT).zip - -$(vndk_snapshot_zip): PRIVATE_VNDK_SNAPSHOT_OUT := $(vndk_snapshot_out) - -deps := $(call paths-of-intermediates,$(foreach txt,$(vndk_prebuilt_txts), \ - $(txt):$(patsubst %.txt,%.$(PLATFORM_VNDK_VERSION).txt,$(txt)))) -$(vndk_snapshot_zip): PRIVATE_CONFIGS_OUT := $(vndk_snapshot_variant)/configs -$(vndk_snapshot_zip): PRIVATE_CONFIGS_INTERMEDIATES := $(deps) -$(vndk_snapshot_zip): $(foreach d,$(deps),$(call word-colon,1,$(d))) -deps := - -vndk_snapshot_soong_files := $(call copy-many-files, $(SOONG_VNDK_SNAPSHOT_FILES), $(vndk_snapshot_soong_dir)) - -$(vndk_snapshot_zip): PRIVATE_VNDK_SNAPSHOT_SOONG_DIR := $(vndk_snapshot_soong_dir) -$(vndk_snapshot_zip): PRIVATE_VNDK_SNAPSHOT_SOONG_FILES := $(sort $(vndk_snapshot_soong_files)) -$(vndk_snapshot_zip): $(vndk_snapshot_soong_files) - -# Args -# $(1): destination directory -# $(2): list of files (src:dest) to copy -$(vndk_snapshot_zip): private-copy-intermediates = \ - $(if $(2),$(strip \ - @mkdir -p $(1) && \ - $(foreach file,$(2), \ - cp $(call word-colon,1,$(file)) $(call append-path,$(1),$(call word-colon,2,$(file))) && \ - ) \ - true \ - )) - -$(vndk_snapshot_zip): $(SOONG_ZIP) - @echo 'Generating VNDK snapshot: $@' - @rm -f $@ - @rm -rf $(PRIVATE_VNDK_SNAPSHOT_OUT) - @mkdir -p $(PRIVATE_VNDK_SNAPSHOT_OUT) - $(call private-copy-intermediates, \ - $(PRIVATE_CONFIGS_OUT),$(PRIVATE_CONFIGS_INTERMEDIATES)) - $(hide) $(SOONG_ZIP) -o $@ -C $(PRIVATE_VNDK_SNAPSHOT_OUT) -D $(PRIVATE_VNDK_SNAPSHOT_OUT) \ - -C $(PRIVATE_VNDK_SNAPSHOT_SOONG_DIR) $(foreach f,$(PRIVATE_VNDK_SNAPSHOT_SOONG_FILES),-f $(f)) - .PHONY: vndk -vndk: $(vndk_snapshot_zip) - -$(call dist-for-goals, vndk, $(vndk_snapshot_zip)) +vndk: $(SOONG_VNDK_SNAPSHOT_ZIP) -# clear global vars -clang-ubsan-vndk-core := -paths-of-intermediates := -vndk_prebuilt_txts := -vndk_snapshot_top := -vndk_snapshot_out := -vndk_snapshot_soong_dir := -vndk_snapshot_soong_files := -vndk_snapshot_variant := +$(call dist-for-goals, vndk, $(SOONG_VNDK_SNAPSHOT_ZIP)) else # BOARD_VNDK_RUNTIME_DISABLE is set to 'true' error_msg := "CANNOT generate VNDK snapshot. BOARD_VNDK_RUNTIME_DISABLE must not be set to 'true'." diff --git a/core/tasks/with-license.mk b/core/tasks/with-license.mk new file mode 100644 index 0000000000..1f7ae893c9 --- /dev/null +++ b/core/tasks/with-license.mk @@ -0,0 +1,51 @@ +# Copyright (C) 2019 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +.PHONY: with-license + +name := $(TARGET_PRODUCT) +ifeq ($(TARGET_BUILD_TYPE),debug) + name := $(name)_debug +endif + +name := $(name)-img-$(FILE_NAME_TAG)-with-license + +with_license_intermediates := \ + $(call intermediates-dir-for,PACKAGING,with_license) + +# Create a with-license artifact target +license_image_input_zip := $(with_license_intermediates)/$(name).zip +$(license_image_input_zip) : $(BUILT_TARGET_FILES_PACKAGE) $(ZIP2ZIP) +# DO NOT PROCEED without a license file. +ifndef VENDOR_BLOBS_NOTICE + @echo "with-license requires VENDOR_BLOBS_NOTICE to be set." + exit 1 +else + $(ZIP2ZIP) -i $(BUILT_TARGET_FILES_PACKAGE) -o $@ \ + RADIO/bootloader.img:bootloader.img RADIO/radio.img:radio.img \ + IMAGES/system.img:system.img IMAGES/vendor.img:vendor.img \ + IMAGES/boot.img:boot.img OTA/android-info.txt:android-info.txt +endif +with_license_zip := $(PRODUCT_OUT)/$(name).sh +$(with_license_zip): PRIVATE_NAME := $(name) +$(with_license_zip): PRIVATE_INPUT_ZIP := $(license_image_input_zip) +$(with_license_zip): PRIVATE_VENDOR_BLOBS_NOTICE := $(VENDOR_BLOBS_NOTICE) +$(with_license_zip): $(license_image_input_zip) $(VENDOR_BLOBS_NOTICE) +$(with_license_zip): $(HOST_OUT_EXECUTABLES)/generate-self-extracting-archive + # Args: <output> <input archive> <comment> <license file> + $(HOST_OUT_EXECUTABLES)/generate-self-extracting-archive $@ \ + $(PRIVATE_INPUT_ZIP) $(PRIVATE_NAME) $(PRIVATE_VENDOR_BLOBS_NOTICE) +with-license : $(with_license_zip) +$(call dist-for-goals, with-license, $(with_license_zip)) diff --git a/envsetup.sh b/envsetup.sh index f0c6b9bb1d..a44cd5053d 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -11,14 +11,17 @@ Invoke ". build/envsetup.sh" from your shell to add the following functions to y - tapas: tapas [<App1> <App2> ...] [arm|x86|mips|arm64|x86_64|mips64] [eng|userdebug|user] - croot: Changes directory to the top of the tree, or a subdirectory thereof. - m: Makes from the top of the tree. -- mm: Builds all of the modules in the current directory, but not their dependencies. -- mmm: Builds all of the modules in the supplied directories, but not their dependencies. +- mm: Builds and installs all of the modules in the current directory, and their + dependencies. +- mmm: Builds and installs all of the modules in the supplied directories, and their + dependencies. To limit the modules being built use the syntax: mmm dir/:target1,target2. -- mma: Builds all of the modules in the current directory, and their dependencies. -- mmma: Builds all of the modules in the supplied directories, and their dependencies. +- mma: Same as 'mm' +- mmma: Same as 'mmm' - provision: Flash device with all required partitions. Options will be passed on to fastboot. - cgrep: Greps on all local C/C++ files. - ggrep: Greps on all local Gradle files. +- gogrep: Greps on all local Go files. - jgrep: Greps on all local Java files. - resgrep: Greps on all local res/*.xml files. - mangrep: Greps on all local AndroidManifest.xml files. @@ -968,6 +971,12 @@ function ggrep() -exec grep --color -n "$@" {} + } +function gogrep() +{ + find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f -name "*\.go" \ + -exec grep --color -n "$@" {} + +} + function jgrep() { find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f -name "*\.java" \ @@ -1016,7 +1025,7 @@ case `uname -s` in Darwin) function mgrep() { - find -E . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o \( -iregex '.*/(Makefile|Makefile\..*|.*\.make|.*\.mak|.*\.mk|.*\.bp)' -o -regex '(.*/)?soong/[^/]*.go' \) -type f \ + find -E . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o \( -iregex '.*/(Makefile|Makefile\..*|.*\.make|.*\.mak|.*\.mk|.*\.bp)' -o -regex '(.*/)?(build|soong)/.*[^/]*\.go' \) -type f \ -exec grep --color -n "$@" {} + } @@ -1030,7 +1039,7 @@ case `uname -s` in *) function mgrep() { - find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o \( -regextype posix-egrep -iregex '(.*\/Makefile|.*\/Makefile\..*|.*\.make|.*\.mak|.*\.mk|.*\.bp)' -o -regextype posix-extended -regex '(.*/)?soong/[^/]*.go' \) -type f \ + find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o \( -regextype posix-egrep -iregex '(.*\/Makefile|.*\/Makefile\..*|.*\.make|.*\.mak|.*\.mk|.*\.bp)' -o -regextype posix-extended -regex '(.*/)?(build|soong)/.*[^/]*\.go' \) -type f \ -exec grep --color -n "$@" {} + } diff --git a/target/product/aosp_arm64.mk b/target/product/aosp_arm64.mk index cc4785a24c..dda805fddf 100644 --- a/target/product/aosp_arm64.mk +++ b/target/product/aosp_arm64.mk @@ -39,9 +39,6 @@ ifeq (aosp_arm64,$(TARGET_PRODUCT)) PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := relaxed endif -PRODUCT_ARTIFACT_PATH_REQUIREMENT_WHITELIST += \ - root/init.zygote64_32.rc \ - # # All components inherited here go to product image # diff --git a/target/product/aosp_x86_64.mk b/target/product/aosp_x86_64.mk index a47170207b..153f499a69 100644 --- a/target/product/aosp_x86_64.mk +++ b/target/product/aosp_x86_64.mk @@ -39,9 +39,6 @@ ifeq (aosp_x86_64,$(TARGET_PRODUCT)) PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := relaxed endif -PRODUCT_ARTIFACT_PATH_REQUIREMENT_WHITELIST += \ - root/init.zygote64_32.rc \ - # # All components inherited here go to product image # diff --git a/target/product/base_system.mk b/target/product/base_system.mk index ae72e04aec..833bf0ffc1 100644 --- a/target/product/base_system.mk +++ b/target/product/base_system.mk @@ -16,7 +16,6 @@ # Base modules and settings for the system partition. PRODUCT_PACKAGES += \ - adbd \ adbd_system_binaries \ am \ android.hidl.allocator@1.0-service \ @@ -48,6 +47,7 @@ PRODUCT_PACKAGES += \ cgroups.json \ charger \ cmd \ + com.android.adbd \ com.android.apex.cts.shim.v1_prebuilt \ com.android.conscrypt \ com.android.i18n \ @@ -75,7 +75,7 @@ PRODUCT_PACKAGES += \ ExtServices \ ExtShared \ flags_health_check \ - framework \ + framework-minus-apex \ framework-res \ framework-sysconfig.xml \ fsck_msdos \ @@ -206,7 +206,7 @@ PRODUCT_PACKAGES += \ mtpd \ ndc \ netd \ - NetworkStack \ + NetworkStackNext \ org.apache.http.legacy \ otacerts \ PackageInstaller \ @@ -316,7 +316,7 @@ endif # The order matters for runtime class lookup performance. PRODUCT_BOOT_JARS := \ $(TARGET_CORE_JARS) \ - framework \ + framework-minus-apex \ ext \ telephony-common \ voip-common \ diff --git a/target/product/emulator.mk b/target/product/emulator.mk index 7ff01cd9f8..52fa1a7c91 100644 --- a/target/product/emulator.mk +++ b/target/product/emulator.mk @@ -20,8 +20,6 @@ # Device modules PRODUCT_PACKAGES += \ - libGLES_android \ - vintf \ CarrierConfig \ # need this for gles libraries to load properly diff --git a/target/product/emulator_vendor.mk b/target/product/emulator_vendor.mk index e67124eb43..7891a2697e 100644 --- a/target/product/emulator_vendor.mk +++ b/target/product/emulator_vendor.mk @@ -21,21 +21,6 @@ $(call inherit-product, $(SRC_TARGET_DIR)/product/handheld_vendor.mk) $(call inherit-product, $(SRC_TARGET_DIR)/product/telephony_vendor.mk) -# TODO(b/123495142): these files should be clean up -PRODUCT_ARTIFACT_PATH_REQUIREMENT_WHITELIST := \ - system/bin/vintf \ - system/etc/permissions/android.software.verified_boot.xml \ - system/etc/permissions/privapp-permissions-goldfish.xml \ - system/lib/egl/libGLES_android.so \ - system/lib64/egl/libGLES_android.so \ - system/priv-app/SdkSetup/SdkSetup.apk \ - system/priv-app/SdkSetup/oat/% \ - -# Device modules -PRODUCT_PACKAGES += \ - libGLES_android \ - vintf \ - # need this for gles libraries to load properly # after moving to /vendor/lib/ PRODUCT_PACKAGES += \ diff --git a/target/product/gsi/Android.mk b/target/product/gsi/Android.mk index 2b288e6b24..536fe0c9a8 100644 --- a/target/product/gsi/Android.mk +++ b/target/product/gsi/Android.mk @@ -1,20 +1,8 @@ LOCAL_PATH:= $(call my-dir) ##################################################################### -# Create the list of vndk libraries from the source code. -INTERNAL_VNDK_LIB_LIST := $(call intermediates-dir-for,PACKAGING,vndk)/libs.txt -$(INTERNAL_VNDK_LIB_LIST): - @echo "Generate: $@" - @mkdir -p $(dir $@) - $(hide) echo -n > $@ - $(hide) $(foreach lib, $(filter-out libclang_rt.%,$(LLNDK_LIBRARIES)), \ - echo LLNDK: $(lib).so >> $@;) - $(hide) $(foreach lib, $(VNDK_SAMEPROCESS_LIBRARIES), \ - echo VNDK-SP: $(lib).so >> $@;) - $(hide) $(foreach lib, $(filter-out libclang_rt.%,$(VNDK_CORE_LIBRARIES)), \ - echo VNDK-core: $(lib).so >> $@;) - $(hide) $(foreach lib, $(VNDK_PRIVATE_LIBRARIES), \ - echo VNDK-private: $(lib).so >> $@;) +# list of vndk libraries from the source code. +INTERNAL_VNDK_LIB_LIST := $(SOONG_VNDK_LIBRARIES_FILE) ##################################################################### # This is the up-to-date list of vndk libs. @@ -49,6 +37,9 @@ else ifeq ($(TARGET_BUILD_PDK),true) check-vndk-list: ; else ifeq ($(TARGET_SKIP_CURRENT_VNDK),true) check-vndk-list: ; +else ifeq ($(BOARD_VNDK_VERSION),) +# b/143233626 do not check vndk-list when vndk libs are not built +check-vndk-list: ; else check-vndk-list: $(check-vndk-list-timestamp) ifneq ($(SKIP_ABI_CHECKS),true) @@ -154,7 +145,8 @@ LOCAL_REQUIRED_MODULES += \ vndkprivate.libraries.txt \ vndkcorevariant.libraries.txt \ $(addsuffix .vendor,$(VNDK_CORE_LIBRARIES)) \ - $(addsuffix .vendor,$(VNDK_SAMEPROCESS_LIBRARIES)) + $(addsuffix .vendor,$(VNDK_SAMEPROCESS_LIBRARIES)) \ + com.android.vndk.current endif include $(BUILD_PHONY_PACKAGE) @@ -166,8 +158,11 @@ ifneq ($(TARGET_IS_64_BIT),true) _binder32 := _binder32 endif endif +# Phony targets are installed for **.libraries.txt files. +# TODO(b/141450808): remove following VNDK phony targets when **.libraries.txt files are provided by apexes. LOCAL_REQUIRED_MODULES := \ $(foreach vndk_ver,$(PRODUCT_EXTRA_VNDK_VERSIONS),vndk_v$(vndk_ver)_$(TARGET_ARCH)$(_binder32)) +LOCAL_REQUIRED_MODULES += $(foreach vndk_ver,$(PRODUCT_EXTRA_VNDK_VERSIONS),com.android.vndk.v$(vndk_ver)) _binder32 := include $(BUILD_PHONY_PACKAGE) diff --git a/target/product/gsi/current.txt b/target/product/gsi/current.txt index 4170de42ca..b3a0d9bc56 100644 --- a/target/product/gsi/current.txt +++ b/target/product/gsi/current.txt @@ -25,8 +25,8 @@ VNDK-SP: android.hardware.graphics.mapper@2.1.so VNDK-SP: android.hardware.graphics.mapper@3.0.so VNDK-SP: android.hardware.renderscript@1.0.so VNDK-SP: android.hidl.memory.token@1.0.so -VNDK-SP: android.hidl.memory@1.0.so VNDK-SP: android.hidl.memory@1.0-impl.so +VNDK-SP: android.hidl.memory@1.0.so VNDK-SP: android.hidl.safe_union@1.0.so VNDK-SP: libRSCpuRef.so VNDK-SP: libRSDriver.so @@ -61,12 +61,15 @@ VNDK-core: android.hardware.atrace@1.0.so VNDK-core: android.hardware.audio.common@2.0.so VNDK-core: android.hardware.audio.common@4.0.so VNDK-core: android.hardware.audio.common@5.0.so +VNDK-core: android.hardware.audio.common@6.0.so VNDK-core: android.hardware.audio.effect@2.0.so VNDK-core: android.hardware.audio.effect@4.0.so VNDK-core: android.hardware.audio.effect@5.0.so +VNDK-core: android.hardware.audio.effect@6.0.so VNDK-core: android.hardware.audio@2.0.so VNDK-core: android.hardware.audio@4.0.so VNDK-core: android.hardware.audio@5.0.so +VNDK-core: android.hardware.audio@6.0.so VNDK-core: android.hardware.authsecret@1.0.so VNDK-core: android.hardware.automotive.audiocontrol@1.0.so VNDK-core: android.hardware.automotive.evs@1.0.so @@ -95,6 +98,7 @@ VNDK-core: android.hardware.camera.provider@2.5.so VNDK-core: android.hardware.cas.native@1.0.so VNDK-core: android.hardware.cas@1.0.so VNDK-core: android.hardware.cas@1.1.so +VNDK-core: android.hardware.cas@1.2.so VNDK-core: android.hardware.configstore-utils.so VNDK-core: android.hardware.configstore@1.0.so VNDK-core: android.hardware.configstore@1.1.so @@ -157,12 +161,13 @@ VNDK-core: android.hardware.radio@1.1.so VNDK-core: android.hardware.radio@1.2.so VNDK-core: android.hardware.radio@1.3.so VNDK-core: android.hardware.radio@1.4.so +VNDK-core: android.hardware.radio@1.5.so VNDK-core: android.hardware.secure_element@1.0.so VNDK-core: android.hardware.secure_element@1.1.so VNDK-core: android.hardware.sensors@1.0.so VNDK-core: android.hardware.sensors@2.0.so -VNDK-core: android.hardware.soundtrigger@2.0.so VNDK-core: android.hardware.soundtrigger@2.0-core.so +VNDK-core: android.hardware.soundtrigger@2.0.so VNDK-core: android.hardware.soundtrigger@2.1.so VNDK-core: android.hardware.soundtrigger@2.2.so VNDK-core: android.hardware.tetheroffload.config@1.0.so @@ -197,8 +202,8 @@ VNDK-core: android.hardware.wifi@1.2.so VNDK-core: android.hardware.wifi@1.3.so VNDK-core: android.hidl.allocator@1.0.so VNDK-core: android.hidl.memory.block@1.0.so -VNDK-core: android.hidl.token@1.0.so VNDK-core: android.hidl.token@1.0-utils.so +VNDK-core: android.hidl.token@1.0.so VNDK-core: android.system.net.netd@1.0.so VNDK-core: android.system.net.netd@1.1.so VNDK-core: android.system.suspend@1.0.so @@ -242,8 +247,8 @@ VNDK-core: libpiex.so VNDK-core: libpng.so VNDK-core: libpower.so VNDK-core: libprocinfo.so -VNDK-core: libprotobuf-cpp-full.so -VNDK-core: libprotobuf-cpp-lite.so +VNDK-core: libprotobuf-cpp-full-3.9.1.so +VNDK-core: libprotobuf-cpp-lite-3.9.1.so VNDK-core: libpuresoftkeymasterdevice.so VNDK-core: libradio_metadata.so VNDK-core: libselinux.so diff --git a/target/product/gsi_arm64.mk b/target/product/gsi_arm64.mk index 09fb633c7a..645bc3add6 100644 --- a/target/product/gsi_arm64.mk +++ b/target/product/gsi_arm64.mk @@ -23,9 +23,6 @@ $(call inherit-product, $(SRC_TARGET_DIR)/product/mainline_system.mk) # Enable mainline checking PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := relaxed -PRODUCT_ARTIFACT_PATH_REQUIREMENT_WHITELIST += \ - root/init.zygote64_32.rc \ - # # All components inherited here go to product image # diff --git a/target/product/gsi_release.mk b/target/product/gsi_release.mk index cab3916382..faaa9351c8 100644 --- a/target/product/gsi_release.mk +++ b/target/product/gsi_release.mk @@ -51,19 +51,3 @@ PRODUCT_PACKAGES += \ # Support addtional P and Q VNDK packages PRODUCT_EXTRA_VNDK_VERSIONS := 28 29 - -# The 64 bits GSI build targets inhiert core_64_bit.mk to enable 64 bits and -# include the init.zygote64_32.rc. -# 64 bits GSI for releasing need to includes different zygote settings for -# vendor.img to select by setting property ro.zygote=zygote64_32 or -# ro.zygote=zygote32_64: -# 1. 64-bit primary, 32-bit secondary, or -# 2. 32-bit primary, 64-bit secondary -# Here includes the init.zygote32_64.rc if it had inhierted core_64_bit.mk. -ifeq (true|true,$(TARGET_SUPPORTS_32_BIT_APPS)|$(TARGET_SUPPORTS_64_BIT_APPS)) -PRODUCT_COPY_FILES += \ - system/core/rootdir/init.zygote32_64.rc:root/init.zygote32_64.rc - -PRODUCT_ARTIFACT_PATH_REQUIREMENT_WHITELIST += \ - root/init.zygote32_64.rc -endif diff --git a/target/product/mainline_arm64.mk b/target/product/mainline_arm64.mk index ab3c4acdba..850c7754a5 100644 --- a/target/product/mainline_arm64.mk +++ b/target/product/mainline_arm64.mk @@ -19,19 +19,19 @@ $(call inherit-product, $(SRC_TARGET_DIR)/product/mainline.mk) whitelist := product_manifest.xml $(call enforce-product-packages-exist,$(whitelist)) -PRODUCT_NAME := mainline_arm64 -PRODUCT_DEVICE := mainline_arm64 -PRODUCT_BRAND := generic -PRODUCT_SHIPPING_API_LEVEL := 28 -# TODO(b/137033385): change this back to "all" -PRODUCT_RESTRICT_VENDOR_FILES := owner - PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := relaxed -PRODUCT_ARTIFACT_PATH_REQUIREMENT_WHITELIST += \ - root/init.zygote64_32.rc \ # Modules that should probably be moved to /product PRODUCT_ARTIFACT_PATH_REQUIREMENT_WHITELIST += \ system/bin/healthd \ system/etc/init/healthd.rc \ system/etc/vintf/manifest/manifest_healthd.xml \ + +PRODUCT_SHIPPING_API_LEVEL := 29 + +# TODO(b/137033385): change this back to "all" +PRODUCT_RESTRICT_VENDOR_FILES := owner + +PRODUCT_NAME := mainline_arm64 +PRODUCT_DEVICE := mainline_arm64 +PRODUCT_BRAND := generic diff --git a/target/product/mainline_system.mk b/target/product/mainline_system.mk index cd6a0f785a..f7eb8ad5b4 100644 --- a/target/product/mainline_system.mk +++ b/target/product/mainline_system.mk @@ -110,6 +110,13 @@ PRODUCT_PACKAGES_DEBUG += \ PRODUCT_HOST_PACKAGES += \ tinyplay +# Include all zygote init scripts. "ro.zygote" will select one of them. +PRODUCT_COPY_FILES += \ + system/core/rootdir/init.zygote32.rc:root/init.zygote32.rc \ + system/core/rootdir/init.zygote64.rc:root/init.zygote64.rc \ + system/core/rootdir/init.zygote32_64.rc:root/init.zygote32_64.rc \ + system/core/rootdir/init.zygote64_32.rc:root/init.zygote64_32.rc + # Enable dynamic partition size PRODUCT_USE_DYNAMIC_PARTITION_SIZE := true diff --git a/target/product/mainline_system_arm64.mk b/target/product/mainline_system_arm64.mk index f75b21e2ce..60035c13ea 100644 --- a/target/product/mainline_system_arm64.mk +++ b/target/product/mainline_system_arm64.mk @@ -23,8 +23,6 @@ $(call enforce-product-packages-exist,) # Enable mainline checking PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := true -PRODUCT_ARTIFACT_PATH_REQUIREMENT_WHITELIST += \ - root/init.zygote64_32.rc \ PRODUCT_BUILD_CACHE_IMAGE := false PRODUCT_BUILD_ODM_IMAGE := false @@ -36,9 +34,11 @@ PRODUCT_BUILD_SYSTEM_OTHER_IMAGE := false PRODUCT_BUILD_USERDATA_IMAGE := false PRODUCT_BUILD_VENDOR_IMAGE := false +PRODUCT_SHIPPING_API_LEVEL := 29 + +# TODO(b/137033385): change this back to "all" +PRODUCT_RESTRICT_VENDOR_FILES := owner + PRODUCT_NAME := mainline_system_arm64 PRODUCT_DEVICE := mainline_arm64 PRODUCT_BRAND := generic -PRODUCT_SHIPPING_API_LEVEL := 28 -# TODO(b/137033385): change this back to "all" -PRODUCT_RESTRICT_VENDOR_FILES := owner diff --git a/target/product/mainline_system_x86.mk b/target/product/mainline_system_x86.mk index 830a2ed354..a30a1fcb4f 100644 --- a/target/product/mainline_system_x86.mk +++ b/target/product/mainline_system_x86.mk @@ -33,9 +33,11 @@ PRODUCT_BUILD_SYSTEM_OTHER_IMAGE := false PRODUCT_BUILD_USERDATA_IMAGE := false PRODUCT_BUILD_VENDOR_IMAGE := false +PRODUCT_SHIPPING_API_LEVEL := 29 + +# TODO(b/137033385): change this back to "all" +PRODUCT_RESTRICT_VENDOR_FILES := owner + PRODUCT_NAME := mainline_system_x86 PRODUCT_DEVICE := mainline_x86 PRODUCT_BRAND := generic -PRODUCT_SHIPPING_API_LEVEL := 28 -# TODO(b/137033385): change this back to "all" -PRODUCT_RESTRICT_VENDOR_FILES := owner diff --git a/target/product/mainline_system_x86_arm.mk b/target/product/mainline_system_x86_arm.mk index 3c06652d97..2e01cde768 100644 --- a/target/product/mainline_system_x86_arm.mk +++ b/target/product/mainline_system_x86_arm.mk @@ -33,9 +33,11 @@ PRODUCT_BUILD_SYSTEM_OTHER_IMAGE := false PRODUCT_BUILD_USERDATA_IMAGE := false PRODUCT_BUILD_VENDOR_IMAGE := false +PRODUCT_SHIPPING_API_LEVEL := 29 + +# TODO(b/137033385): change this back to "all" +PRODUCT_RESTRICT_VENDOR_FILES := owner + PRODUCT_NAME := mainline_system_x86_arm PRODUCT_DEVICE := mainline_x86_arm PRODUCT_BRAND := generic -PRODUCT_SHIPPING_API_LEVEL := 28 -# TODO(b/137033385): change this back to "all" -PRODUCT_RESTRICT_VENDOR_FILES := owner diff --git a/target/product/sdk_phone_x86_64.mk b/target/product/sdk_phone_x86_64.mk index 267796f39c..2d0d6e1380 100644 --- a/target/product/sdk_phone_x86_64.mk +++ b/target/product/sdk_phone_x86_64.mk @@ -27,9 +27,6 @@ ifeq (sdk_phone_x86_64,$(TARGET_PRODUCT)) PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := relaxed endif -PRODUCT_ARTIFACT_PATH_REQUIREMENT_WHITELIST += \ - root/init.zygote64_32.rc \ - # # All components inherited here go to product image # diff --git a/target/product/telephony_system.mk b/target/product/telephony_system.mk index 4da9bdfb47..737436a09b 100644 --- a/target/product/telephony_system.mk +++ b/target/product/telephony_system.mk @@ -22,5 +22,6 @@ PRODUCT_PACKAGES := \ CarrierDefaultApp \ CallLogBackup \ CellBroadcastAppPlatform \ + CellBroadcastServiceModule \ PRODUCT_COPY_FILES := \ diff --git a/tools/Android.bp b/tools/Android.bp new file mode 100644 index 0000000000..8c7eb38373 --- /dev/null +++ b/tools/Android.bp @@ -0,0 +1,26 @@ +// Copyright (C) 2019 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +python_binary_host { + name: "generate-self-extracting-archive", + srcs: ["generate-self-extracting-archive.py"], + version: { + py2: { + enabled: true, + }, + py3: { + enabled: false, + }, + }, +} diff --git a/tools/releasetools/Android.bp b/tools/releasetools/Android.bp index 6cde77e853..90a6485d63 100644 --- a/tools/releasetools/Android.bp +++ b/tools/releasetools/Android.bp @@ -264,6 +264,19 @@ python_binary_host { } python_binary_host { + name: "check_partition_sizes", + srcs: [ + "check_partition_sizes.py", + ], + libs: [ + "releasetools_common", + ], + defaults: [ + "releasetools_binary_defaults", + ], +} + +python_binary_host { name: "check_ota_package_signature", defaults: ["releasetools_binary_defaults"], srcs: [ @@ -419,6 +432,7 @@ python_defaults { name: "releasetools_test_defaults", srcs: [ "check_ota_package_signature.py", + "check_partition_sizes.py", "check_target_files_signatures.py", "make_recovery_patch.py", "merge_target_files.py", diff --git a/tools/releasetools/check_partition_sizes.py b/tools/releasetools/check_partition_sizes.py new file mode 100644 index 0000000000..745c136e90 --- /dev/null +++ b/tools/releasetools/check_partition_sizes.py @@ -0,0 +1,276 @@ +#!/usr/bin/env python +# +# Copyright (C) 2019 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Check dynamic partition sizes. + +usage: check_partition_sizes [info.txt] + +Check dump-super-partitions-info procedure for expected keys in info.txt. In +addition, *_image (e.g. system_image, vendor_image, etc.) must be defined for +each partition in dynamic_partition_list. + +Exit code is 0 if successful and non-zero if any failures. +""" + +from __future__ import print_function + +import logging +import sys + +import common +import sparse_img + +if sys.hexversion < 0x02070000: + print("Python 2.7 or newer is required.", file=sys.stderr) + sys.exit(1) + +logger = logging.getLogger(__name__) + +class Expression(object): + def __init__(self, desc, expr, value=None): + # Human-readable description + self.desc = str(desc) + # Numeric expression + self.expr = str(expr) + # Value of expression + self.value = int(expr) if value is None else value + + def CheckLe(self, other, level=logging.ERROR): + format_args = (self.desc, other.desc, self.expr, self.value, + other.expr, other.value) + if self.value <= other.value: + logger.info("%s is less than or equal to %s:\n%s == %d <= %s == %d", + *format_args) + else: + msg = "{} is greater than {}:\n{} == {} > {} == {}".format(*format_args) + if level == logging.ERROR: + raise RuntimeError(msg) + else: + logger.log(level, msg) + + def CheckEq(self, other): + format_args = (self.desc, other.desc, self.expr, self.value, + other.expr, other.value) + if self.value == other.value: + logger.info("%s equals %s:\n%s == %d == %s == %d", *format_args) + else: + raise RuntimeError("{} does not equal {}:\n{} == {} != {} == {}".format( + *format_args)) + + +# A/B feature flags +class DeviceType(object): + NONE = 0 + AB = 1 + RVAB = 2 # retrofit Virtual-A/B + VAB = 3 + + @staticmethod + def Get(info_dict): + if info_dict.get("ab_update") != "true": + return DeviceType.NONE + if info_dict.get("virtual_ab_retrofit") == "true": + return DeviceType.RVAB + if info_dict.get("virtual_ab") == "true": + return DeviceType.VAB + return DeviceType.AB + + +# Dynamic partition feature flags +class Dap(object): + NONE = 0 + RDAP = 1 + DAP = 2 + + @staticmethod + def Get(info_dict): + if info_dict.get("use_dynamic_partitions") != "true": + return Dap.NONE + if info_dict.get("dynamic_partition_retrofit") == "true": + return Dap.RDAP + return Dap.DAP + + +class DynamicPartitionSizeChecker(object): + def __init__(self, info_dict): + if "super_partition_size" in info_dict: + if "super_partition_warn_limit" not in info_dict: + info_dict["super_partition_warn_limit"] = \ + int(info_dict["super_partition_size"]) * 95 // 100 + if "super_partition_error_limit" not in info_dict: + info_dict["super_partition_error_limit"] = \ + int(info_dict["super_partition_size"]) + self.info_dict = info_dict + + + def _ReadSizeOfPartition(self, name): + # Tests uses *_image_size instead (to avoid creating empty sparse images + # on disk) + if name + "_image_size" in self.info_dict: + return int(self.info_dict[name + "_image_size"]) + return sparse_img.GetImagePartitionSize(self.info_dict[name + "_image"]) + + + # Round result to BOARD_SUPER_PARTITION_ALIGNMENT + def _RoundPartitionSize(self, size): + alignment = self.info_dict.get("super_partition_alignment") + if alignment is None: + return size + return (size + alignment - 1) // alignment * alignment + + + def _CheckSuperPartitionSize(self): + info_dict = self.info_dict + super_block_devices = \ + info_dict.get("super_block_devices", "").strip().split() + size_list = [int(info_dict.get("super_{}_device_size".format(b), "0")) + for b in super_block_devices] + sum_size = Expression("sum of super partition block device sizes", + "+".join(str(size) for size in size_list), + sum(size_list)) + super_partition_size = Expression("BOARD_SUPER_PARTITION_SIZE", + info_dict["super_partition_size"]) + sum_size.CheckEq(super_partition_size) + + def _CheckSumOfPartitionSizes(self, max_size, partition_names, + warn_size=None, error_size=None): + partition_size_list = [self._RoundPartitionSize( + self._ReadSizeOfPartition(p)) for p in partition_names] + sum_size = Expression("sum of sizes of {}".format(partition_names), + "+".join(str(size) for size in partition_size_list), + sum(partition_size_list)) + sum_size.CheckLe(max_size) + if error_size: + sum_size.CheckLe(error_size) + if warn_size: + sum_size.CheckLe(warn_size, level=logging.WARNING) + + def _NumDeviceTypesInSuper(self): + slot = DeviceType.Get(self.info_dict) + dap = Dap.Get(self.info_dict) + + if dap == Dap.NONE: + raise RuntimeError("check_partition_sizes should only be executed on " + "builds with dynamic partitions enabled") + + # Retrofit dynamic partitions: 1 slot per "super", 2 "super"s on the device + if dap == Dap.RDAP: + if slot != DeviceType.AB: + raise RuntimeError("Device with retrofit dynamic partitions must use " + "regular (non-Virtual) A/B") + return 1 + + # Launch DAP: 1 super on the device + assert dap == Dap.DAP + + # DAP + A/B: 2 slots in super + if slot == DeviceType.AB: + return 2 + + # DAP + retrofit Virtual A/B: same as A/B + if slot == DeviceType.RVAB: + return 2 + + # DAP + Launch Virtual A/B: 1 *real* slot in super (2 virtual slots) + if slot == DeviceType.VAB: + return 1 + + # DAP + non-A/B: 1 slot in super + assert slot == DeviceType.NONE + return 1 + + def _CheckAllPartitionSizes(self): + info_dict = self.info_dict + num_slots = self._NumDeviceTypesInSuper() + size_limit_suffix = (" / %d" % num_slots) if num_slots > 1 else "" + + # Check sum(all partitions) <= super partition (/ 2 for A/B devices launched + # with dynamic partitions) + if "super_partition_size" in info_dict and \ + "dynamic_partition_list" in info_dict: + max_size = Expression( + "BOARD_SUPER_PARTITION_SIZE{}".format(size_limit_suffix), + int(info_dict["super_partition_size"]) // num_slots) + warn_limit = Expression( + "BOARD_SUPER_PARTITION_WARN_LIMIT{}".format(size_limit_suffix), + int(info_dict["super_partition_warn_limit"]) // num_slots) + error_limit = Expression( + "BOARD_SUPER_PARTITION_ERROR_LIMIT{}".format(size_limit_suffix), + int(info_dict["super_partition_error_limit"]) // num_slots) + self._CheckSumOfPartitionSizes( + max_size, info_dict["dynamic_partition_list"].strip().split(), + warn_limit, error_limit) + + groups = info_dict.get("super_partition_groups", "").strip().split() + + # For each group, check sum(partitions in group) <= group size + for group in groups: + if "super_{}_group_size".format(group) in info_dict and \ + "super_{}_partition_list".format(group) in info_dict: + group_size = Expression( + "BOARD_{}_SIZE".format(group), + int(info_dict["super_{}_group_size".format(group)])) + self._CheckSumOfPartitionSizes( + group_size, + info_dict["super_{}_partition_list".format(group)].strip().split()) + + # Check sum(all group sizes) <= super partition (/ 2 for A/B devices + # launched with dynamic partitions) + if "super_partition_size" in info_dict: + group_size_list = [int(info_dict.get( + "super_{}_group_size".format(group), 0)) for group in groups] + sum_size = Expression("sum of sizes of {}".format(groups), + "+".join(str(size) for size in group_size_list), + sum(group_size_list)) + max_size = Expression( + "BOARD_SUPER_PARTITION_SIZE{}".format(size_limit_suffix), + int(info_dict["super_partition_size"]) // num_slots) + sum_size.CheckLe(max_size) + + def Run(self): + self._CheckAllPartitionSizes() + if self.info_dict.get("dynamic_partition_retrofit") == "true": + self._CheckSuperPartitionSize() + + +def CheckPartitionSizes(inp): + if isinstance(inp, str): + info_dict = common.LoadDictionaryFromFile(inp) + return DynamicPartitionSizeChecker(info_dict).Run() + if isinstance(inp, dict): + return DynamicPartitionSizeChecker(inp).Run() + raise ValueError("{} is not a dictionary or a valid path".format(inp)) + + +def main(argv): + args = common.ParseOptions(argv, __doc__) + if len(args) != 1: + common.Usage(__doc__) + sys.exit(1) + common.InitLogging() + CheckPartitionSizes(args[0]) + + +if __name__ == "__main__": + try: + common.CloseInheritedPipes() + main(sys.argv[1:]) + except common.ExternalError: + logger.exception("\n ERROR:\n") + sys.exit(1) + finally: + common.Cleanup() diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index dfcfb49378..7a0d99406e 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -1635,6 +1635,10 @@ def GetTargetFilesZipForSecondaryImages(input_file, skip_postinstall=False): partitions = [partition for partition in partitions if partition not in SECONDARY_PAYLOAD_SKIPPED_IMAGES] output_list.append('{}={}'.format(key, ' '.join(partitions))) + elif key == 'virtual_ab' or key == "virtual_ab_retrofit": + # Remove virtual_ab flag from secondary payload so that OTA client + # don't use snapshots for secondary update + pass else: output_list.append(line) return '\n'.join(output_list) diff --git a/tools/releasetools/test_check_partition_sizes.py b/tools/releasetools/test_check_partition_sizes.py new file mode 100644 index 0000000000..ed20873acb --- /dev/null +++ b/tools/releasetools/test_check_partition_sizes.py @@ -0,0 +1,128 @@ +# +# Copyright (C) 2019 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import common +import test_utils +from check_partition_sizes import CheckPartitionSizes + +class CheckPartitionSizesTest(test_utils.ReleaseToolsTestCase): + def setUp(self): + self.info_dict = common.LoadDictionaryFromLines(""" + use_dynamic_partitions=true + ab_update=true + super_block_devices=super + dynamic_partition_list=system vendor product + super_partition_groups=group + super_group_partition_list=system vendor product + super_partition_size=200 + super_super_device_size=200 + super_group_group_size=100 + system_image_size=50 + vendor_image_size=20 + product_image_size=20 + """.split("\n")) + + def test_ab(self): + CheckPartitionSizes(self.info_dict) + + def test_non_ab(self): + self.info_dict.update(common.LoadDictionaryFromLines(""" + ab_update=false + super_partition_size=100 + super_super_device_size=100 + """.split("\n"))) + CheckPartitionSizes(self.info_dict) + + def test_non_dap(self): + self.info_dict.update(common.LoadDictionaryFromLines(""" + use_dynamic_partitions=false + """.split("\n"))) + with self.assertRaises(RuntimeError): + CheckPartitionSizes(self.info_dict) + + def test_retrofit_dap(self): + self.info_dict.update(common.LoadDictionaryFromLines(""" + dynamic_partition_retrofit=true + super_block_devices=system vendor + super_system_device_size=75 + super_vendor_device_size=25 + super_partition_size=100 + """.split("\n"))) + CheckPartitionSizes(self.info_dict) + + def test_ab_partition_too_big(self): + self.info_dict.update(common.LoadDictionaryFromLines(""" + system_image_size=100 + """.split("\n"))) + with self.assertRaises(RuntimeError): + CheckPartitionSizes(self.info_dict) + + def test_ab_group_too_big(self): + self.info_dict.update(common.LoadDictionaryFromLines(""" + super_group_group_size=110 + """.split("\n"))) + with self.assertRaises(RuntimeError): + CheckPartitionSizes(self.info_dict) + + def test_no_image(self): + del self.info_dict["system_image_size"] + with self.assertRaises(KeyError): + CheckPartitionSizes(self.info_dict) + + def test_block_devices_not_match(self): + self.info_dict.update(common.LoadDictionaryFromLines(""" + dynamic_partition_retrofit=true + super_block_devices=system vendor + super_system_device_size=80 + super_vendor_device_size=25 + super_partition_size=100 + """.split("\n"))) + with self.assertRaises(RuntimeError): + CheckPartitionSizes(self.info_dict) + + def test_retrofit_vab(self): + self.info_dict.update(common.LoadDictionaryFromLines(""" + virtual_ab=true + virtual_ab_retrofit=true + """.split("\n"))) + CheckPartitionSizes(self.info_dict) + + def test_retrofit_vab_too_big(self): + self.info_dict.update(common.LoadDictionaryFromLines(""" + virtual_ab=true + virtual_ab_retrofit=true + system_image_size=100 + """.split("\n"))) + with self.assertRaises(RuntimeError): + CheckPartitionSizes(self.info_dict) + + def test_vab(self): + self.info_dict.update(common.LoadDictionaryFromLines(""" + virtual_ab=true + super_partition_size=100 + super_super_device_size=100 + """.split("\n"))) + CheckPartitionSizes(self.info_dict) + + def test_vab_too_big(self): + self.info_dict.update(common.LoadDictionaryFromLines(""" + virtual_ab=true + super_partition_size=100 + super_super_device_size=100 + system_image_size=100 + """.split("\n"))) + with self.assertRaises(RuntimeError): + CheckPartitionSizes(self.info_dict) |