從CM刷機過程和原理分析Android系統結構

  前面101篇文章都是分析Android系統源碼,似乎不夠接地氣。如果能讓Android系統源碼在真實設備上跑跑看效果,那該多好。這不就是傳說中的刷ROM嗎?刷ROM這個話題是老羅以前一直避免談的,因爲覺得沒有全面瞭解Android系統前就談ROM是不完整的。寫完了101篇文章後,老羅覺得第102篇文章該談談這個話題了,並且選擇CM這個有代表性的ROM來談,目標是加深大家對Android系統的瞭解。

  老羅的新浪微博:http://weibo.com/shengyangluo,歡迎關注!

  說起刷ROM的動機,除了上面說的用來看Android系統源碼在真實設備上的運行效果,還有很多值得說的。回想起PC時代,我們對我們自己擁有的設備(電腦),基本上能做的就是在上面重裝系統。這個系統是廠商做好給我們的,裏面有什麼我們就用什麼,不能隨心所欲地定製。當然,如果你用的是Linux系統,你是可以隨心所欲地對它進行定製的。不過可惜的是,我們的女神用的都是Windows系統。你和女神說你想要什麼樣的Linux系統,我給你定製一個,她會不知道你說的是什麼——她需要的是一個不會中毒的又跑得快的Windows系統而已。現如今雖然很多女神用的是仍然是我們不能隨心所欲定製的iOS系統,但是在移動設備上,iOS系統畢竟不能做到Windows在PC那樣的一家獨大——我們還有不少女神是用Android系統的。所以,如果你現在和女神說,我可以幫你刷一個專屬的精簡Android系統,裏面沒有一堆你不需要的預裝軟件,會讓你的手機跑得很快,那女神得有多崇拜你啊。

  當然,刷ROM的動機不能只是爲了讓女神崇拜,作爲一個程序猿,我們的首要任務是維護宇宙和平。怎麼維護呢?至少程序有BUG不能不改吧。你不改的話,老闆是不會放過你的。但是,碰到那些很棘手的BUG,怎麼辦呢?例如,你是一個Android應用開發者,調用一個API接口的時候,總是拋出一個異常,而這個異常不跟到API內部實現去看看實在是不知道什麼原因造成的。這時候,如果你手頭上有這個手機的系統源代碼,找這個API內部實現的地方,加一兩行調試代碼,再編譯回手機上去跑,是不是就很容易定位問題了呢?

  所以說,會刷ROM,不只是可以獲得女神崇拜,還可以維護世界和平,作爲一個Android開發者,你還有什麼理由不去學習刷ROM呢?既然你決定學習刷ROM了,那你就得先搞清楚兩個問題:1. 什麼是刷ROM;2. 怎麼學習刷ROM。

  在回答第一個問題之前,我們先來看看Android設備從硬件到系統的結構,如圖1所示:

  


  圖1 Android系統架構

  最底層的是各種硬件設備,往上一層是Bootloader。Bootloader是什麼概念呢?我們都知道,PC主板上有一小段程序叫做BIOS,主板加電時它是第一個跑起來的程序,負責初始化硬件,以及將OS啓動起來。在嵌入式世界裏(手機也是屬於嵌入式設備),也有一小段類似BIOS的程序,不過它不叫BIOS,而是叫Bootloader。使用最廣泛的Bootloader是一個叫uboot的程序,它支持非常多的體系結構。經過編譯後,uboot會生成一個uboot.bin鏡像,將這個鏡像燒到設備上的一個特定分區去,就可以作爲Bootloader使用了。

  Bootloader支持交互式啓動,也就是我們可以讓Bootloader初始化完成硬件之後,不是馬上去啓動OS,而是停留在當前狀態,等待用戶輸入命令告訴它接下來該幹什麼。這種啓動模塊就稱爲Fastboot模式。對於Android設備來說,我們可以通過adb reboot bootloader命令來讓它重新啓動並且進入到Fastboot模式中去。

  在討論Fastboot模式之前,我們先了解一下嵌入式設備的ROM結構(NAND flash之類的芯片)。通常,一個能夠正常啓動的嵌入式設備的ROM包含有以下四個分區:

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

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

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

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

  當設備處於Fastboot模式時,我們可以通過另外一個工具fastboot來讓設備執行指定的命令。對搞機者來說,最常用的命令就是刷入各種鏡像文件了,例如,往Kernel分區和Rootfs分區刷入指定的鏡像。

  對於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程序都做了些什麼事情。不過顧名思義,Recovery就是用來恢復系統的意思,也包含有更新系統的意思。這裏所說的系統,是用戶正常使用的系統,裏面包含有Android運行時框架,使得我們可以在上面安裝和使用各種APP。

  用戶正常使用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,實際上包含更新Recovery和更新用戶正常使用的系統兩個意思;而狹義上的刷ROM,只是更新用戶正常使用的那個系統。更新Recovery需要進入到Fastboot模式中,而更新用戶正常使用的那個系統需要進入到Recovery模式中。Android設備在啓動的過程中,在默認情況下,一旦Bootloader啓動完成,就會直接啓動用戶正常使用的那個系統,而不會進入到Recovery模式,或者停留在Bootloader中,也就是停留在Fastboot模式中。只有通過特定的命令,例如adb reboot recovery和adb reboot bootloader,或者特定的按鍵,例如在設備啓動過程中同時按住音量減小鍵和電源開關鍵,才能讓設備進入到Recovery模式或者Fastboot模式中。

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

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

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

  不過需要注意的是,system.img鏡像和boot.img鏡像不一定是只有在Recovery模式才能刷入,在Fastboot模式下也是可以刷入的,就像在Fastboot模式中刷入recovery.img鏡像一樣,只不過在Recovery模式下刷入它們更友好一些。說到這裏,就不得不說另外一個概念,就是所謂的Bootloader鎖。在鎖定Bootloader的情況下,我們是無法刷入非官方的recovery.img、system.img和boot.img鏡像的。這是跟廠商實現的Bootloader相關的,它們可以通過一定的算法(例如簽名)來驗證要刷入的鏡像是否是官方發佈的。在這種情況下,必須要對Bootloader進行解鎖,我們纔可以刷入非官方的鏡像。

  好了,以上就回答了什麼是刷ROM這個問題,接下來我們要回答的是如常學習刷ROM這個問題。

  前面我們提到了刷ROM的兩個步驟,實際上我們還少了一個重要的步驟,那就是先要製作recovery.img、system.img和boot.img。有人可能會說,網上不是很多現成的刷機包嗎?直接拿過來用不就是行了嗎?但是別忘了前面我們所說的刷ROM動機:隨心所欲地定製自己的系統。去拿別人制好的刷機包就失去了隨心所欲定製的能力。那就只能自己去編譯AOSP源碼生成刷機包了。

  然而,從零開始從AOSP源碼中編譯出能在自己使用的手機上運行的系統,可不是一件容易的事情。不過,好在有很多現成的基於AOSP的第三方開源項目,可以編譯出來在目前市場上大部分的手機上運行。其中,最著名的就是CyanogenMod了,簡稱CM。國內大部分的第三方Android系統,都是基於CM來開發的,包括MIUI和錘子。堅固金業

  選擇CM來講解刷ROM的過程是本文的主題。不過單就刷ROM這個過程來說,CM官網上已經有很詳細的過程,包括從CM源碼編譯出適用特定機型的刷機包,以及將編譯出來的刷機包刷到手機裏面去的過程。因此,本文不是單純地講解刷ROM過程,而是要結合原理來講解刷ROM過程的關鍵步驟,來達到幫助大家更進一步地理解Android的目的。

  要真正做到理解CM ROM的刷機原理,除了要對Android系統本身有一定的認識之外,還熟練掌握Android的源碼管理系統和編譯系統。因此,在繼續閱讀下面的內容之前,希望可以先閱讀前面Android源代碼倉庫及其管理工具Repo分析和Android編譯系統簡要介紹和學習計劃這兩個系列的文章。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章