Обновления системы, отличные от A/B

На старых устройствах Android без разделов A/B флэш-память обычно содержит следующие разделы:

ботинок
Содержит ядро ​​Linux и минимальную корневую файловую систему (загружается на RAM-диск). Он монтирует системный и другие разделы и запускает среду выполнения, расположенную на системном разделе.
система
Содержит системные приложения и библиотеки с исходным кодом, доступным в Android Open Source Project (AOSP). При нормальной работе этот раздел монтируется только для чтения; его содержимое меняется только во время OTA-обновления.
продавец
Содержит системные приложения и библиотеки, исходный код которых отсутствует в Android Open Source Project (AOSP). При нормальной работе этот раздел монтируется только для чтения; его содержимое меняется только во время OTA-обновления.
данные пользователя
Хранит данные, сохраненные приложениями, установленными пользователем, и т. д. Этот раздел обычно не затрагивается процессом обновления OTA.
тайник
Область временного хранения, используемая несколькими приложениями (для доступа к этому разделу требуются специальные разрешения приложений) и для хранения загруженных пакетов обновлений OTA. Другие программы используют это пространство в расчете на то, что файлы могут исчезнуть в любой момент. Некоторые установки пакетов OTA могут привести к полной очистке этого раздела. Кэш также содержит журналы обновлений из обновления OTA.
восстановление
Содержит вторую полную систему Linux, включая ядро ​​и специальный двоичный файл восстановления, который считывает пакет и использует его содержимое для обновления других разделов.
разное
Крошечный раздел, используемый восстановлением для хранения некоторой информации о том, что он делает, на случай, если устройство будет перезапущено во время применения пакета OTA.

Жизнь OTA-обновления

Типичное 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 . Если аргументы, переданные в двоичный файл обновления, изменяются, это число увеличивается.
  • Файловый дескриптор командного канала . Программа обновления может использовать этот канал для отправки команд обратно в двоичный файл восстановления, в основном для изменений пользовательского интерфейса, таких как индикация хода выполнения для пользователя.
  • Имя файла .zip -файла пакета обновления .

Пакет обновления может использовать любой статически связанный двоичный файл в качестве двоичного файла обновления. Инструменты создания пакетов OTA используют программу обновления ( bootable/recovery/updater ), которая предоставляет простой язык сценариев, который может выполнять множество задач установки. Вы можете заменить любой другой бинарник, работающий на устройстве.

Дополнительные сведения о бинарном файле обновления, синтаксисе edify и встроенных функциях см. в разделе Внутри пакетов OTA .

Миграция с предыдущих выпусков

При переходе с версии Android 2.3/3.0/4.0 основным изменением является преобразование всех функциональных возможностей устройства из набора функций C с предопределенными именами в объекты C++. В следующей таблице перечислены старые функции и новые методы, которые служат примерно таким же целям:

С-функция метод С++
устройство_recovery_start() Устройство::RecoveryStart()
устройство_toggle_display()
device_reboot_now()
RecoveryUI::CheckKey()
(также RecoveryUI::IsKeyPressed())
device_handle_key() Устройство::HandleMenuKey()
device_perform_action() Устройство::InvokeMenuItem()
device_wipe_data() Устройство::WipeData()
device_ui_init() ScreenRecoveryUI::Init()

Преобразование старых функций в новые методы должно быть достаточно простым. Не забудьте добавить новую make_device() для создания и возврата экземпляра вашего нового подкласса Device.