Обновления без поддержки AB – это устаревший метод OTA-обновлений, который используется на более старых устройствах Android (Android 6 и более ранних версий). На этих устройствах есть специальный раздел восстановления, в котором хранится ПО, необходимое для распаковки скачанного пакета обновлений и применения обновления к другим разделам.
На более старых устройствах Android без разделов A/B пространство флеш-памяти обычно содержит следующие разделы:
- загрузочный диск
- Содержит ядро Linux и минимальную корневую файловую систему (загруженную в RAM-диск). Он подключает системный и другие разделы и запускает среду выполнения, расположенную в системном разделе.
- система
- Содержит системные приложения и библиотеки, исходный код которых доступен в Android Open Source Project (AOSP). При нормальной работе этот раздел монтируется только для чтения. Его содержимое меняется только во время беспроводного обновления.
- поставщик
- Содержит системные приложения и библиотеки, исходный код которых не доступен в Android Open Source Project (AOSP). В обычном режиме этот раздел монтируется только для чтения. Его содержимое меняется только во время обновления по воздуху.
- userdata
- Хранит данные, сохраненные приложениями, которые установил пользователь, и т. д. Этот раздел обычно не затрагивается при беспроводном обновлении.
- кешировать
- Временное хранилище, используемое некоторыми приложениями (для доступа к этому разделу требуются специальные разрешения для приложения), а также для хранения скачанных пакетов беспроводных обновлений. Другие программы используют это пространство, предполагая, что файлы могут исчезнуть в любой момент. При установке некоторых пакетов OTA этот раздел может быть полностью очищен. В кеше также хранятся журналы беспроводных обновлений.
- восстановление
- Содержит вторую полную систему Linux, включая ядро и специальный двоичный файл восстановления, который считывает пакет и использует его содержимое для обновления других разделов.
- misc
- Небольшой раздел, используемый для восстановления, чтобы сохранить информацию о том, что происходит, если устройство перезапускается во время применения пакета OTA.
Жизненный цикл беспроводного обновления
Обычно беспроводное обновление включает следующие этапы:
- Устройство регулярно проверяет наличие обновлений на OTA-серверах и получает уведомления об их доступности, в том числе URL пакета обновления и строку описания, которая будет показана пользователю.
-
Обновления скачиваются в кеш или раздел данных, а их криптографическая подпись проверяется по сертификатам в
/system/etc/security/otacerts.zip. Пользователю будет предложено установить обновление. - Устройство перезагружается в режиме восстановления, в котором вместо ядра в загрузочном разделе загружаются ядро и система в разделе восстановления.
-
Двоичный файл восстановления запускается с помощью init. Он находит аргументы командной строки в
/cache/recovery/command, которые указывают на скачанный пакет. -
Режим восстановления проверяет криптографическую подпись пакета, сравнивая ее с открытыми ключами в файле
/res/keys(часть RAM-диска, содержащегося в разделе восстановления). - Данные из пакета используются для обновления разделов загрузки, системы и/или поставщика. Один из новых файлов, оставшихся в системном разделе, содержит содержимое нового раздела восстановления.
-
Устройство перезагружается обычным образом.
- Загружается обновленный раздел загрузки, монтируется и начинает выполнять двоичные файлы в обновленном системном разделе.
-
При обычном запуске система сравнивает содержимое раздела восстановления с желаемым содержимым, которое ранее было сохранено в виде файла в
/system. Поскольку они различаются, раздел восстановления перепрошивается с желаемым содержимым. При последующих загрузках раздел восстановления уже будет содержать новый контент, поэтому перепрошивка не потребуется.
Обновление системы завершено. Журналы обновлений можно найти в папке /cache/recovery/last_log.#.
Обновить пакеты
Пакет обновлений – это файл .zip, содержащий исполняемый двоичный файл META-INF/com/google/android/update-binary. После проверки подписи пакета recovery извлекает этот двоичный файл в /tmp и запускает его, передавая следующие аргументы:
- Обновите номер версии API. Если аргументы, переданные в двоичный файл update, изменятся, это число увеличится.
- Дескриптор файла командного канала. Программа обновления может использовать этот канал для отправки команд обратно в двоичный файл восстановления, в основном для изменений интерфейса, например для отображения прогресса пользователю.
-
Название файла пакета обновления
.zip.
В качестве двоичного файла для обновления можно использовать любой статически скомпонованный двоичный файл. Инструменты для создания пакетов беспроводного обновления используют программу обновления (bootable/recovery/updater), которая предоставляет простой скриптовый язык, позволяющий выполнять множество задач по установке. Вы можете заменить его любым другим двоичным файлом, запущенным на устройстве.
Подробнее о двоичном файле программы обновления, синтаксисе edify и встроенных функциях можно узнать в статье Внутреннее устройство пакетов OTA.
Переход с предыдущих версий
При переходе с Android 2.3/3.0/4.0 основное изменение заключается в преобразовании всех функций, относящихся к определенному устройству, из набора функций C с заранее заданными именами в объекты C++. В таблице ниже перечислены старые функции и новые методы, которые выполняют примерно те же задачи.
| Функция C | Метод C++ |
|---|---|
| device_recovery_start() | Device::RecoveryStart() |
|
device_toggle_display() device_reboot_now() |
RecoveryUI::CheckKey() (также RecoveryUI::IsKeyPressed()) |
| device_handle_key() | Device::HandleMenuKey() |
| device_perform_action() | Device::InvokeMenuItem() |
| device_wipe_data() | Device::WipeData() |
| device_ui_init() | ScreenRecoveryUI::Init() |
Переход со старых функций на новые методы должен быть достаточно простым. Не забудьте добавить новую функцию make_device(), чтобы создать и вернуть экземпляр нового подкласса Device.