Firefox OS (B2G) porting 流程概談

目前 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:

  1. Kernel image
  2. 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/<manufacturer>/<device_id>  (device configuration tree for GingerBread)
  • B2G/glue/gonk-ics/device/<manufacturer>/<device_id>  (device configuration tree for ICS)

Porting 的概略流程:

  1. 先備份原廠的 firmware
  2. 在 B2G Makefile 中支持新設備,新增包括 build kernel,config device,flash 相關的 script
  3. 取得新設備的 kernel source,放在 B2G/boot
  4. 新增 device configuration,並加入至少以下檔案:
    • AndroidKernel.mk
    • AndroidBoard.mk
    • AndroidProducts.mk
    • BoardConfig.mk
    • extract-files.sh
    • full_<device_id>.mk
    • idc files for touch screen
  5. 修改 init.rc for B2G
  6. Config/build/flash image casino online 到新的設備並測試

關於 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

您可能也會喜歡

目前找不到相關文章

共 7 則讀者回應

  1. 參照: Firefox OS (B2G) – 改变你,改变世界! | col0r| 关注firefox os

  2. 參照: 使用不同的檔案系統,B2G主程式沒跑起來! | Mozilla Tech | 謀智台客

對此文章發表回應

你的電子郵件位址並不會被公開。 必要欄位標記為 *