Обновления системы, не поддерживающие разделы A/B

Обновления без поддержки 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.

Жизненный цикл беспроводного обновления

Обычно беспроводное обновление включает следующие этапы:

  1. Устройство регулярно проверяет наличие обновлений на OTA-серверах и получает уведомления об их доступности, в том числе URL пакета обновления и строку описания, которая будет показана пользователю.
  2. Обновления скачиваются в кеш или раздел данных, а их криптографическая подпись проверяется по сертификатам в /system/etc/security/otacerts.zip. Пользователю будет предложено установить обновление.
  3. Устройство перезагружается в режиме восстановления, в котором вместо ядра в загрузочном разделе загружаются ядро и система в разделе восстановления.
  4. Двоичный файл восстановления запускается с помощью init. Он находит аргументы командной строки в /cache/recovery/command, которые указывают на скачанный пакет.
  5. Режим восстановления проверяет криптографическую подпись пакета, сравнивая ее с открытыми ключами в файле /res/keys (часть RAM-диска, содержащегося в разделе восстановления).
  6. Данные из пакета используются для обновления разделов загрузки, системы и/или поставщика. Один из новых файлов, оставшихся в системном разделе, содержит содержимое нового раздела восстановления.
  7. Устройство перезагружается обычным образом.
    1. Загружается обновленный раздел загрузки, монтируется и начинает выполнять двоичные файлы в обновленном системном разделе.
    2. При обычном запуске система сравнивает содержимое раздела восстановления с желаемым содержимым, которое ранее было сохранено в виде файла в /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.