Правильный выбор размера super
важен для возможности обновления устройства. Размер напрямую влияет на то, сколько обновлений может принять устройство и сколько пользователей смогут успешно принять эти обновления.
Есть несколько важных переменных, которые следует учитывать. Первый — заводской размер — размер всех динамических разделов при первой прошивке устройства. Второй — это темп роста , который представляет собой процент увеличения размера ОС в течение всего обновляемого срока службы устройства.
Кроме того, устройства Virtual A/B могут использовать пространство в /data
во время обновления, и это необходимо учитывать при определении размера super
. Если в /data
требуется слишком много места, некоторые пользователи не могут (или не хотят) принять обновление. Однако если известно, что у большинства пользователей есть некоторый процент свободного места, устройства могут легко вычесть это пространство из super
. Или устройства могут гарантировать, что /data
никогда не понадобится, просто сделав его super
большим.
Ниже приведены некоторые модели, которые помогут определить размер super
на основе этих переменных.
Опираясь на /data
Виртуальный 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 ГБ.
Не полагаясь на /data
Если вы хотите иметь 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 ГБ.
Со сжатием
Для устройства Virtual A/B со сжатием:
FinalDessertSize = FactorySize + (FactorySize * ExpectedGrowth) FinalOTASnapshotSize = FinalDessertSize * 0.7 Super = FinalDessertSize + FinalOTASnapshotSize
Например, рассмотрим устройство сжатия Virtual 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. При этом также оценивается размер моментального снимка Virtual A/B для каждого раздела:
python3 system/update_engine/scripts/payload_info.py path/to/ota-package.zip
Или вы можете использовать инструмент анализа OTA . Этот инструмент не загружает файлы и анализирует OTA-пакеты локально.
Чтобы найти значение ExpectedGrowth
, используйте ранее выпущенное устройство. Используйте самое раннее и самое последнее super
для расчета роста.