Android ROM移植


  我們關注的Android ROM的移植是從源碼級別的編譯,但是從零開始從AOSP源碼中編譯出能在自己使用的手機上運行的系統,卻不是一件容易的事情,因為Google所提供的支持的機型太少。不過,我們可以利用現成的第三方ASOP開源項目來進行我們的Android ROM移植,他們已經適配了大量的第三方機型,並且也進行了自己的優化。最著名的第三方開源項目就是CyanogenMod,國內的小米的MIUI,也是基於CM來進行開發的。

  首先,我們要分析什么是ROM? ROM的本意其實是只讀內存(Read Only Memory),而我們所說的ROM其實指的是手機的固件(firmware),它是把某個系統程序寫入到特定的硬件系統中的flashROM。手機固件相當於手機的系統,刷新固件就相當於刷系統,也就是我們常說的刷ROM。

下面分析一下Android設備從硬件到系統的結構

最底層的是各種硬件設備,往上一層是Bootloader,是一小段類似BIOS的程序。使用最廣泛的Bootloader是一個叫uboot的程序,它支持非常多的體系結構。經過編譯后,uboot 會生成一個uboot.bin鏡像,將這個鏡像燒到設備上的一個特定分區去,就可以作為Bootloader使用了。Bootloader支持交互式啟動,也就是我們可以讓Bootloader初始化完成硬件之后,不是馬上去啟動OS,而是停留在當前狀態,等待用戶輸入 命令告訴它接下來該干什么。這種啟動模塊就稱為Fastboot模式。可以通過adb reboot bootloader命令來讓它重新啟動並且進入到Fastboot模式中去。

 

通常,一個能夠正常啟動的嵌入式設備的ROM包含有以下四個分區:

1. Bootloader分區,也就是存放uboot.bin的分區

2. Bootloader用來保存環境變量的分區

3. Kernel分區,也就是存放OS內核的分區       

4. Rootfs分區,也就是存入系統第一個進程init對應的程序的分區

 

對於Android設備來說,當它處於Fastboot模式時,我們可以將一個包含有Kernel和Rootfs的Recovery.img鏡像通 過fastboot工具刷入到一個稱為設備上一個稱為Recovery的分區去。這個過程就是刷Recovery了,它也是屬於刷ROM的一種。由於 Recovery分區包含有Kernel和Rootfs,因此將Recovery.img刷入到設備后,我們就可以讓設備正常地啟動起來了。這種啟動方式 就稱為Recovery模式。 對於Android設備來說,我們可以通過adb reboot recovery命令來讓它進入到Recovery模式中去。當設備處於Recovery模式時,我們可以做些什么呢?答案是取決於刷入的Recovery.img所包含的Rootfs所包含的程序。更確切地說,是 取決於Rootfs鏡像里面的init程序都做了些什么事情。

用戶正常使用Android設備時的系統,主要是包含有兩個分區:System分區和Boot分區。System分區包含有Android運行時框架、系統APP以及預裝的第三方APP等,而Boot分區包含有Kernel和Rootfs。刷入到System分區和Boot分區的兩個鏡像稱為system.img和boot.img,我們通常將它們打包和壓縮為一個zip文件,例如update.zip,並且將它上傳到Android設備上的sdcard上去。這樣當我們進入到Recovery模式時,就可以在Recovery界面上用我們之前上傳到sdcard的zip包來更新用戶正常使用Android設備時所用的系統了。這個過程就是通常所說的刷ROM了。

因此,一個完整的刷ROM過程,包含以下兩個步驟:

1. 讓設備進入到Fastboot模式,刷入一個recovery.img鏡像

2. 讓設備進入到Recovery模式,刷入一個包含system.img鏡像和boot.img鏡像的zip包

   

接下來分析一下刷入的update.zip壓縮包里面的主要包含哪些文件?

1.boot.img 文件,這是編譯內核源代碼生成的內核映像,然后與android源碼編譯出來的ramdisk.img一起通過mkbootimg工具創建出來的。

2.META-INF 目錄,這個目錄是手工創建的,主要用來存放一個升級腳本update-script(這個腳本的內容與system目錄中包含的文件有很大關聯)以及保存若干刷機包內的apk文件的簽名。

3.system目錄,這個目錄就是編譯android的平台源代碼生成的。

 

Android源碼編譯后,在out/target/product/generic下生成的三個鏡像文 件:ramdisk.img,system.img,userdata.img以及它們對應的目錄樹root,system,data。 ramdisk.img是根文件系統,system.img包括了主要的包、庫等文件,userdata.img包括了一些用戶數據,android加載 這3個映像文件后,會把 system和 userdata分別加載到 ramdisk文件系統中的system和 data目錄下。

要創建自己要創建自己的ROM,我們通常會涉及到以下的一些工作:

1. 編譯內核生成內核映像。

2. ramdisk.img的修改。ramdisk.img 是根文件系統,里面包含了啟動配置腳本。

3. update-script的修改。

4. System的修改。

我們已經對Android ROM的結構有了大致的了解,接下來就可以通過CM的源代碼來進行編譯並且定制自己的ROM了。CM官方支持的機型很多,設備列表參見(http://wiki.cyanogenmod.org/w/Devices),官方的發行版本現在分為兩種,nightly(通常每24小時更新一次的實驗版)和snapshot(基本穩定版)。當然,CM也為開發者提供了源代碼,它包含了Device的源代碼和Kernel的源代碼。將對應機型的源代碼下載好后,進行編譯,就可以得到自己的Recovery和ROM了。具體的編譯方法CM也給出了較為詳細的說明,以小米2s為例,可以參考(http://wiki.cyanogenmod.org/w/Build_for_aries)

 

參考資料

1. http://wiki.cyanogenmod.org/w/About

2. http://blog.csdn.net/luoshengyang/article/details/29688041


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM