把 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 裡拿掉。以下有兩個主要的應用程序一定要從原生系統中移除。
- Android 是透過 Zygote 來啟動所有的應用程式,所以它是第一個要被移除掉的應用程序;
- 另外,由於 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 在執行載入時會出現的問題了。至於這個部份,就要根據實際情況來分析了。以下幾個步驟是我所遇到的問題,提供給大家參考。
- 在 adb log 中看到了 “display hardware composer error”,此時可以試著把原生的 library 以及 bin file 拿掉。
- rild 無法 launch 起來。此時可以檢查 system/build.prop 裡 rild.libpath 所指到的 shared library 以及其需要的 shared library是否完整。
- wifi 無法啟動
- 試著置換 Firefox OS 所產生的 wpa_supplicant 以及 dhcpcd。另外這兩個 bin file 的屬性也需要注意。
掌握最新 Firefox, Firefox OS 相關訊息
加入 Mozilla Taiwan 臉書粉絲團
加入 Mozilla Taiwan 的 G+