Увімкнення підтримки для відновлення UBports

Історично з початком GSI-based ports кожен порт копіює ramdisk з recovery до власного репозиторію, зазвичай з уже перенесених пристроїв, що навряд чи є ідеальним. На щастя, тепер із уніфікованим recovery UBports існує лише одна версія відновлення, побудована на UBports CI, яку можна використовувати де заманеться :)

Перехід на єдину (уніфіковану) базу відновлення

В ідеалі це повинно бути отак просто:

deviceinfo_use_unified_recovery="true"
deviceinfo_unified_recovery_ui_density="xxhdpi"

і якщо потрібно, перенесіть свій fstab до ramdisk-recovery-overlay/system/etc/recovery.fstab. Більшість інших попередніх не-fstab файлів з ramdisk-recovery-overlay/ можна/слід відкинути доки не буде визначена їх необхідність (порівняйте незалежні від пристроїв файли з їх версіями у гілці уніфікованого recovery Halium 14). Наприклад, щодо фейкового підмонтування /cache та налаштування USB ConfigFS вже подбали, що також допомагає мінімізувати вміст ramdisk-recovery-overlay/init.recovery.*.rc та ін.

Примітка

У пристроях GKI v5.4/5.10 для уникнення потреби налаштування опції sys.usb.controller у /init.recovery.*.rc для роботи USB потрібно у ядрі вимкнути CONFIG_USB_DUMMY_HCD (як вже це зроблено для гілки загального ядра kernel-android-common), в інших місцях це повинно працювати автоматично під час завантаження відновлення.

Врешті, можливо Вам захочеться перевірити інформацію з описаних нижче підрозділів на збіги з Вашим портом. Оновлення для recovery ramdisk тепер виконуються автоматично з новими комітами або автоматичними збірками CI pipeline у відповідних для кожного пристрою репозиторіях подібно до збірок ядра.

Створення підтримки з нуля

Все описане вище залишається актуальним; основу ramdisk-recovery-overlay/system/etc/recovery.fstab потрібно створити з розпакованого стокового ramdisk (vendor/recovery). Файл повинен існувати у /data, інакше recovery не завантажиться. Щоб команда adb shell mount /data спрацювала, потрібно дещо адаптувати, напр. userdata перетворити з f2fs на ext4 (приклад userdata Q25).

Additionaly ensure partitions (even with emmc type) which would receive new images during OTA updates such as those under workdir/tmp/partitions/*.img have valid /mountpoints matching their /dev/block/by-name/ partitions (FP4 recovery example). Slotted A/B ones should exclude e.g. the _a / _b suffix and let slotselect fsmgr option pick the one for current slot automatically on boot (Q25 vendor_boot/dtbo example). In the end verify the generated /etc/fstab entries point to valid block devices.

Qualcomm SoC devices typically also want at least the fs bootdevice symlink bits from original ramdisk around at ramdisk-recovery-overlay/init.recovery.${ro.hardware}.rc for the fstab entries to be correct without further changes.

Функції, які повинні працювати

  1. Відтворення на екрані

  2. USB-доступ через ABD, напр. для інсталятора UBports

  3. Ононвлення Ubuntu Touch через OTA, див. тестування локального OTA

  4. Скидання на заводські налаштування

  5. Перезавантаження в особливі режими (напр. adb reboot bootloader)

  6. FastbootD на пристроях з розділом super

  7. Сенсорний екран (опційно)

  8. Звіт про відсоток акумулятора (опційно)

  9. Автоматичне зменшення яскравості екрана за таймаутом (опційно)

Деякі приклади портування

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

Додаткові налаштування

Інші необхідні властивості слід додати до ramdisk-recovery-overlay/prop.halium, напр. для планшетів може бути цікавим горизонтальний UI:

ro.minui.default_rotation=ROTATION_RIGHT
ro.minui.default_touch_rotation=ROTATION_RIGHT

Інші різні опції, які можуть бути цікавими:

  • ro.fastbootd.available=true для використання навіть на старих пристроях з менш зручним способом прошивки

  • напр. ro.recovery.ui.margin_height=24 додасть поле для верхнього логотипу на пристроях з вирізом

  • ro.recovery.batteryless=true для приховування відсотку акумулятора якщо з ним проблема

  • ro.minui.use_qti_drm=true для використання зміненого бекенду DRM (modified-for-QTI, Qualcomm) навіть без ro.hardware=qcom, або його вимкнення у разі проблем

  • або навіть ro.boot.quiescent=true для вимкнення генерації інтерфейсу recovery на раній стадії запуску

Умовні або інші додаткові налаштування стосуються ramdisk-recovery-overlay/init.recovery.${ro.hardware}.rc.

Збільшення кореневої файлової системи

Для пристроїв з розділом super, але з дуже малим оригінальним розділом system_a під час початкового завантаження з інсталятором UBports, можна змінити розмір під зростаючі потреби (напр., для 24.04-2.x з його Qt6 та Qt5), у самому контейнері надається достатньо вільного місця:

ro.systemimage.system_partition_size=4500

Тестування локального OTA

Коли завантажується UBports recovery та з’являється з’єднання USB (ADB) можна спробувати в основному каталозі Вашої компіляції ядра наступне:

mkdir -p ramdisk-recovery-overlay/system/bin
wget https://github.com/ubports/halium_bootable_recovery/raw/refs/heads/halium-14.0/ubports/system-image-upgrader -O ramdisk-recovery-overlay/system/bin/system-image-upgrader
chmod +x ramdisk-recovery-overlay/system/bin/system-image-upgrader
sed -i '/verify_signature()/a\    return 0' ramdisk-recovery-overlay/system/bin/system-image-upgrader

./build.sh
adb reboot bootloader; (cd workdir/tmp/partitions && for i in *.img; do fastboot flash ${i%.img} $i; done) && fastboot reboot recovery
sudo ./build/prepare-fake-ota.sh out/device_$(awk -F'"' '/^deviceinfo_codename=/ {print $2}' deviceinfo)_usrmerge.tar.xz ota
adb push ota/{*.tar.xz*,ubuntu_command} /cache/recovery && adb reboot recovery
adb wait-for-recovery && sleep 1 && adb shell tail -f /cache/ubuntu_updater.log

Коли помилки будуть виправлені ти припускаючи, що файли OTA не винуваті, процес можна перезапустити без додаткових пушів через adb shell 'mv /cache/recovery/ubuntu_command{.applying,}; setprop ctl.restart recovery'. Коли все вдасться не забудьте про rm ramdisk-recovery-overlay/system/bin/system-image-upgrader ;)