2016年7月10日 星期日

Ubuntu Phone - recovery

想要 hack 手機最快速的方式應該是從 recovery 下手,目前 Ubuntu phone 都有在官網上 release adb shell enabled 的 recovery image [1],可以用 fastboot 輕易燒入。

進入 recovery 後,可以借由 ubuntu-device-flash update 的動作了解其如何將 image 更新進去,了解之後要修改 image 內容就容易多了。

本文將簡介其運作,如想深入了解請自行 adb shell 進去 recovery 研究看看。

目前 phablet 6.x common tree 已將部份 recovery 需要的修改收錄進去,從 diff 可以看到有一個 system-image-upgrader 負責 OTA update 的動作,大致上整個 process 為:

 * u-d-f 將 ubuntu tarball, device tarball, custom tarball 從 system-image.ubuntu.com 上拉下來放到 device 裡 /cache/recovery 中並建立 ubuntu_command 檔。
 * system-image-upgrader 讀取 ubuntu_command 裡命令將 tarball 解開並將 放到 /system partition 裡。

如此一來,也可以在其他的 Android phone 上運用相同的方式,將 ubuntu tarball, custom tarball 塞進 /system 或是學 Nexus 4 將 system partition 用 loop mount 的方式放到 ubuntu.img。

接下來就只要煩腦 device tarball 就好了。 device tarball 裡包括了 kernel 及 Android 所需的各 partition 的 image 及一個減肥過的 android 放在 /var/lib/lxc/android/system.img (refer to [2])

Android code tree 的 Ubuntu phone patch 可以在 phablet 6.x common tree [3] 找到,另外 phablet_6.0.0_r1 是一個 fake device 用來假裝一個 Android 6.x device,這樣其他 Android 6.x device code tree 如果其 Merge base 是 AOSP 6.0.0_r1 就可以直接 merge 它取得 Ubuntu 為 Android 6.x 所作的修改。

這樣一來應該就可以 build 出 system.img 了,但是不是可以開機,還要看其廠商給的 Android code tree (BSP AOSP code tree) 是不是改了原本 AOSP 的 HAL,甚致有可能需要改到 hybris[4] 來迎合廠商的修改。

好像寫超過 recovery 的範圍了,反正 recovery 就只用來 OTA update,基本上只要recovery 的動作正常,就算其他 partition 都是空的,也可以透過 recovery 將其全都填上需要的內容。

另外官方的 ubuntu-device-flash 目前只支持三個 tarball 同时更新,但在開發階段可能只需要更新 custom tarball 或是 device tarball,覺得每次都要刷三個 tarball 有點浪費時間的話,可以手動修改 ubuntu_command 或是使用 這個小 tool [5] 去 update 單一個 tarball.

題外話:
如果想要刷回 Android edition ,通常先刷 Android 的 recovery ,再用其 recovery update 就可以了,但要小心的部份是 Android 的更新包中有時後會有 bootloader或preloader 的更新,最好把它拿掉,因為會導致 Ubuntu repartition 的設定不見。 說白了,就是把 system 及 boot partition 換掉,就可以回到 Android 了 (其他 partition 都共用)。

[1] https://wiki.ubuntu.com/Touch/Devices
[2] https://developer.ubuntu.com/en/phone/devices/porting-new-device/
[3] https://code-review.phablet.ubuntu.com/#/admin/projects/aosp/platform/manifest
[4] https://launchpad.net/~libhybris-maintainers/libhybris/+git/libhybris
[5] https://github.com/alex-tu-cc/ubuntu_phone_tools/blob/master/update_tarball.sh

Other refs:
https://wiki.ubuntu.com/Touch/MaintainingCodePhablet