把 Firefox OS 硬塞 Android 手機

把 Firefox OS 硬塞 Android 手機

今天我拿到了一隻新的手機,手機上運行的正是大家所熟悉 Android 系統。我的任務是將 Firefox OS 移植到這一隻新的手機上,這個工作對我來說非常有趣,因為透過 hacking 的方式可以讓我更了解 Firefox OS 這個火紅的作業系統。以下將分幾個部份來逐步地描述 hacking 的過程。

  • 取得 Firefox OS 的環境

取得Firefox OS 的環境非常容易,你只要在網路上申請一個 git 的公開帳號,即可透過以下的連結取得整個 Firefox OS 的環境。

https://github.com/mozilla-b2g/B2G

在這個連結中,Mozilla 也寫了簡單的步驟來引導我們如何在電腦中建立 Firefox OS 的環境。

  • 對 boot.img 進行 hacking

Hacking boot.img 的目地是要進一步地取得 boot.img 裡的 ramdisk.img 並對其作一些 hacking 的動作。透過 unbootimg/mkbootimg,可以輕易地將 boot.img 作 packing/unpacking。

  • 對 ramdisk.img 進行 hacking 的動作

Ramdisk.img 所包含的是一個基本的 file system,在 kernel boot process 的過程中是首先被掛載起來的一個 file system,這裡面也包含了 init.rc 的 shell script file。Boot.img unpacking 後的 ramdisk.img 是 gzip 檔的格式,利用 gzip 解開之後再利用 cpio 作解壓縮,即可以看到真正的 file system。當 init program 在啟動的過程中,會 parsing init.rc 並根據 init.rc 的內容啟動所有的 process 以及 daemon。因此,可以將 b2g以及其所需要的 library 放進 init.rc 中以便讓系統在開機時自動啟動。

當然,原生系統 user space 的啟動也要從 init.rc 裡拿掉。以下有兩個主要的應用程序一定要從原生系統中移除。

  1. Android 是透過 Zygote 來啟動所有的應用程式,所以它是第一個要被移除掉的應用程序;
  2. 另外,由於 Firefox OS 已經整合了 Display 系統,因此需要將 Android 的 surfaceflinger 應用程序拿掉
  • 將 adb 的權限改為 root

可以透過修改 default.prop 裡的值可以完成這件事。default.prop也是在 ramdisk.img 中。下面連結中的文章有較詳細的說明。

http://www.360doc.com/content/12/0223/17/11192_189061561.shtml

一旦將 adb 的權限改為 root,即可透過 adb 在 run time 的情況下去 hacking 手機裡所有會使用到的 library

當上述的動都完成了之後,即可再利用cpio、gzip以及mkbootimg再壓縮成一個開機時 adb 具有 root 權限的一個 boot.img.

  • Firefox OS 啟動流程

基本上可以透過手動的方式啟動,而這也是比較快的一條路。當與 Device 的 adb 建立連線之後,將以下幾個 bins 以及 libraries push 進去

$ adb push /system/b2g/ /system/b2g/

$ adb push /system/bin/b2g.sh /system/bin/

$ adb push /system/bin/rilproxy /system/bin/

$ adb push /system/bin/fakeperm /system/bin/

另外,在 Firefox OS 的環境的根目錄裡執行以下兩個指令

$ ./flash.sh gecko

$ cd gaia

$ make install-gaia

在 /system/b2g 裡放著 b2g 這個主要的 process 以及一些 preloaded 的 library,執行 b2g.sh 這個 script file 可以啟動 rilproxy 以及 fakeperm 這兩個行程。而 “./flash.sh gecko”以及 “make install-gaia”則是載入 gecko 以及 gaia 的主體。

  • Firefox OS hacking 過程所遇到的一些問題

當 b2g 已經可以成功的運行起來後,接下來就是在開機過程中 driver 在執行載入時會出現的問題了。至於這個部份,就要根據實際情況來分析了。以下幾個步驟是我所遇到的問題,提供給大家參考。

  1. 在 adb log 中看到了 “display hardware composer error”,此時可以試著把原生的 library 以及 bin file 拿掉。
  2. rild 無法 launch 起來。此時可以檢查 system/build.prop 裡 rild.libpath 所指到的 shared library 以及其需要的 shared library是否完整。
  3. wifi 無法啟動
  • 試著置換 Firefox OS 所產生的 wpa_supplicant 以及 dhcpcd。另外這兩個 bin file 的屬性也需要注意。

 

掌握最新 Firefox, Firefox OS 相關訊息

 

加入 Mozilla Taiwan 臉書粉絲團 

加入 Mozilla Taiwan  G+ 

瀏覽 Mozilla Taiwan 部落格 

官網 mozilla.com.tw