Как разделы A/B и плавные обновления влияют на пользовательскую разработку на XDA

Возможно, вы уже слышали о бесшовных обновлениях. Это включает в себя так называемое «разделы A/B». Что это такое и как это влияет на кастомную разработку на XDA?

Когда вышел Android Nougat, мы заговорили о всевозможные новые функции. Для начала мы получили обновленный пользовательский интерфейс, а также долгожданные возможности многооконного режима и поддержку Vulkan Graphics API. Но одно скрытое дополнение пролетело над головами большинства пользователей. Android Nougat представила «бесшовные обновления» на устройствах, поддерживающих разделы A/B. Подавляющее большинство существующих устройств Android (за исключением новых Google Pixel и Google Pixel XL) в то время не имели разделов A/B и поэтому не могли воспользоваться преимуществами плавных обновлений. Основная предпосылка этой функции заключается в том, что устройство имеет второй набор системного, загрузочного, вендорского и других важных разделов, и когда вы получаете OTA обновить обновление происходит в фоновом режиме, пока обновляется второй набор разделов, что позволяет беспрепятственно перезагрузиться в обновленную сборку программного обеспечения. Если обновление завершится неудачей, вы вернетесь к работающей сборке, а это означает, что у компаний будет меньше головной боли, а потребители будут лучше защищены.

Поддержка плавных обновлений не является обязательным требованием для любого нового устройства Android, в отличие от Project Treble. Таким образом, подавляющее большинство новых устройств Android не поддерживают эту функцию. На данный момент мы ведем список всех поддерживаемых устройств., и очевидно, что эта функция не получила широкой поддержки. Это позор, потому что разделы A/B приносят много преимуществ как обычным, так и опытным пользователям. Тем не менее, эта функция имеет плохую репутацию в сообществе энтузиастов, поскольку считается, что она усложняет разработку Android и установку пользовательских модификаций. На самом деле это не так, поэтому мы хотели развеять миф о плавных обновлениях и объяснить, как разделы A/B влияют на пользовательскую разработку на XDA.

Большое спасибо старшему члену XDA. Нпджонсон, а участник LineageOS и сопровождающий Motorola Moto Z2 Force, который помог нам проверить эту статью.


Разделы на устройстве Android

Раздел — это просто отдельный раздел во внутренней памяти телефона, где хранятся данные. Какие данные хранятся в каждом разделе, зависит от оборудования, операционной системы и многих других факторов. У загрузчика будет один, у системы (ОС Android) — один, у пользовательских данных — один… И так далее. Когда вы видите, что люди говорят о «/system» и «/cache», они имеют в виду имена этих разделов. Например, OnePlus 6 имеет 72 раздела. Звучит много, но OnePlus 6 — одно из устройств, поддерживающих плавные обновления, а это означает, что многие из этих разделов просто дублируют друг друга.

Частичный вывод разделов на OnePlus 6. Некоторые разделы A/B подчеркнуты в демонстрационных целях.

На устройстве имеется множество разделов, о которых вам как пользователю никогда не придется беспокоиться. Многие из этих разделов никогда не изменяются при прошивке пользовательских ПЗУ, ядер, восстановления или модификаций, таких как Magisk или Xpose. Многие из этих разделов либо не будут использоваться для наших целей, либо к ним будет слишком опасно прикасаться, если вы не знаете, что делаете (XLOADER и OEMINFO на Huawei/Honor устройства приходят на ум.) Для подавляющего большинства пользователей Android мы в основном имеем дело с разделами системы, загрузки, восстановления, пользовательских данных и, в последнее время, разделов поставщиков и вбмета. Вот краткое объяснение назначения каждого раздела:

  • система — содержит ОС Android, системные библиотеки, системные приложения и другие системные носители, такие как загрузочная анимация, стандартные обои, мелодии звонка и т. д.
  • загрузка — содержит ядро, виртуальный диск, а на устройствах A/B также и восстановление.
  • восстановление — содержит восстановление, при этом TWRP чаще всего прошивается на устройствах только A (устройства A/B не имеют специального раздела восстановления)
  • пользовательские данные — хранят все данные вашего приложения, системы и внутренней памяти.
  • поставщик — содержит HAL для конкретной платформы и устройства, файлы, необходимые для взаимодействия ОС Android с базовым оборудованием.
  • vbmeta — раздел для Android Verified Boot 2.0, который проверяет целостность процесса загрузки.

Производители устройств могут изменить схемы разделов, чтобы использовать любой макет, который они хотят. Например, Huawei разделяет загрузочный раздел на ramdisk_recovery и ядро. Существует также множество дополнительных разделов, которые могут содержать другие системные приложения, такие как cust, Product и OEM. их безопасно модифицировать, обычно это не рекомендуется, если вы хотите облегчить себе возврат к исходному состоянию. Так какую же роль играют разделы A/B?


Схема раздела A/B

Как работают обновления на устройствах с плавным обновлением

Очень простое изображение, которое я сделал ниже, иллюстрирует, как обновление обрабатывается на устройстве с поддержкой разделов A/B. Показанный на рисунке раздел является системным, хотя другие разделы, такие как загрузочный и вендорный, также могут быть обновлены с помощью любого OTA-обновления от OEM-производителя. Этот процесс обновления происходит не только с основными обновлениями версий Android, но и с обновлениями исправлений безопасности.

  1. Начнем с двух системных разделов: system_a и system_b, оба в одной версии Android.
  2. Предполагая, что system_a активен, OTA-обновление исправит system_b, неактивный раздел, в фоновом режиме.
  3. system_a устанавливается в неактивное состояние, а system_b становится активным после перезагрузки пользователя.
  4. Сейчас неактивный раздел system_a будет обновлен при выходе следующего OTA-обновления.

Каковы преимущества этого процесса обновления?

  1. Если обновление не удалось, устройство вернется к рабочей сборке в другом слоте.
  2. Ваши данные сохраняются в целости и сохранности, даже если обновление прервется, поскольку ваши данные хранятся только в одном разделе (пользовательские данные).
  3. Потоковая передача обновлений: если раздел данных заполнен, обновление можно загрузить и передать в неактивный слот. Это довольно удобная функция, которая означает, что вам не придется тратить временное хранилище на обновления. Вот почему на устройствах A/B нет раздела кеша, поскольку они больше не нужны.

Какое влияние схема разделения A/B оказывает на хранилище устройства?

Означает ли тот факт, что плавные обновления приводят к множеству дублированных разделов, что вы теряете много места для хранения? Нисколько. Google утверждает, что устройства с поддержкой плавного обновления должны терять память всего на несколько сотен мегабайт благодаря удалению разделов /cache и /recovery. Удаление обоих балансирует затраты на добавление второго набора разделов. По данным Google, системный образ Pixel A/B вдвое меньше системного образа только A. Большая часть дополнительного использования хранилища фактически приходится на добавление второго раздела поставщика. Это имеет смысл, поскольку раздел поставщика содержит все проприетарные двоичные файлы, используемые OEM-производителями (часть Project Treble), поэтому ожидается, что он займет довольно много места. Хотя Google не рекомендует использовать разделение A/B на устройствах с 4 ГБ памяти (поскольку это почти 10% от общего доступного хранилища), они рекомендуют его на устройствах с 8 ГБ и выше.

Вот разбивка объема памяти, используемого на Google Pixel с разделами A/B и без них.

Размеры разделов

А/Б

только А

загрузчик

50 МБ*2

50 МБ

Ботинок

32 МБ*2

32 МБ

Восстановление

32 МБ

Кэш

100 МБ

Радио

70 МБ*2

70 МБ

Продавец

300 МБ*2

300 МБ

Система

2048 МБ*2

4096 МБ

Общий

5000 МБ

4680 МБ

Что случилось с разделом восстановления?

Базовое ядро ​​Linux на устройствах Android позволяет Android распознавать и правильно использовать оборудование на смартфоне. На устройствах Android только A обычно имеется две версии ядра: одна упакована в раздел восстановления, а другая — в загрузочный раздел. На устройствах A/B, поддерживающих плавные обновления, восстановление теперь находится внутри загрузочного образа вместе с ядром. Основная функция рекавери была установка обновлений, но так как этим занимается сама система(update_engine), пока Android загружается, специальный раздел восстановления больше не нужен.

Таким образом, чтобы установить кастомное рекавери на устройства A/B, нам необходимо изменить загрузочный раздел и заменить стандартное рекавери на наше собственное. Вот почему для установки TWRP вам необходимо сначала использовать команду fastboot для загрузки пользовательского загрузочного образа, а затем затем прошейте скрипт установки TWRP, так как fastboot не может исправлять разделы, а только прошивать их целиком. Технически вы можете предварительно исправить существующий загрузочный образ с помощью TWRP, а затем прошить его через fastboot, но это больше проблем, чем пользы. Скрипт установщика TWRP исправляет разделы boot_a и boot_b для установки TWRP.

Интересный факт: механизм обновления Android, который обеспечивает плавные обновления, по сути, взят прямо из Chrome OS. Только недавно были строки, содержащие «Chrome OS», удаленные из журнала update_engine, чтобы избежать путаницы для тех, кто проверяет logcat.

Поддерживает ли мой смартфон Android разделы A/B для беспрепятственного обновления?

В то время как мы вести список всех устройств которые поддерживают это, ты также можешь легко проверить себя.


Как плавные обновления влияют на разработку собственных приложений?

Восприятие пользователем разделов A/B

Беспрепятственные обновления, которые многие пользователи считают помехой для разработки специального программного обеспечения, на самом деле являются благом для разработчиков. Причина, по которой считается, что устройства A/B имеют плохую поддержку разработки, кроется в цене первых устройств A/B. В конце концов, устройства Google Pixel были одними из первых, кто поддерживал плавные обновления, и по сравнению со смартфонами Nexus прошлых лет они были относительно дорогими. Кроме того, благодаря множеству улучшений, которые Google внес в ОС Android, создав специальные ПЗУ и модификации менее популярны на устройствах Google, смартфоны Google Pixel не так популярны на наших форумах, как Nexus смартфоны. Сочетание внешних факторов привело к уменьшению количества индивидуальных разработок для смартфонов Google Pixel, хотя большинство пользователей предпочли вместо этого обвинить поддержку разделов A/B. Сравните доступность индивидуальной разработки для таких устройств, как Google Pixel, и таких устройств, как Xiaomi Mi A1. на наших форумах.

Кроме того, отсутствие понимания того, как разделы A/B изменили способ, которым пользователям необходимо устанавливать собственные ПЗУ, ядра, средства восстановления и модификации, привело к тому, что поддержка разделов A/B стала непопулярной. Поскольку восстановление теперь находится внутри загрузочного образа, прошивка модификаций в неправильном порядке, таких как Magisk или Xposed, может вызвать конфликты и привести к загрузочному циклу. Может быть важно, в каком порядке вы прошиваете эти моды, хотя в случае пользовательских ПЗУ вам не нужно беспокоиться о том, в какой слот вы прошиваете. Вопреки распространенному мнению, сценарий установки для большинства кастомных ПЗУ не прошивается в оба слота. В основном вам не нужно об этом беспокоиться, поскольку вам не нужно менять местами слоты вручную.

Как разработчики рассматривают разделы A/B

При сборке ПЗУ разработчики могут использовать оба раздела для тестирования отдельных сборок. Если один из них не работает, они могут просто вернуться к рабочему разделу и пересобрать свое ПЗУ. Разработчики также могут проверить наличие регрессий, просто установив обновление, переключив активный раздел и сравнив их без необходимости стирать данные. Вот как команда LineageOS рассматривает поддержку разделов A/B:

«Многие в сообществе Android раскритиковали A/B как «сложную поддержку» и «неудобную для разработчиков», хотя на самом деле при правильной реализации это легче поддерживать и такой же дружелюбный к разработчикам», — jrizzoli, Журнал изменений LineageOS 19

Первоначальная трудность с поддержкой A/B для разработчиков возникла из-за модификации существующих инструментов для поддержки этих устройств. Разработчик Magisk topjohnwu добавил официальную поддержку Google Pixel через год после его выхода. выпущен — не потому, что это было сложно, а скорее потому, что ему потребовался год, чтобы получить устройство для работа над. Поддержка ТВРП пришло довольно быстро на устройствах A/B после того, как ведущий разработчик Dees_Troy попробовал это сделать. LineageOS 15.1 теперь поддерживает Устройства A/B после того, как волонтеры нашли время исправить свой скрипт addon.d.

Как обновить устройство A/B с пользовательским рекавери, ядром или другими модами

Пользовательские ПЗУ

Установка обновлений на устройстве с пользовательским ПЗУ означает, что вам придется также опасаться, какой слот вы прошиваете, верно? Не совсем. TWRP на самом деле сделает многое за вас и по умолчанию использует неактивный слот для прошивки пользовательского ПЗУ. Если у вас активный слот A и вы прошиваете собственное ПЗУ, на самом деле вы прошиваете слот B. После перезагрузки активным слотом станет B. Разработчики могут изменить сценарий установки и прошить его в оба слота, чтобы облегчить работу конечному пользователю, хотя большинство сценариев установки специального ПЗУ в настоящее время прошиваются только в один слот. Наконец, пользовательские ПЗУ могут реализовать в своем ПЗУ средство обновления A/B, так что пользователям даже не придется возиться с ним. прошивка обновлений вручную — последняя версия LineageOS 15.1 включает в себя инструмент Lineage Updater и старшего члена XDA. США-RedDragon сделал универсальное средство обновления A/B которые могут использовать другие разработчики.

Стандартные ПЗУ

Но разве это не проблема, если на вашем устройстве установлена ​​стандартная прошивка с различными модификациями, и вы хотите установить обновление, не потеряв при этом все эти моды? Это может быть, если вы не знаете, как правильно установить обновление. Например, на OnePlus 6 вы не можете прошить инкрементный OTA на модифицированное устройство, поскольку инкрементальный OTA попытается исправить ваш модифицированный загрузочный образ. Таким образом, вы, скорее всего, получите загрузочную петлю, и именно поэтому вам придется прошить полное обновление ПЗУ, чтобы полностью перезаписать измененный загрузочный образ. Вот общие шаги, которые необходимо предпринять для установки обновления OxygenOS на OnePlus 6, сохранив при этом TWRP, Magisk и, при необходимости, собственное ядро.

  1. Скачал последнюю версию полное ПЗУ молния
  2. Прошить полный zip ROM в рекавери
  3. (Необязательно) Прошить собственное ядро
  4. Прошить TWRP-установщик
  5. Перезагрузитесь прямо в рекавери.
  6. Флэш Магиск

На устройствах Google Pixel вы можете прошить заводской образ без стирания данных, затем загрузите TWRP, установите TWRP с помощью сценария установки, затем установите Magisk.

Извлечение обновления для прошивки отдельных образов разделов

Файлы обновлений для многих устройств A/B немного отличаются от файлов обновлений только для устройств A. Они больше не представляют собой просто zip-файл, содержащий множество изображений (за исключением заводских изображений Google и Razer), а представляют собой файл payload.bin. Вы можете извлечь этот файл и прошить каждую часть вручную, но для этого потребуется специальный инструмент. Если вы хотите узнать, как это сделать на OnePlus 6, Xiaomi Mi A1 и многих других устройствах A/B, читайте дальше.

Настройка для извлечения payload.bin

  1. Убедитесь, что у вас установлен Python 3.6. установлен.
  2. Загрузите payload_dumper.py и update_metadata_pb2.py. здесь.
  3. Распакуйте OTA-zip-архив и поместите payload.bin в ту же папку, что и эти файлы.
  4. Откройте PowerShell, командную строку или терминал в зависимости от вашей ОС.
  5. Введите следующую команду: python -m pip install protobuf
  6. Когда все будет готово, введите эту команду: python payload_dumper.py payload.bin
  7. Начнется извлечение изображений из файла payload.bin в текущую папку, в которой вы находитесь.

Если хотите, вы можете прошить каждое из этих изображений отдельно через fastboot. В следующем разделе показано, как это сделать.

Использование fastboot для прошивки изображений на устройстве, поддерживающем плавные обновления

Существует ряд команд, эксклюзивных для устройств системы разделов A/B. Вы можете изменить активный слот и перейти к определенным слотам. Если у вас есть проект Treble-совместимое устройство и хочу научиться Общие образы системы flash, вы должны быть знакомы с этими командами. Взгляните на таблицу ниже.

Команды быстрой загрузки

Команда

Получить текущий активный слот

fastboot getvar все | grep «current-slot». Если вы используете ПК с Windows, команда «grep» не будет работать.

Сделать другой слот активным

fastboot set_active другое

Сделать указанный слот активным

fastboot set_active $ORfastboot --set-active=_$slotгде $ — это либо a, либо b

Записать образ в указанный раздел в текущем слоте

раздел быстрой загрузки flash.img

Записать образ в указанный раздел в указанном слоте

fastboot flash раздел_a раздел.imgfastboot flash раздел_b раздел.img

(Примечание. На устройствах A/B вы можете либо указать раздел в определенном слоте для прошивки, либо оставить суффикс слота, и он будет мигать в текущий активный слот. Например, вы можете заменить «раздел» в команде flash на «system», «system_a» или «system_b».)

На ПК с Windows вы не можете использовать grep, поэтому просто удалите эту часть и найдите «текущий-слот».

Несколько слов о проекте Treble и плавных обновлениях

Распространенным заблуждением является то, что поддержка Project Treble и поддержка разделов A/B связаны друг с другом, но на самом деле это не так. Наличие одного не подразумевает другого. Motorola Moto Z2 Force использует схему разделения A/B, но не поддерживает Treble. С другой стороны, Honor 9 Lite поддерживает Project Treble, но является устройством только класса A.

Honor 9 Lite поддерживает Project Treble, но не поддерживает плавные обновления.

Часто задаваемые вопросы/сводка

  • Каковы преимущества разделения A/B?
    • Разделение A/B позволяет обновлять смартфон Android прямо во время его использования, просто перезагружаясь, когда вы будете готовы загрузить новую версию. Он также действует как защита от кирпичей — если обновление пойдет не так, вы вернетесь к рабочей установке.
  • Мешает ли разбиение A/B разработке?
    • Хотя разработчикам потребовалось некоторое время, чтобы адаптироваться, ответ практически отрицательный. Фактически, это может помочь разработчикам, поскольку они могут выполнить двойную загрузку своего пользовательского ПЗУ со старой версией и новой тестовой версией для проверки на наличие регрессов.
  • Как разделы A/B влияют на такие моды, как пользовательские ядра, Magisk или Xposed?
    • Вы должны быть осторожны при их установке, но на данный момент проблем нет. Magisk официально поддерживает устройства с плавным обновлением, и если вы прошиваете все в правильном порядке, у вас не должно возникнуть проблем. Обязательно прошивайте собственное ядро ​​перед прошивкой других модов, и все будет в порядке.
  • Могу ли я прошить два разных ПЗУ на каждый раздел и выполнить двойную загрузку?
    • Теоретически да. Однако проблемы возникают из-за общего раздела данных, поэтому это не рекомендуется.
  • Означает ли наличие схемы разделов A/B, что у меня меньше места для хранения?
    • Неа! Google утверждает, что устройства, поддерживающие плавные обновления, жертвуют всего несколькими сотнями мегабайт памяти для его поддержки. Выгоды перевешивают эти затраты.
  • Мое устройство поддерживает разделы A/B. Означает ли это, что я могу использовать общий образ системы Project Treble?
    • Не обязательно. Поддержка Project Treble и A/B не связаны между собой. Motorola Moto Z2 Force не поддерживает Project Treble, но поддерживает схему разделов A/B.
  • Мое устройство поддерживает Project Treble. Означает ли это, что у меня есть схема разделов A/B?
    • Это не всегда так. Honor 9 Lite является ярким примером, поскольку он поддерживает Project Treble, но не имеет схемы разделов A/B.
  • Почему мне нужно сначала загрузить TWRP с помощью fastboot, а затем прошить его?
    • Это связано с тем, как работает fastboot, и с тем, что раздела восстановления больше не существует. Восстановление находится внутри загрузочного раздела, поэтому нам нужно изменить как boot_a, так и boot_b. Пропатчить раздел в фастбуте нельзя, только прошить его. Теоретически вы могли бы создать предварительно исправленный загрузочный образ, а затем прошить его.
  • Есть ли какие-либо опасности при использовании разделов A/B? Как защита от отката влияет на ситуацию?
    • Google изо всех сил старался, чтобы это не было проблемой, но в случае с Motorola Moto Z2 Force, были известны случаи, когда устройство повторно активировало старый слот после обновления до Android. Орео. Это означало, что сработала защита от отката, и владельцы устройств могли спасти свой смартфон только с помощью EDL-восстановления. Google утверждает, что защита от отката срабатывает только после первой загрузки, поэтому слот должен полностью функционировать после обновления, прежде чем вы больше не сможете перейти на более раннюю версию.