Для выполнения OTA-обновления требуется запускать два приложения:
1) функция "Обновление системы" в Настройках
2) системное приложение "FOTA Update"
В результате работы первого приложения в папку DATA скачивается вспомогательная информация,
которая используется при выполнении второго приложения.
Здесь приведены пошаговое описание процедуры обновления (с картинками), а также объяснение
некоторых подробностей происходящих при этом процессов (это в конце).
1. Обновление системы
Управление процессом обновления системы следующим образом.
1. Открывается меню настроек:
Настройки -> Настройки устройства -> Об устройстве -> Обновление системы
2. При отсутствии подключения к сети выдается сообщение:
3. Если есть подключение к интернету, то появляется сообщение:
4. После нажатия на кнопку "Проверить обновления"
появляются сменяющиеся окна, на которых отображается
прогресс-бар скачивания информации с сервера:
5. По завершении скачивания появляется окно:
Примечание. К этому моменту в папке data/ota_package
будут находиться четыре файла, в которых содержится служебная информация,
необходимая для работы приложения "OTA-обновление" (см. ниже).
2. Приложение "OTA-обновление"
1. После перезагрузки открыть приложение "OTA-обновление" .
2. После нажатия на кнопку "CHECK VERSION" появляется номер обновленной версии
3. После нажатия на кнопку "DOWNLOAD" начинается процесс загрузки обновления, который
будет продолжаться некоторое время. Динамика обновления отображается на прогресс-баре,
а также появляется сообщение "UPGRADE, DO NOT OPERATE THE DEVICE"
4. При этом нужно учитывать, что в самом конце процесса обновления движение полоски
в прогресс-баре останавливается на несколько минут, поэтому нужно подождать, пока не появятся сообщение
об успешном завершении процесса:
'The system upgrade is complete'
[Cancel] [OK]
и кнопка
[ CLICK TO RESTART ]
5. После перезагрузки системы можно проверить действие обновления по предоствлению
системой рут-прав, запустив любое приложение рут-чекер:
3. Как происходит OTA-обновление
Примечание. Дальше будет рассказано о некоторых подробностях процесса
обновления (взгляд изнутри), которые могут представлять некий теоретическо-познавательный
интерес и важны лишь для понимания сути механизма обновления (хотя сделана лишь
попытка понимания). Поэтому не имеют большого практического значения для обычных пользователей.
Ну, то есть, дальше можно не читать...
Кроме того, нужно подчеркнуть, что всё сказанное
ниже представляет собой результаты экспериментов и предположений, поэтому не имеет
подтверждающих ссылок на документацию или другие источники и не претендует
на правильность и полноту.
Обновление OTA (Over The Air) или "по воздуху" в Android 12 использует
систему A и B слотов, позволяющую вносить изменения в прошивку
непосредственно на работающей приставке. При этом не используется раздел
Cache (такого раздела здесь просто нет , как в однослотовых системах,
а обновление устанавливается в разделы слота B (имена разделов с суффиксом _B),
при этом разделы активного слота A (имена разделов с суффиксом _A), которые
используются в работе системы, остаются в прежнем состоянии. После перезагрузки
активным становится слот B, и из его разделов загружается обновленная система.
При следующем обновлении слоты меняются местами. Так, если кратко, работает
механизм обновления.
Как уже было ранее отмечено, в результате выполнения системного обновления через
меню приложения "Настройки" в папке data/ota_package появляются четыре файла,
в которых содержится служебная информация, необходимая для работы приложения "OTA-обновление",
(что и откуда скачивать и что с этим делать).
Эти файлы (имя и и размер в байтах):
- metadata - 714
- care_map.pb - 580
- payload_metadata.bin - 287745
- payload_properties.txt - 154
Содержимое текстового файла с мета-информацией metadata
(переформатирован для наглядности):
ota-property-files=
payload_metadata.bin:3172:287745,
payload.bin:3172:12567151,
payload_properties.txt:12570375:154,
care_map.pb:2551:580,
metadata:63:714,
metadata.pb:839:1629
ota-required-cache=0
ota-streaming-property-files=
payload.bin:3172:12567151,
payload_properties.txt:12570375:154,
care_map.pb:2551:580,
metadata:63:714,
metadata.pb:839:1629
ota-type=AB
post-build=
google/blueline/blueline:
12/SP1A.210812.016.C1/8029091:
user/release-keys
post-build-incremental=8029091
post-sdk-level=31
post-security-patch-level=2021-10-05
post-timestamp=1640393541
pre-build=
google/blueline/blueline:
12/SP1A.210812.015/7679548:
user/release-keys
pre-build-incremental=7679548
pre-device=blueline
Мета данные представляют собой таблцу "параметр = значение", ниже приведен
предположительный смысл некоторых из них:
ota-property-files и ota-streaming-property-files
- это просто списки файлов (с размерами), которые
должны быть скопированы в папку ota_package и использованы в процессе обновления
ota-required-cache = 0 - признак того, что раздел cache не используется
ota-type = AB - тип обновления "бесшовный", основанный на слотах A и B
pre-build и post-build - предшествующая и обновленная версии
post-security-patch-level = 2021-10-05 - дата исправления системы безопасности OC
post-timestamp = 1640393541 - отметка времени 2021-12-25 07:52:21
pre-device = blueline - кодовое ("рыбное") наззвание устройства Google Pixel 3
Значения pre-device, pre-build-incremental и pre-build определяют состояние,
в котором должно находиться устройство, прежде чем можно будет установить пакет OTA.
Значения post-build-incremental и post-build определяют ожидаемое состояние устройства
после установки пакета OTA.
Значения полей pre- и post- получены из следующих соответствующих build.prop:
Значение pre-device получено из ro.product.devices
Значения pre-build-incremental и post-build-incremental получаются из ro.build.version.incremental.
Значения pre-build и post-build получаются из ro.build.fingerprint
Содержимое текстового файла payload_properties.txt, в котором указаны размеры и хеши:
бинарного файла метаданных (287478) и "полезной нагрузки" payload (12 567 151 = 12.57 Mb).
FILE_HASH=TZz7BOZvv7IJrji6Y+okCqh37Qi4Xd9avBUOOkMIsXA=
FILE_SIZE=12 567 151
METADATA_HASH=U1gmzrsnImGUhCpTq/Qoa3EBaEo2UNh8Wr7QXCRaaaQ=
METADATA_SIZE=287478
Заметим, что именно это значение 12.57 Mb отображатеся в окне системного обновления
в качестве параметра 'Размер обновления'.
Содержимое файла care_map.pb - это карта "лечения" системных разделов
payload_metadata.bin - бинарный файл метаданных
Возникает вопрос: что именно является 'полезной нагрузкой', и куда она попадает
в процессе OTA-обновления ? Учитывая, что в метаданных указан размер 12.57 Mb.
После завершения работы приложения FOTA Update в папке data/ota_package
появляется zip-архив с именем custom.zip, содержащий файлы:
- boot-resource.fex 7490560
- boot0_nand.fex 61440
- boot0_sdcard.fex 61440
- env.fex 131072
- toc0.fex 8
- toc1.fex 8
- u-boot.fex 1261568
Все эти файлы имеются в IMAGEWTY-образе прошивки, и они используются
Суммарный размер этих файлов составляет примерно 9 Mb, это близко к 12 Mb,
но не достаточно. Видимо, должно быть что-то ещё. Поэтому вопрос с точной идентификацией
payload оставим пока открытым...
4. Как обновляются A и B слоты
Механизм бешовного обновления работает так: система загружена и работает из слота A,
при этом в разделы слота B происходит запись обновленной информации. После перезагрузки слот B
становится активным и система загружается с него (т.е. из разделов с суффиксом '_B').
А до первого обновления разделы слота B чистые, в них записаны нули.
Из 25 разделов, присутствующих в таблице GPT, продублированы следующие:
bootloader_a - bootloader_b
env_a - env_b
boot_a - boot_b
vendor_boot_a - vendor_boot_b
vbmeta_a - vbmeta_b
vbmeta_system_a - vbmeta_system_b
vbmeta_vendor_a - vbmeta_vendor_b
dtbo_a - dtbo_b
а также, динамические разделы (system, vendor, product), упакованные в
физическом разделе super.
Для понимания механизма обновления наибольший интерес представляют разделы
ENV_A и ENV_B т.к. хранящиеся в них переменные окружения
определяют выбор активного слота и управляют работой вторичного загрузчика и
загрузкой операционной системы. Раздел ENV_B в исходном состоянии
и после загрузке метаданных остается опуст, но после завершения работы приложения
FOTA Update в него записывается содержимое файла env.fex из скачанного
в папку data/ota_package архива custom.zip.
По этой причине для корректной работы U-Boot и нормального входа в его оболочку
(командный интерфейс) после OTA-обновления требуется повторное исправление
содержимого раздела ENV_B.
Внимание ! После OTA-обновления и перезагрузки модифицируются две переменных ENV
для того, чтобы пометить раздел B как активный:
1) slot_suffix=_b (было _a)
2) mmc_root=/dev/mmcblk0p4 (было /dev/mmcblk0p3)
Эти переменные при продолжении загрузки используются U-Boot для выбора активного слота.
Что касается остальных разделов, относящихся к системе AB-слотов, то в процессе
OTA-обновления в большинстве таких слотов происходит копирование содержимого
раздела A в одноименный раздел B. Поэтому при сравнении dd-бекапов
таких разделов полученные файлы оказываются идентичными.