Чтобы реализовать виртуальный A/B на новом устройстве или модернизировать уже запущенное устройство, необходимо внести изменения в код, специфичный для устройства.
Создание флагов
Устройства, использующие виртуальные A/B, должны быть настроены как устройства A/B и запускаться с динамическими разделами .
Для устройств, запускаемых с виртуальным A/B, настройте их на наследование базовой конфигурации виртуального устройства A/B:
$(call inherit-product, \
$(SRC_TARGET_DIR)/product/virtual_ab_ota.mk)
Устройствам, запускаемым с виртуальным A/B, требуется только половина размера платы для BOARD_SUPER_PARTITION_SIZE
, поскольку слоты B больше не находятся в режиме super. То есть BOARD_SUPER_PARTITION_SIZE
должен быть больше или равен сумме (размеру групп обновлений) + накладные расходы , которые, в свою очередь, должны быть больше или равны сумме (размеру разделов) + накладные расходы .
Для Android 13 и более поздних версий, чтобы включить сжатие снимков с помощью Virtual A/B, унаследуйте следующую базовую конфигурацию:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
$(call inherit-product, \
$(SRC_TARGET_DIR)/product/virtual_ab_ota/vabc_features.mk)
Это позволяет создавать снимки пользовательского пространства с помощью Virtual A/B при использовании метода безоперационного сжатия. Затем вы можете настроить метод сжатия на один из поддерживаемых методов: zstd
и lz4
. В Android 15 сжатие можно дополнительно настроить в соответствии с потребностями устройства. Дополнительную информацию см. в разделе Точная настройка сжатия .
PRODUCT_VIRTUAL_AB_COMPRESSION_METHOD := lz4
PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536
В Android 12, чтобы включить сжатые снимки с помощью Virtual A/B, унаследуйте следующую базовую конфигурацию:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
$(call inherit-product, \
$(SRC_TARGET_DIR)/product/virtual_ab_ota/compression.mk)
XOR-сжатие
На устройствах, обновляющихся до Android 13 и более поздних версий, функция сжатия XOR не включена по умолчанию. Чтобы включить сжатие XOR, добавьте следующее в файл .mk
устройства.
PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.compression.xor.enabled=true
Сжатие XOR включено по умолчанию для устройств, наследуемых от android_t_baseline.mk
.
Объединение пользовательского пространства
В современной версии Virtual A/B (Android T и более поздние версии) процесс слияния снимков происходит полностью в пользовательском пространстве. Это изменение стало возможным благодаря snapuserd и dm-user. На устройствах, запускаемых с Android 13 и выше, объединение пользовательского пространства включено по умолчанию, а для обновления старых устройств это свойство можно установить следующим образом:
PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.userspace.snapshots.enabled=true
Управление загрузкой HAL
HAL управления загрузкой предоставляет OTA-клиентам интерфейс для управления загрузочными слотами. Virtual A/B требует незначительного обновления версии HAL управления загрузкой, поскольку необходимы дополнительные API-интерфейсы для обеспечения защиты загрузчика во время прошивки или сброса настроек. См. IBootControl.hal и Types.hal для получения последней версии определения HAL.
// hardware/interfaces/boot/1.1/types.hal
enum MergeStatus : uint8_t {
NONE, UNKNOWN, SNAPSHOTTED, MERGING, CANCELLED };
// hardware/interfaces/boot/1.1/IBootControl.hal
package android.hardware.boot@1.1;
interface IBootControl extends @1.0::IBootControl {
setSnapshotMergeStatus(MergeStatus status)
generates (bool success);
getSnapshotMergeStatus()
generates (MergeStatus status);
}
// Recommended implementation
Return<bool> BootControl::setSnapshotMergeStatus(MergeStatus v) {
// Write value to persistent storage
// e.g. misc partition (using libbootloader_message)
// bootloader rejects wipe when status is SNAPSHOTTED
// or MERGING
}
Изменения Fstab
Целостность раздела метаданных важна для процесса загрузки, особенно сразу после применения OTA-обновления. Таким образом, раздел метаданных необходимо проверить до того, как first_stage_init
смонтирует его. Чтобы это произошло, добавьте флаг check
fs_mgr к записи /metadata
. Ниже приведен пример:
/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount,check
Требования ядра
Чтобы включить создание снимков, установите для CONFIG_DM_SNAPSHOT
значение true
.
Для устройств, использующих F2FS, включите флаг f2fs:export FS_NOCOW_FL в пользовательское исправление ядра, чтобы исправить закрепление файлов. Включите также патч ядра f2fs: support выровненных закрепленных файлов .
Virtual A/B опирается на функции, добавленные в версии ядра 4.3: бит состояния переполнения в целях snapshot
и snapshot-merge
. Все устройства, запускаемые с Android 9 и более поздних версий, уже должны иметь ядро версии 4.4 или более поздней версии.
Чтобы включить сжатые снимки, минимальная поддерживаемая версия ядра — 4.19. Установите CONFIG_DM_USER=m
или CONFIG_DM_USER=y
. При использовании первого (модуля) модуль должен быть загружен на виртуальный диск первого этапа. Этого можно добиться, добавив в Makefile устройства следующую строку:
BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko
Изменения в инструментах быстрой загрузки
Android 11 вносит следующие изменения в протокол быстрой загрузки:
-
getvar snapshot-update-status
— Возвращает значение, которое HAL управления загрузкой сообщил загрузчику:- Если состояние
MERGING
, загрузчик должен вернутьmerging
. - Если состояние
SNAPSHOTTED
, загрузчик должен вернутьsnapshotted
. - В противном случае загрузчик должен вернуть
none
.
- Если состояние
-
snapshot-update merge
— завершает операцию слияния, загружаясь при необходимости в Recovery/fastbootd. Эта команда действительна только в том случае, еслиsnapshot-update-status
—merging
, и поддерживается только в fastbootd. -
snapshot-update cancel
— устанавливает статус слияния HAL элемента управления загрузкой вCANCELLED
. Эта команда недействительна, когда устройство заблокировано. -
erase
илиwipe
—erase
илиwipe
metadata
,userdata
или раздела, содержащего статус слияния для HAL управления загрузкой, должен проверять статус слияния моментальных снимков. Если статусMERGING
илиSNAPSHOTTED
, устройство должно прервать операцию. -
set_active
— командаset_active
, изменяющая активный слот, должна проверять статус слияния моментальных снимков. Если статусMERGING
, устройство должно прервать операцию. Слот можно безопасно изменить в состоянииSNAPSHOTTED
.
Эти изменения призваны предотвратить случайную невозможность загрузки устройства, но они могут помешать работе автоматизированных инструментов. Когда команды используются как компонент прошивки всех разделов, например, при запуске fastboot flashall
, рекомендуется использовать следующий порядок действий:
- Запросить
getvar snapshot-update-status
. - В случае
merging
илиsnapshotted
выполнитеsnapshot-update cancel
. - Продолжайте мигать.
Уменьшите требования к хранению
Устройствам, у которых нет полного хранилища A/B, выделенного в super, и которые планируют использовать /data
по мере необходимости, настоятельно рекомендуется использовать инструмент сопоставления блоков. Инструмент сопоставления блоков обеспечивает единообразие распределения блоков между сборками, сокращая ненужные записи в снимок. Это описано в разделе «Уменьшение размера OTA» .
Алгоритмы ОТА-сжатия
Пакеты OTA можно настроить под различные показатели производительности. Android предоставляет несколько поддерживаемых методов сжатия ( lz4
, zstd
и none
), которые имеют компромисс между временем установки, использованием пространства COW, временем загрузки и временем слияния снимков. Опцией по умолчанию, включенной для виртуального ab со сжатием, является lz4 compression method
.
Точная настройка сжатия
Алгоритмы сжатия можно дополнительно настроить с помощью двух методов: ( уровень сжатия ) (степень сжатия, достигаемая за счет скорости) и ( коэффициент сжатия ) (максимальный размер сжимаемого окна). Уровень сжатия доступен для определенных алгоритмов, таких как zstd
, и изменение уровня влечет за собой компромисс между скоростью и степенью сжатия. Коэффициент сжатия описывает максимальный размер окна сжатия, используемый во время установки OTA. По умолчанию установлено значение 64 КБ, но его можно переопределить, настроив параметр сборки PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR
. Поддерживаемые коэффициенты сжатия 4k, 8k, 16k, 32k, 64k, 128k и 256k.
PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536
Дополнительный OTA на Pixel 8 Pro
Время установки без учета постустановочной фазы | Использование пространства COW | Время загрузки после OTA | Время слияния снимков | |
---|---|---|---|---|
лз4 | 18 мин 15 с | 2,5 ГБ | 32,7 сек. | 98,6 сек. |
ЗСТД | 24 мин 49 с | 2,05 ГБ | 36,3 сек. | 133,2 сек. |
никто | 16 минут 42 секунды | 4,76 ГБ | 28,7 сек. | 76,6 сек. |
Полное OTA на Pixel 8 Pro
Время установки без учета постустановочной фазы | Использование пространства COW | Время загрузки после OTA | Время слияния снимков | |
---|---|---|---|---|
лз4 | 15 минут 11 секунд | 4,16 ГБ | 17,6 сек. | 82,2 сек. |
ЗСТД | 16 минут 19 секунд | 3,46 ГБ | 21,0 сек. | 106,3 сек. |
никто | 13 минут 33 секунды | 6,39 ГБ | 18,5 сек. | 92,5 сек. |