Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 294ec7d9 authored by Tianjie's avatar Tianjie
Browse files

Check super size for factory OTA at build time

For VAB launched device, factory OTA will write system_other
partition to the super image. So we want to check that
sum(dynamic partitions) + system_other + overhead <= super at
build time.

Since we don't know the overhead at build time, we might instead
check sum(all partitions) < super.

Bug: 185809374
Test: m check-all-partition-sizes, unittests
Change-Id: Ia7ba5999d23924a1927e9a9463856a4d0ea90c20
parent ae6bdc0c
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -3399,7 +3399,7 @@ endif # BOARD_PREBUILT_PVMFWIMAGE
# $(INSTALLED_VENDORIMAGE_TARGET)" for "system vendor".
# (1): list of partitions like "system", "vendor" or "system product system_ext".
define images-for-partitions
$(strip $(foreach item,$(1),$(INSTALLED_$(call to-upper,$(item))IMAGE_TARGET)))
$(strip $(foreach item,$(1),$(if $(filter $(item),system_other),$(INSTALLED_SYSTEMOTHERIMAGE_TARGET),$(INSTALLED_$(call to-upper,$(item))IMAGE_TARGET))))
endef

# -----------------------------------------------------------------
@@ -4128,13 +4128,20 @@ ifeq (,$(TARGET_BUILD_UNBUNDLED))

ifeq (true,$(PRODUCT_BUILD_SUPER_PARTITION))

PARTITIONS_AND_OTHER_IN_SUPER := $(BOARD_SUPER_PARTITION_PARTITION_LIST)

# Add the system other image to the misc_info. Because factory ota may install system_other to the super partition.
ifdef BUILDING_SYSTEM_OTHER_IMAGE
PARTITIONS_AND_OTHER_IN_SUPER += system_other
endif # BUILDING_SYSTEM_OTHER_IMAGE

# $(1): misc_info.txt
# #(2): optional log file
define check-all-partition-sizes-target
  mkdir -p $(dir $(1))
  rm -f $(1)
  $(call dump-super-image-info, $(1))
  $(foreach partition,$(BOARD_SUPER_PARTITION_PARTITION_LIST), \
  $(foreach partition,$(PARTITIONS_AND_OTHER_IN_SUPER), \
    echo "$(partition)_image="$(call images-for-partitions,$(partition)) >> $(1);)
  $(CHECK_PARTITION_SIZES) $(if $(2),--logfile $(2),-v) $(1)
endef
@@ -4145,7 +4152,7 @@ $(call dist-for-goals, droid_targets, $(check_all_partition_sizes_log))

$(check_all_partition_sizes_log): \
    $(CHECK_PARTITION_SIZES) \
    $(call images-for-partitions,$(BOARD_SUPER_PARTITION_PARTITION_LIST))
    $(call images-for-partitions,$(PARTITIONS_AND_OTHER_IN_SUPER))
	$(call check-all-partition-sizes-target, \
	  $(call intermediates-dir-for,PACKAGING,check-all-partition-sizes)/misc_info.txt, \
	  $@)
+9 −3
Original line number Diff line number Diff line
@@ -223,8 +223,14 @@ class DynamicPartitionSizeChecker(object):
      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(),
      partitions_in_super = info_dict["dynamic_partition_list"].strip().split()
      # In the vab case, factory OTA will allocate space on super to install
      # the system_other partition. So add system_other to the partition list.
      if DeviceType.Get(self.info_dict) == DeviceType.VAB and (
          "system_other_image" in info_dict or
          "system_other_image_size" in info_dict):
        partitions_in_super.append("system_other")
      self._CheckSumOfPartitionSizes(max_size, partitions_in_super,
                                     warn_limit, error_limit)

    groups = info_dict.get("super_partition_groups", "").strip().split()
+11 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ class CheckPartitionSizesTest(test_utils.ReleaseToolsTestCase):
        system_image_size=50
        vendor_image_size=20
        product_image_size=20
        system_other_image_size=10
        """.split("\n"))

  def test_ab(self):
@@ -126,3 +127,13 @@ class CheckPartitionSizesTest(test_utils.ReleaseToolsTestCase):
        """.split("\n")))
    with self.assertRaises(RuntimeError):
      CheckPartitionSizes(self.info_dict)

  def test_vab_too_big_with_system_other(self):
    self.info_dict.update(common.LoadDictionaryFromLines("""
        virtual_ab=true
        system_other_image_size=20
        super_partition_size=101
        super_super_device_size=101
        """.split("\n")))
    with self.assertRaises(RuntimeError):
      CheckPartitionSizes(self.info_dict)