Как подобрать размер супер

Правильный размер super важен для возможности обновления устройства. Размер напрямую влияет на то, сколько обновлений может принять устройство и сколько пользователей смогут успешно установить эти обновления.

Есть несколько важных переменных, которые следует учитывать. Первый — это factory size , то есть размер всех динамических разделов при первой прошивке устройства. Во-вторых, скорость роста , которая представляет собой процент увеличения размера ОС в течение всего обновляемого срока службы устройства.

Кроме того, виртуальные устройства A/B могут использовать пространство в /data во время обновления, и это необходимо учитывать при определении размера super . Если в /data требуется слишком много места, некоторые пользователи не могут (или не хотят) получать обновление. Однако, если известно, что у большинства пользователей есть некоторый процент свободного места, устройства могут легко вычесть это пространство из super . Или устройства могут гарантировать, что /data никогда не понадобится, просто сделав их super большими.

Ниже приведены некоторые модели, помогающие определить размер super на основе этих переменных.

Опираясь на /данные

Виртуальный A/B поощряет сжатие super для увеличения размера /data . Часть этого пространства требуется во время обновления. Чтобы понять влияние на возможность обновления, важно знать, какой процент устройств, вероятно, будет иметь такой объем свободного места с течением времени. Определение этого числа сильно зависит от аппаратного обеспечения устройства и поведения пользователей на этом устройстве. В приведенных ниже примерах этот номер называется AllowedUserdataUse .

Без компрессии

Без сжатия для полного OTA требуется моментальный снимок примерно того же размера, что и ОС, поэтому это необходимо учитывать при определении размера super :

  FinalDessertSize = FactorySize + (FactorySize * ExpectedGrowth)
  Super = Max(FinalDessertUpdate, FinalDessertSize * 2 - AllowedUserdataUse)

Например, рассмотрим виртуальное устройство A/B с заводским размером 4 ГБ, ожидаемым ростом на 50 % и информацией о том, что почти у всех пользователей есть 1 ГБ свободного места (или они готовы освободить до 1 ГБ места для обновления). . Для этого устройства размер super может быть таким:

  FinalDessertSize = 4GB + (4GB * 0.5) = 6GB
  Super = Max(6GB, 6GB * 2 - 1GB) = Max(6GB, 11GB)

Таким образом, это устройство должно иметь super размером 11 ГБ.

С компрессией

При сжатии для полного OTA требуется снимок размером примерно 70% от размера ОС:

  FinalDessertSize = FactorySize + (FactorySize * ExpectedGrowth)
  FinalOTASnapshotSize = FinalDessertSize * 0.7
  Super = Max(FinalDessertUpdate, FinalDessertSize + FinalOTASnapshotSize - AllowedUserdataUse)

Например, рассмотрим устройство, настроенное с виртуальным сжатием A/B, с заводским размером 4 ГБ, ожидаемым ростом на 50 % и информацией о том, что почти у всех пользователей есть 1 ГБ свободного места (или они готовы освободить до 1 ГБ места для обновление). Для этого устройства размер super может быть таким:

  FinalDessertSize = 4GB + (4GB * 0.5) = 6GB
  FinalOTASnapshotSize = 6GB * 0.7 = 4.2GB
  Super = Max(6GB, 6GB + 4.2GB - 1GB) = Max(6GB, 9.2GB) = 9.2GB

Таким образом, на этом устройстве должен быть super размером 9,2 ГБ.

Не полагаясь на /данные

Если вы хотите, чтобы OTA никогда не требовали места для моментального снимка в /data , размер super не представляет сложности.

Без компрессии

Для виртуального устройства A/B без сжатия или обычного устройства A/B:

  FinalDessertSize = FactorySize + (FactorySize * ExpectedGrowth)
  Super = FinalDessertSize * 2

Например, рассмотрим виртуальное устройство A/B с заводским размером 4 ГБ и ожидаемым ростом на 50%. Чтобы гарантировать, что это устройство никогда не использует /data для моментальных снимков OTA, его расчет будет выглядеть так:

  FinalDessertSize = 4GB + (4GB * 0.5) = 6GB
  Super = FinalDessertSize * 2 = 12GB

Таким образом, это устройство должно иметь super размером 12 ГБ.

С компрессией

Для виртуального устройства A/B со сжатием:

  FinalDessertSize = FactorySize + (FactorySize * ExpectedGrowth)
  FinalOTASnapshotSize = FinalDessertSize * 0.7
  Super = FinalDessertSize + FinalOTASnapshotSize

Например, рассмотрим виртуальное устройство сжатия A/B с заводским размером 4 ГБ и ожидаемым ростом 50%. Чтобы гарантировать, что это устройство никогда не использует /data для моментальных снимков OTA, его расчет будет выглядеть так:

  FinalDessertSize = 4GB + (4GB * 0.5) = 6GB
  FinalOTASnapshotSize = 6GB * 0.7 = 4.2GB
  Super = 6GB + 4.2GB = 10.2GB

Таким образом, на этом устройстве должен быть super размером 10,2 ГБ.

Предостережения

Может показаться заманчивым заметить, что если заводской размер составляет 4 ГБ, а финальное обновление — 5 ГБ, то super должно быть 9 ГБ, а не 10 ГБ. Однако, если размер первого и последнего обновлений составляет 5 ГБ, места в super может не хватить для окончательного обновления. Приведенные выше формулы предполагают, что рост раздела может произойти в любое время. Место, необходимое для применения последнего обновления, может быть таким же, как и для применения первого обновления.

Обратите внимание, что коэффициенты сжатия являются оценочными. Образ ОС может сжиматься лучше или хуже в зависимости от его содержимого. При использовании сжатой файловой системы, такой как EROFS, дополнительное сжатие от Virtual A/B имеет убывающую отдачу. В этом случае лучше использовать одну из несжатых формул в качестве ориентира.

Измерение

Чтобы найти значение FinalDessertSize в приведенных выше примерах, сложите вместе размеры всех динамических разделов. Образы динамических разделов AOSP:

  • system.img
  • vendor.img
  • product.img
  • system_ext.img
  • vendor_dlkm.img
  • system_dlkm.img

Обязательно рассчитывайте размер на основе неразрезанных изображений. При сборке Android 12 или более ранней версии изображения разбираются по умолчанию, и их можно разобрать с помощью simg2img .

Также можно рассчитать размеры разделов из пакета OTA. При этом также оценивается размер виртуального моментального снимка A/B для каждого раздела:

  python3 system/update_engine/scripts/payload_info.py path/to/ota-package.zip

Или вы можете использовать инструмент анализа OTA . Этот инструмент не загружает файлы и локально анализирует пакеты OTA.

Чтобы найти значение ExpectedGrowth , используйте ранее выпущенное устройство. Используйте самое раннее и самое последнее super для расчета роста.