Android系統(tǒng)升級那些事兒摘要 本文首先介紹了Android系統(tǒng)更新要用到的一些概念:硬件、三種模式及相互之間的通信。然后介紹了Android系統(tǒng)的啟動和升級流程。
概述 通常,Android系統(tǒng)的升級包名稱為update.zip。Android系統(tǒng)內部自帶了燒寫升級包的工具,我們可以手動燒寫,也可以通過某些機制自動更新系統(tǒng)。同時,我們可以手動修改和制作升級包。本文主要闡述在Android系統(tǒng)升級中用到的一些概念,本文只是作為索引,并不涉及到具體的燒寫工作。本文基于Android系統(tǒng)的版本:4.0.4。
硬件 Android系統(tǒng)的燒寫,是非常貼近硬件的。一是,燒寫是在實實在在的硬件上操作的。二則,有時在翻閱源碼的時候,需要知道硬件的類型,以便找到和硬件相對應的源碼。
燒寫相關的硬件主要有三部分:CPU、內存和nand flash。當然,只是相對本文而言。CPU用來執(zhí)行程序中的指令。內存只是在運行中,將需要運行的程序加載其中并運行,關機后即消失。nand flash用來存儲程序的數據,它會一直存在。系統(tǒng)啟動時,會將nand flash上的操作系統(tǒng)加載到內存,然后運行在CPU中,對于非系統(tǒng)程序,按需加載到內存中運行。了解這些,有助于了解整個燒寫的過程。
在板子上,可以通過下面的命令,查看CPU的信息:
cat /proc/cpuinfo 通過如下命令查看內存的信息: cat /proc/meminfo nand flash是需要分區(qū)的,每個分區(qū)中對應了Android系統(tǒng)燒寫包中不同的image,比如:boot、system分區(qū)等??梢酝ㄟ^如下命令來查看nand flash的分區(qū)情況: cat /proc/mtd # 查看分區(qū)狀況 通常,nand flash包含了以下分區(qū):
通過下面的命令查看nand flash的總大?。?/div>
dmesg | grep NAND 三種模式 燒寫的過程中,需要在三種模式下互相切換。確切的說,應該是三個操作環(huán)境:bootloader、recovery和main system。
bootloader主要用來屏蔽硬件的差異,類似于PC中的BIOS,它的功能相對比較簡單,內部提供了一些命令,比如:可以將nand flash分區(qū)加載到內存、運行內存中的程序、操作SD卡等。Android中的booloader是uboot,位于源碼的uboot目錄下。
main system就是正常運行的Android操作系統(tǒng),而recovery則是一個mini的Android系統(tǒng),顧名思義,就是用來進行系統(tǒng)恢復相關的操作的,它的運行規(guī)則和main system一樣,只是,它在啟動時只加載recovery服務,此服務用于燒寫Android系統(tǒng)。
三者之間的關系如下圖所示:
系統(tǒng)先啟動到bootloader模式下,然后根據情況,啟動到recovery或者main system模式下。
bootloader 板子啟動時,在Putty控制臺中按回車,可以進入uboot,輸入help可以查看其可用的命令。uboot的命令是可以自定義的,需要在uboot源碼中進行設置。uboot下可以使用fastboot命令,進入fastboot模式下,可以使用PC與之連接(此時,使用fastboot協(xié)議通信),進行Android系統(tǒng)的燒寫工作。
在uboot中,你可以更新uboot在內的所有系統(tǒng)模塊。
recovery recovery系統(tǒng)包含了內核和類似于根文件系統(tǒng)兩部分,啟動時仍采用init進程和init.rc配置腳本,不同的是init.rc腳本比較簡單,system目錄中只存放了一些必備的工具。
recovery系統(tǒng)下,你能更新除uboot之外的所有Android系統(tǒng)模塊。
recovery模式下,只有一個recovery服務,該服務對應于recovery進程,源碼位置:bootable\recovery。
main system main system是正常運行的Android系統(tǒng)。
通信 Android板子每個時刻只可以處于bootloader、recovery、main system其中的一個模式中,燒寫過程中,三個模式之間需要通信,比如:main system通知recovery燒寫那個升級包。大致有三種方式可以用來通信:BCB、寄存器和cache分區(qū)。
BCB BCB (bootloader control block)可以用于main system傳遞數據給bootloader和recovery模式。BCB的內容存在于nand flash的一個獨立的分區(qū),可以在nand flash分區(qū)表中看到,分區(qū)的名稱為misc。
通過BCB,main system可以通知bootloader啟動到recovery模式下,同時也可以傳遞命令給recovery,比如燒寫哪個文件。
recovery在燒寫的過程中,會設置BCB,以確保燒寫成功前,一直會開機啟動到recovery模式下,這樣可以防止燒寫過程中斷電的情況。
寄存器 main system模式下,運行如下命令會重啟,并進入recovery模式:(也可調用android_reboot函數)
reboot recovery reboot命令實際上是系統(tǒng)調用,最終會調用到內核的kernel_restart函數,該函數最終會設置某個寄存器的位置,然后執(zhí)行重啟操作。 重啟后,bootloader會檢測到該寄存器的值,并根據其值,啟動到recovery模式下。
cache分區(qū)
|
|
來自: own360 > 《android_recovery》