目前 Firefox OS (以下簡稱專案名B2G) 已經支持的設備包括:
- Samsung Galaxy S2 I-9100 (以及兩款 SGS2 variants:I-9100G,Skyrocket)
- Nexus S
- Maguro/Akami
- Emulator
除此之外,還有好幾款設備正在進行 porting 中。
很多人想知道,要如何在 B2G 支持一個新的設備呢?本文將 B2G porting 流程做一個概略的介紹。
前言:
B2G 的架構 [1] 包括 Gaia,Gecko,和 Gonk。要將 B2G 移植到一個新的設備,主要的工作在 Gonk.
將 B2G port 到新的設備,要產生下面兩個 image:
- Kernel image
- System image
Kernel image 包括 Linux kernel 和 ramfs。通常 Linux kernel 不太需要修改,但是我們需要修改 init.rc,移除一些不需要執行的 Android process (ex: zygote 等),並新增 B2G 相關 process,所以還是得 flash kernel image。System image 包括了 AOSP,以及部份需要從設備中 extract 出來的 binary blobs。
針對市面上某一款設備的 porting,可以先去 XDA forum [2] 找尋此款設備的相關討論。如果已經有人做出這款設備包括 ClockWorkMod recovery 的 initramfs,甚至在裡面也加入了 busybox 的支持,那麼延用這部份的成果,會讓整個 porting 的過程更方便。例如,目前在 Samsung Galaxy S2 上就是這樣做的。每款設備使用的 flash 方式也不相同,大部份用的是 fastboot,而在 Samsung 設備上使用 heimdall 或是 odin。另外,如果是市面上比較普遍的機種,可以到 CyanogenMod [3] 網站參考相關的資源,加快 porting 的速度。
另 外要提的一點,隨著 B2G 的演進,從早期 B2G 使用的 AOSP 是 GingerBread,到現在以 ICS 主。而 B2G build system 也在最近逐漸從舊系統 [4] 轉換到新系統 [5]。在這樣的情況下,雖然 porting 的原理上相同,但是實際修改到的系統目錄會不太一樣,而且對於不同設備所使用的方式也各有差別。由於目前舊系統對於 GB/ICS 的支持已經很成熟,本次先介紹基於舊系統的 porting 方式。
Porting 相關的系統目錄:
- B2G/Makefile (Top level Makefile)
- B2G/boot (Kernel and/or initramfs)
- B2G/glue/gonk/device// (device configuration tree for GingerBread)
- B2G/glue/gonk-ics/device// (device configuration tree for ICS)
Porting 的概略流程:
- 先備份原廠的 firmware
- 在 B2G Makefile 中支持新設備,新增包括 build kernel,config device,flash 相關的 script
- 取得新設備的 kernel source,放在 B2G/boot
- 新增 device configuration,並加入至少以下檔案: AndroidKernel.mk
- AndroidBoard.mk
- AndroidProducts.mk
- BoardConfig.mk
- extract-files.sh
- full_.mk
- idc files for touch screen
- 修改 init.rc for B2G
- Config/build/flash image 到新的設備並測試
關於 init.rc:
前面提到,要在這個檔案中移除不需要的 process 並加入 B2G 相關 process,實際的內容可以參考已經支持的設備。
對於 Maguro/Akami 設備,B2G source tree 中的 init.rc 是放在 device configuration 中,再經由 AndroidBoard.mk 將其 copy 到 target output 目錄,產生於 boot.img 中。使用這種方式,除了 init.rc 之外,AndroidBoard.mk 還要 copy 其它需要的系統檔案 (ex: init.qcom.rc,uevent.rc…)。而在 Galaxy S2 上,則用了一個 hacking 的做法,將 init.rc 存放在 B2G/boot/initramfs 中,並且在 build kernel 時就將 initramfs 合併於 zImage 中。
關於 extract-files.sh:
B2G 會用到一些原廠設備特有的 binary blobs,包括 execution files,shared libraries,WIFI firmware,system configuration 等。不同設備之間有相當的差異,要怎麼判斷哪些 files 需要被 extract 呢?這部份需要一些經驗。可以先參考相似 solution 設備的做法,再根據 flash 後,B2G 跑起來的 logcat 訊息來調整。
結語:
本 文提供的是一個 porting 的大原則,實際在 porting 時可能會碰到各式各樣的問題。在後續的文章中,將針對一些比較常遇到的問題深入探討。在此提供一個以 Samsung Galaxy S2 Skyrocket 的 porting 範例 [6],做為參考。
[1] https://wiki.mozilla.org/B2G/Architecture
[2] http://forum.xda-developers.com
[3] http://www.cyanogenmod.com
[4] https://github.com/andreasgal/B2G
[5] https://github.com/mozilla-b2g/B2G
[6] https://github.com/shianyow/B2G/tree/skyrocket