diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2019-11-11 21:27:30 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2019-11-11 21:27:30 +0000 |
commit | 8b2cd7805c88139e74d584d85fd4973854ebb8fb (patch) | |
tree | e5c856e4cb7f1d0b1161c1f0c151dac848b7fd85 | |
parent | c3b9433b861bffe2bb4057565836e6cbe6e0ec57 (diff) | |
parent | afb0ff8fea3d8cfa6c44f7d7b62a4f71d62a88da (diff) | |
download | build-android-mainline-10.0.0_r6.tar.gz |
Snap for 6001391 from afb0ff8fea3d8cfa6c44f7d7b62a4f71d62a88da to qt-aml-networking-releaseandroid-mainline-10.0.0_r6android10-mainline-networking-release
Change-Id: Ib22ee2f2338bbb42f517bab375305f960a528d96
-rw-r--r-- | core/Makefile | 188 | ||||
-rw-r--r-- | core/base_rules.mk | 2 | ||||
-rw-r--r-- | core/clear_vars.mk | 1 | ||||
-rw-r--r-- | core/config.mk | 1 | ||||
-rw-r--r-- | core/definitions.mk | 6 | ||||
-rw-r--r-- | core/local_systemsdk.mk | 14 | ||||
-rw-r--r-- | core/main.mk | 2 | ||||
-rw-r--r-- | core/product.mk | 3 | ||||
-rw-r--r-- | core/soong_cc_prebuilt.mk | 6 | ||||
-rw-r--r-- | core/soong_config.mk | 2 | ||||
-rw-r--r-- | core/tasks/with-license.mk | 51 | ||||
-rw-r--r-- | target/product/base_system.mk | 4 | ||||
-rw-r--r-- | target/product/gsi/current.txt | 4 | ||||
-rw-r--r-- | target/product/security/com_google_android_permissioncontroller-container.x509.pem | 30 | ||||
-rw-r--r-- | target/product/telephony_system.mk | 1 | ||||
-rw-r--r-- | tools/Android.bp | 26 | ||||
-rw-r--r-- | tools/releasetools/Android.bp | 14 | ||||
-rw-r--r-- | tools/releasetools/check_partition_sizes.py | 276 | ||||
-rwxr-xr-x | tools/releasetools/ota_from_target_files.py | 4 | ||||
-rw-r--r-- | tools/releasetools/test_check_partition_sizes.py | 128 |
20 files changed, 587 insertions, 176 deletions
diff --git a/core/Makefile b/core/Makefile index 60157965b6..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) @@ -5192,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 @@ -5202,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 477d764a1d..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 diff --git a/core/definitions.mk b/core/definitions.mk index eb3e612a88..8eb1142bf0 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -2101,10 +2101,10 @@ $(hide) if [ -s $(PRIVATE_JAVA_SOURCE_LIST) -o -n "$(PRIVATE_SRCJARS)" ] ; then --javacopts $(PRIVATE_JAVACFLAGS) $(COMMON_JDK_FLAGS) -- \ $(if $(PRIVATE_USE_SYSTEM_MODULES), \ --system $(PRIVATE_SYSTEM_MODULES_DIR), \ - $(addprefix --bootclasspath ,$(strip $(PRIVATE_BOOTCLASSPATH)))) \ - $(addprefix --classpath ,$(strip $(if $(PRIVATE_USE_SYSTEM_MODULES), \ + --bootclasspath $(strip $(PRIVATE_BOOTCLASSPATH))) \ + --classpath $(strip $(if $(PRIVATE_USE_SYSTEM_MODULES), \ $(filter-out $(PRIVATE_SYSTEM_MODULES_LIBS),$(PRIVATE_BOOTCLASSPATH))) \ - $(PRIVATE_ALL_JAVA_HEADER_LIBRARIES))) \ + $(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/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 e4cd6ad359..730cbd0cd3 100644 --- a/core/main.mk +++ b/core/main.mk @@ -967,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 ########################################################### diff --git a/core/product.mk b/core/product.mk index bc09c2bc97..102e6a5c19 100644 --- a/core/product.mk +++ b/core/product.mk @@ -376,6 +376,9 @@ _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) diff --git a/core/soong_cc_prebuilt.mk b/core/soong_cc_prebuilt.mk index 20950ca21e..2d5089d0e0 100644 --- a/core/soong_cc_prebuilt.mk +++ b/core/soong_cc_prebuilt.mk @@ -220,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 1138f08993..7ce59f1559 100644 --- a/core/soong_config.mk +++ b/core/soong_config.mk @@ -197,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/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/target/product/base_system.mk b/target/product/base_system.mk index 2fd0312e34..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 \ @@ -206,7 +206,7 @@ PRODUCT_PACKAGES += \ mtpd \ ndc \ netd \ - NetworkStack \ + NetworkStackNext \ org.apache.http.legacy \ otacerts \ PackageInstaller \ diff --git a/target/product/gsi/current.txt b/target/product/gsi/current.txt index 0f873de64a..b3a0d9bc56 100644 --- a/target/product/gsi/current.txt +++ b/target/product/gsi/current.txt @@ -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 diff --git a/target/product/security/com_google_android_permissioncontroller-container.x509.pem b/target/product/security/com_google_android_permissioncontroller-container.x509.pem deleted file mode 100644 index 95f476f2f1..0000000000 --- a/target/product/security/com_google_android_permissioncontroller-container.x509.pem +++ /dev/null @@ -1,30 +0,0 @@ ------BEGIN CERTIFICATE-----
-MIIGHDCCBASgAwIBAgIUQ6US4BMtEWcSr2vuqJ5tlHLrBuYwDQYJKoZIhvcNAQELBQAwgZ4xCzAJ
-BgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQw
-EgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDE6MDgGA1UEAwwxY29tX2dvb2ds
-ZV9hbmRyb2lkX3Blcm1pc3Npb25jb250cm9sbGVyLWNvbnRhaW5lcjAeFw0xOTAyMDEwMzU2MDZa
-Fw00OTAyMDEwMzU2MDZaMIGeMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQG
-A1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLR29vZ2xlIEluYy4xEDAOBgNVBAsTB0FuZHJv
-aWQxOjA4BgNVBAMMMWNvbV9nb29nbGVfYW5kcm9pZF9wZXJtaXNzaW9uY29udHJvbGxlci1jb250
-YWluZXIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCFBJYVLl8bg+dW9nE2R7pnwPAA
-q6JpnMzYnQb4lycDxugACxiWRTZ7wUSpIv/QY3Mu/dv6GnWJhrRwJFhCq0jISzsmRwMMi7DFEujc
-osO80s6kVjaQ71yYqMRhw2IfSIphFU0YMEgcucNAUG/ELFBDsnqxHqVdLxGDQZAwJ/Iz30olEBS4
-26VuwlpZrbIku/k0IO0B5NdzvSAQJECo2uOzEhEgQFQlTE5Lku9MX1PsC+pkokIRcYiOkXoXT6Qk
-wSkP23bpvsjbjwNOgavPs8Pdx4tHfTs60ysOdbNpHl5dWlDKvKRelxxUPS9yjTRFd6U8MZN0Ldt1
-8k4bzuptQ1yXML4csFGjsbhapqzEEO267ULdrWz58L+C1Rx/fBIV1efZOkNfdrrgGTIfnD8kbI9j
-kLPPPhOuPgMl2huflB4CcLLGyk2h7BkTYn6tM16Q/+i/qHtph81GZqdeDZRG9dG/VFqR8vD6JwCS
-aVci28zmzBR1kUlWoSRk2xiQmv7/ZGtgKVXppipVVasR2XUr+z3AFJm41TPAqei9xqeA6eRUmBbs
-YS0q/zSBPef0zTyyrQQLhkSW/D5sELEg9lidbpMUwe+myE9yNXnvbsQbzJFHrPanVLLeY896opaV
-GSjiIMaJdWrcp9OOYZQHO7W05UWmDvQHKg7Un6OxdFL/TEaZAwIDAQABo1AwTjAMBgNVHRMEBTAD
-AQH/MB0GA1UdDgQWBBTuRKWeFsHYvfDR4eoKuuMEz3iJrTAfBgNVHSMEGDAWgBTuRKWeFsHYvfDR
-4eoKuuMEz3iJrTANBgkqhkiG9w0BAQsFAAOCAgEAY6ua1I9ERwbs6SXZFqMGe5oryg/3Kbhx5Q+z
-uL8B8Nr85Ez/DR6Lr9PNBqR4Mc0/Rb8f1lHlxx5DcKggT1YjbbM9aULdrGI+wpvDwHp6kCo1T58L
-xn97KeJbTMy5uogLiBabXIiScyDEzz2GpdajbgsI9Io1i+v9uDv/RFWnZV+C7l3ZEZ2klo8Elexo
-BFOD0WdAptxERyBF549URonUxq3UWLbUisg0j8P3yKe9lmhZwO2tUmxaKQGlL4LAGRsQ4kTgXCwN
-WWUMRIYcdmW4TxLZy/KDKwLc6ezik07Ifc5bHajY3OSzRtp17Hf3U+/LnQt5KZD6MuoQu7Rxh1Fv
-pbUAgsD4UPEjUcsEEa3BbIcSfN6l68mkbf7AioGaKvOKXx9DVrrQYfW4gy5vskFyRMbLw5iTQ3Od
-WdViiw3ZmrCtnZLnUQY29B/04Ma0ejrtSonEJBl2VIakpyM0g5gyOcg17vl9xrAoITkbMp26GcUd
-1DQOlyBI2Uct7KKM2d9nuIEJwHn6D2eboRBk0Y/XPeg8IDNDUMx6K2ArOL5RUkBz3oGCdPQkLT+b
-PIps1fAOCGbE6HEPB6OEcTZNv8XXnchEjdwocTUgjAtnDhuGqcooQnCFbPodXISJURNZb5QUH2Ic
-Q4BDiSNSs38AF9dzBaFoUowHUySA0wrVDjT5tC0=
------END CERTIFICATE-----
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) |