移植Firefox OS到Android手機

 今天我拿到了一隻新的手機,www.caocong.net手機上運行的正是你們所熟悉 Android 系統。個人任務是將 Firefox OS 移植到這一隻新的手機上,這個工做對我來講很是有趣,由於經過 hacking 的方式可讓我更瞭解 Firefox OS 這個火紅的操做系統。如下將分幾個部份來逐步地描述 hacking 的過程。html

      取得 Firefox OS 的環境linux

      取得Firefox OS 的環境很是容易,你只要在網絡上申請一個 git 的公開賬號,便可經過如下的連結取得整個 Firefox OS 的環境。android

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

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

      對 boot.img 進行 hackingweb

      Hacking boot.img 的目地是要進一步地取得 boot.img 裏的 ramdisk.img 並對其做一些 hacking 的操做。經過 unbootimg/mkbootimg,能夠輕易地將 boot.img 做 packing/unpacking。shell

      對 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 裏拿掉。如下有兩個主要的應用程序必定要從原生系統中移除。composer

      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

        Android adb root權限 ? 就愛linux 

        修改./default.prop

        把ro.secure設爲0,persist.service.adb.enable設爲1,adbd進程就會以root用戶的身份啓動。

         

        原理:

        能夠看一下Android系統根目錄下的/init.rc的片斷:

        … …

        # adbd is controlled by the persist.service.adb.enable system property

        service adbd /sbin/adbd

        disabled

        # adbd on at boot in emulator

        on property:ro.kernel.qemu=1

        start adbd

        on property:persist.service.adb.enable=1

        start adbd

        on property:persist.service.adb.enable=0

        stop adbd

        … …

        這裏定義了一個觸發器,只要persist.service.adb.enable值被置爲1,就會啓動/sbin/adbd。

         

        在build目錄下搜索一下,發現了main.mk中有這樣的代碼片斷

        ## user/userdebug ##

         

        user_variant := $(filter userdebug user,$(TARGET_BUILD_VARIANT))

        enable_target_debugging := true

        ifneq (,$(user_variant))

        # Target is secure in user builds.

        ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=1

         

        tags_to_install := user

        ifeq ($(user_variant),userdebug)

        # Pick up some extra useful tools

        tags_to_install += debug

        else

        # Disable debugging in plain user builds.

        enable_target_debugging :=

        endif

         

        # TODO: Always set WITH_DEXPREOPT (for user builds) once it works on OSX.

        # Also, remove the corresponding block in config/product_config.make.

        ifeq ($(HOST_OS)-$(WITH_DEXPREOPT_buildbot),linux-true)

        WITH_DEXPREOPT := true

        endif

         

        # Disallow mock locations by default for user builds

        ADDITIONAL_DEFAULT_PROPERTIES += ro.allow.mock.location=0

         

        else # !user_variant

        # Turn on checkjni for non-user builds.

        ADDITIONAL_BUILD_PROPERTIES += ro.kernel.android.checkjni=1

        # Set device insecure for non-user builds.

        ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=0

        # Allow mock locations by default for non user builds

        ADDITIONAL_DEFAULT_PROPERTIES += ro.allow.mock.location=1

        endif # !user_variant

         

        ifeq (true,$(strip $(enable_target_debugging)))

        # Target is more debuggable and adbd is on by default

        ADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=1 persist.service.adb.enable=1

        # Include the debugging/testing OTA keys in this build.

        INCLUDE_TEST_OTA_KEYS := true

        else # !enable_target_debugging

        # Target is less debuggable and adbd is off by default

        ADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=0 persist.service.adb.enable=0

        endif # !enable_target_debugging

        這段代碼我大體解釋一下:

        主要經過判斷當前的編譯模式來給幾個屬性賦予不一樣的值,而後把屬性存儲在ADDITIONAL_DEFAULT_PROPERTIES這個變量中, 這個變量在後面是要寫到根目錄下的/default.prop中去,在系統啓動時被屬性服務加載的。也就是說咱們在/default.prop中看到的幾 個屬性的值是在這裏設置的。

        只看兩個屬性ro.secure,persist.service.adb.enable。當前是user模式的話,編譯系統會把 ro.secure置爲1,把persist.service.adb.enable置爲0.也就是說,用user模式編譯出來的系統運行在安全模式 下,adbd默認關閉。即便經過設置屬性的方式打開,adbd進程的用戶也是shell,不具備root權限。這樣,普通用戶或者開發者拿到一個機器後, 經過PC運行adb shell時,是以shell用戶登陸機器的。

        好了,如今把ro.secure置爲0,再從新編譯,只要設置屬性persist.service.adb.enable的值爲1,adbd進程就會以root用戶的身份啓動。

      一旦將 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 的屬性也須要注意。

相關文章
相關標籤/搜索