Як A/B-розділи та безперервні оновлення впливають на користувальницьку розробку на XDA

Можливо, ви раніше чули про безперебійне оновлення. Це стосується так званого «розділу A/B». Що це таке і як це впливає на користувальницьку розробку на XDA?

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

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

Велике спасибі XDA Senior Member npjohnson, а вкладник до LineageOS і супроводжувач в Motorola Moto Z2 Force, який допоміг нам перевірити цю статтю.


Розділи на пристрої Android

Розділ — це просто окремий розділ у внутрішній пам’яті телефону, де зберігаються дані. Які дані зберігаються на кожному розділі, залежить від апаратного забезпечення, операційної системи та багатьох інших факторів. У завантажувача буде один, у системи (ОС Android) буде один, у даних користувача буде один... і так далі і так далі. Коли ви бачите, що люди говорять про «/system» і «/cache», вони мають на увазі назви цих розділів. OnePlus 6, наприклад, має 72 перегородки. Це звучить як багато, але OnePlus 6 є одним із пристроїв, який підтримує безперебійне оновлення, що означає, що багато з цих розділів є просто дублікатами один одного.

Частковий вихід розділів на OnePlus 6. Деякі розділи A/B підкреслені з метою демонстрації.

На пристрої є багато розділів, про які вам як користувачеві ніколи не доведеться турбуватися. Багато з цих розділів ніколи не змінюються під час прошивки користувальницьких ПЗУ, ядер, відновлення або модифікацій, таких як Magisk або Xposed. Багато з цих розділів або не використовуватимуться для наших цілей, або до них небезпечно торкатися, якщо ви не знаєте, що робите (XLOADER і OEMINFO на Huawei/Honor Пристрої спадають на думку.) Для переважної більшості користувачів Android розділи, з якими ми здебільшого маємо справу, це система, завантаження, відновлення, дані користувача та останнім часом постачальник і vbmeta. Ось коротке пояснення призначення кожного розділу:

  • система – містить ОС Android, системні бібліотеки, системні програми та інші системні носії, як-от завантажувальні анімації, фонові малюнки, мелодії тощо.
  • boot - містить ядро, ramdisk, а на пристроях 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, образ системи A/B Pixel вдвічі менший за розмір системи A/B. Більша частина додаткового використання пам’яті фактично походить від додавання другого розділу постачальника. Це має сенс, оскільки розділ постачальника містить усі власні двійкові файли, які використовуються OEM-виробниками (частина Project Treble), тому очікується, що він займе досить багато місця. Хоча Google не рекомендує використовувати A/B-розбиття на пристроях із 4 ГБ пам’яті (оскільки це майже 10% від загальної доступної пам’яті), вони рекомендують його на пристроях із 8 ГБ і більше.

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

Розміри перегородок

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, а потім перепрошити його через швидке завантаження, але це більше проблем, ніж воно того варте. Сценарій інсталятора TWRP виправляє розділи boot_a і boot_b для встановлення TWRP.

Цікавий факт: Android update_engine, який обробляє безперебійні оновлення, в основному витягується прямо з ОС Chrome. Лише недавно були видалені рядки, що містять «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 через рік після того, як це було не тому, що це було складно, а тому, що йому знадобився рік, щоб отримати пристрій почати працювати. Підтримка TWRP прийшов досить швидко на пристроях A/B після того, як провідний розробник, Dees_Troy, зламав його. LineageOS 15.1 зараз підтримує Пристрої A/B після того, як волонтери знайшли час виправити їхній скрипт addon.d.

Як оновити пристрій A/B, який має спеціальне відновлення, ядро ​​чи інші модифікації

Спеціальні ПЗУ

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

Стокові ПЗУ

Але чи не проблематично, якщо на вашому пристрої встановлено стандартне ПЗУ з різними модифікаціями, і ви хочете встановити оновлення, не втрачаючи всіх цих модів? Це може бути, якщо ви не знаєте правильних кроків для встановлення оновлення. На OnePlus 6, наприклад, ви не можете прошити інкрементний OTA на модифікованому пристрої, оскільки інкрементний OTA намагатиметься виправити ваш модифікований образ завантаження. Таким чином, ви, швидше за все, отримаєте цикл завантаження, і тому вам доведеться прошити повне оновлення ПЗУ, щоб повністю перезаписати ваш змінений образ завантаження. Ось загальні кроки, які потрібно виконати, щоб інсталювати оновлення OxygenOS на OnePlus 6, зберігаючи TWRP, Magisk і, за бажанням, спеціальне ядро.

  1. Завантажив останню повний ROM zip
  2. Завантажте повну ROM zip під час відновлення
  3. (Необов'язково) Спеціальне ядро ​​Flash
  4. Флеш інсталятор TWRP
  5. Перезавантажтеся відразу до відновлення
  6. Flash Magisk

На пристроях 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 та помістіть файл payload.bin у ту ж папку, що й ці файли.
  4. Відкрийте PowerShell, командний рядок або термінал залежно від вашої ОС.
  5. Введіть таку команду: python -m pip install protobuf
  6. Коли це буде завершено, введіть цю команду: python payload_dumper.py payload.bin
  7. Це почне витягувати зображення з файлу payload.bin до поточної папки, у якій ви перебуваєте.

За бажанням ви можете прошити кожне з цих зображень окремо через швидке завантаження. У наступному розділі показано, як це зробити.

Використання швидкого завантаження для прошивки зображень на пристрої, який підтримує безперебійне оновлення

Є ряд команд, які є ексклюзивними для пристроїв системи розділення A/B. Ви можете змінити свій активний слот і флеш на певні слоти. Якщо у вас є Project Treble-сумісний пристрій і хочу навчитися flash Загальні образи системи, ви повинні бути знайомі з цими командами. Подивіться на таблицю нижче.

Команди швидкого завантаження

Команда

Отримати поточний активний слот

fastboot getvar all | grep "current-slot"Якщо ви користуєтеся ПК з Windows, команда "grep" не працюватиме.

Встановити інший слот як активний

fastboot set_active інше

Встановити вказаний слот як активний

fastboot set_active $АБОfastboot --set-active=_$слот, де $ є a або b

Завантажте образ у вказаний розділ у поточному слоті

флеш-розділ швидкого завантаження partition.img

Завантажте образ у вказаний розділ у вказаний слот

fastboot flash partition_a partition.imgfastboot flash partition_b partition.img

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

На ПК з Windows ви не можете використовувати grep, тому просто видаліть цю частину та знайдіть «current-slot».

Слово про проект 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, а потім прошити?
    • Це пов’язано з тим, як працює швидке завантаження, і з тим, що розділ відновлення більше не існує. Відновлення розміщується всередині завантажувального розділу, тому нам потрібно змінити як boot_a, так і boot_b. Ви не можете виправити розділ у швидкому завантаженні, лише перепрошити його. Теоретично ви можете створити попередньо виправлений завантажувальний образ, а потім прошити його.
  • Чи є якісь небезпеки з перегородками A/B? Як захист від відкату впливає на речі?
    • Google доклав усіх зусиль, щоб це не було проблемою, але у випадку з Motorola Moto Z2 Force, були відомі випадки, коли пристрій повторно активував старий слот після оновлення до Android Орео. Це означало, що спрацював захист від відкату, і власники пристроїв могли врятувати свій смартфон лише за допомогою відновлення EDL. Google каже, що захист від відкату спрацьовує лише після першого завантаження, тому слот має повністю функціонувати після оновлення, перш ніж ви більше не зможете повернутися до попередньої версії.