Правильный размер раздела super важен для возможности обновления устройства. Размер напрямую влияет на то, сколько обновлений может принять устройство и сколько пользователей смогут их установить.
Есть несколько важных переменных, которые необходимо учитывать. Первый – заводской размер, который задается для всех динамических разделов при первой установке ОС на устройство. Второй показатель – темп роста, который представляет собой процентное увеличение размера ОС за весь период, в течение которого устройство может получать обновления.
Кроме того, виртуальные устройства A/B могут использовать пространство на разделе /data во время обновления, и это необходимо учитывать при определении размера раздела super. Если для обновления требуется слишком много места на устройстве /data, некоторые пользователи не могут или не хотят его устанавливать. Однако если известно, что у большинства пользователей есть определенный процент свободного места, то устройства могут вычесть это пространство из super. Или же устройства могут гарантировать, что /data никогда не понадобится, просто сделав super достаточно большим.
Ниже приведены модели, которые помогут вам определить размер раздела super на основе этих переменных.
Используйте /data
Виртуальное A/B-тестирование позволяет уменьшить super, чтобы увеличить /data. Часть этого пространства требуется для обновления. Чтобы понять, как это повлияет на возможность обновлений, важно знать, какой процент устройств будет иметь такой объем свободного места с течением времени. Определить это число можно только с учетом аппаратного обеспечения устройства и поведения пользователей. В примерах ниже это число обозначено как AllowedUserdataUse.
Без сжатия
Без сжатия для полного обновления по воздуху требуется снимок, размер которого примерно равен размеру ОС. Это необходимо учитывать при определении размера раздела 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)
Например, рассмотрим устройство, на котором настроено сжатие Virtual 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 ГБ.
Без использования /data
Если вы хотите, чтобы для OTA-обновлений никогда не требовалось место для снимков в разделе /data, то размер раздела super определить просто.
Без сжатия
Для устройства с виртуальным A/B-разделом без сжатия или обычным A/B-разделом:
FinalDessertSize = FactorySize + (FactorySize * ExpectedGrowth) Super = FinalDessertSize * 2
Например, рассмотрим виртуальное устройство A/B с заводским размером 4 ГБ и ожидаемым ростом на 50%. Чтобы устройство никогда не использовало /data для беспроводных снимков, расчет будет выглядеть следующим образом:
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
Например, рассмотрим устройство со сжатием Virtual A/B, заводским размером 4 ГБ и ожидаемым ростом 50%. Чтобы устройство никогда не использовало /data для беспроводных снимков, расчет будет выглядеть следующим образом:
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 не дает значительного эффекта. В этом случае лучше использовать одну из формул без сжатия.
Как рассчитать размер
Чтобы найти значение FactorySize в приведенных выше примерах, сложите размеры всех динамических разделов. Образы динамических разделов AOSP:
system.imgvendor.imgproduct.imgsystem_ext.imgvendor_dlkm.imgsystem_dlkm.img
Размер нужно рассчитывать на основе несжатых изображений. При сборке Android 12 или более ранней версии образы по умолчанию разрежены, и их можно сделать неразреженными с помощью simg2img.
Также можно рассчитать размеры разделов из пакета OTA. При этом также оценивается размер снимка Virtual A/B для каждого раздела:
python3 system/update_engine/scripts/payload_info.py path/to/ota-package.zip
Или воспользуйтесь инструментом анализа OTA. Этот инструмент не загружает файлы и анализирует пакеты OTA локально.
Чтобы узнать значение ExpectedGrowth, используйте устройство, которое уже было выпущено. Используйте самое раннее и самое позднее изображение super, чтобы рассчитать рост.