Обновления системы, отличной от 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 ++. В следующей таблице перечислены старые функции и новые методы, которые служат примерно эквивалентной цели:

Функция C C ++ метод
device_recovery_start () Устройство :: RecoveryStart ()
device_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.