標籤:技術 mod string targe 解釋 擦除 應用 system類 water
本文轉載自:http://blog.csdn.net/fengying765/article/details/38301895
Android 的Recovery機制
目錄
1. 系統的啟動模式 1
1.1 Android系統的啟動模式 1
1.2 系統的啟動模式 2
2. Recovery模式中的三個部分 3
3. Recovery模式中的兩個通訊介面 3
3.1 主系統和Recovery通過/cache下的檔案通訊 3
3.2 Bootloader與Recovery通過BCB(Bootloader Control Block)通訊 4
4 Recovery模式的基本流程 5
1. 系統的啟動模式1.1 Android系統的啟動模式
一般的android系統具有以下幾種啟動模式(適用於Android系統的手機),它們的進入方式和描述如下所述:
1.一般啟動模式(normal mode)
進入方法:按電源鍵啟動
描述:這是正常啟動手機的方法
2.安全模式(safe mode)
進入方法:按住menu鍵,按電源鍵啟動手機,直至手機啟動完成鬆開menu鍵
描述:和正常啟動一樣,但沒有登記Google,所以不能訪問Market或使用你的Google帳號
3.引導模式(bootloader mode)
進入方法:按住照相鍵,按電源鍵啟動手機
描述:可以從SD卡上安裝新的系統映像(DREAIMG.NBH),只需再按一次電源鍵。為擷取root許可權,對手機進行降級,就是使用這個模式。
4.復原模式(recovery mode)
進入方法:按住HOME鍵,按電源鍵啟動手機
描述:可以開啟命令解釋程式(shell),重新整理映像檔案(flash image),執行備份等。當然這一切取決於你手機上的recovery image版本。
5.診斷模式(diagnostic mode)
進入方法:按住軌跡球,按電源鍵啟動手機
描述:用於測試(按音量鍵選擇項目)
6.fastboot模式
進入方法:按住返回鍵,按電源鍵啟動手機,直至螢幕出現FASTBOOT字樣後鬆開返回鍵
Android系統不同的啟動模式的進入是在不同的情形下觸發的,我們從SD卡中升級我們的update.zip時會進入Recovery模式是其中一種,其他的比如:系統崩潰,或則在命令列輸入啟動命令式也會進入Recovery或其他的啟動模式。
1.2 系統的啟動模式
由可知Android系統啟動後可能進入的模式有以下幾種:
1. MAGIC KEY(按鍵組合):按鍵組合:若使用者在啟動剛開始按了指定的recovery按鍵組合,系統會直接進入Recovery模式。
2. Recovery模式:進入系統“設定”->“系統”,有
a) 網路升級
b) 本地升級
c) 系統還原
三種方式進入Recovery模式,完成相應的工作。
3. 正常模式:
若啟動過程中使用者沒有按下任何按鍵組合,bootloader會讀取位於MISC分區的啟動控制資訊塊BCB(Bootloader Control Block)。它是一個結構體,存放著啟動命令command。根據不同的命令,系統又可以進入三種不同的啟動模式:MainSystem、Recovery、Bootloader。
2. Recovery模式中的三個部分
Recovery的工作需要整個軟體平台的配合,從通訊架構上來看,主要有三個部分。
l MainSystem:即上面提到的正常啟動模式(BCB中無命令),是用boot.img啟動的系統,Android的正常工作模式。更新時,在這種模式中我們的上層操作就是使用OTA或則從SD卡中升級update.zip包。在重啟進入Recovery模式之前,會向BCB中寫入命令,以便在重啟後告訴bootloader進入Recovery模式。
l Recovery:系統進入Recovery模式後會裝載Recovery分區,該分區包含recovery.img(同boot.img相同,包含了標準的核心和根檔案系統)。進入該模式後主要是運行Recovery服務(/sbin/recovery)來做相應的操作(重啟、升級update.zip、擦除cache分區等)。
l Bootloader:除了正常的載入啟動系統之外,還會通過讀取MISC分區(BCB)獲得來至Main system和Recovery的訊息。
3. Recovery模式中的兩個通訊介面
在Recovery服務中上述的三個實體之間的通訊是必不可少的,它們有以下兩個通訊介面。
3.1 主系統和Recovery通過/cache下的檔案通訊
Recovery通過/cache/recovery/目錄下的三個檔案與main system通訊。具體如下
l /cache/recovery/command:這個檔案儲存著Main system傳給Recovery的命令列,每一行就是一條命令,支援一下幾種的組合。
--send_intent=anystring //write the text out to recovery/intent
在Recovery結束時在finish_recovery函數中將定義的intent字串作為參數傳進來,並寫入到/cache/recovery/intent中;
-update_package=root:path //verify install an OTA(On The Air) package file
Main system將這條命令寫入時,代表系統需要升級,在進入Recovery模式後,將該檔案中的命令讀取並寫入BCB中,然後進行相應的更新update.zip包的操作。
--wipe_data //erase user data(and cache),then reboot。
擦除使用者資料。擦除data分區時必須要擦除cache分區。
--wipe_cache //wipe cache(but not user data),then reboot。
擦除cache分區。
--set_encrypted_filesystem=on|off - enables / diasables encrypted fs
啟用/禁用加密的檔案系統
--just_exit - do nothing; exit and reboot
退出並重啟
l /cache/recovery/log:Recovery模式在工作中的log列印。在recovery服務運行過程中,stdout以及stderr會重定位到/tmp/recovery.log在recovery退出之前會將其轉存到/cache/recovery/log中,供查看。
l /cache/recovery/intent:Recovery傳遞給Main system的資訊。作用不詳。
上層應用可以通過調用Android標準的RecoverySystem類(位於frameworks/base/core/Java/android/os/RecoverySystem.java中)的介面來完成與Recovery模式的通訊,如所示:
這個類裡主要的介面如下:
installPackage() 重啟裝置安裝指定升級包,在/cache/recovery/command裡寫入”--update_package=/path/xxx.zip”
rebootWipeUserData() 重啟裝置並清除user data分區,這個操作也成為“工廠複位”,
在/cache/recovery/command裡寫入”--wipe_data”
rebootWipeCache() 重啟進入Recovery模式,清除cache分區,在/cache/recovery/command裡寫入”--wipe_data”
verifyPackage() 這個介面主要是用於校正下載回來的的升級包是否符合Android的簽名認證。
介面調用後,系統會重啟,轉入Recovery mode,然後recovery進程會去讀取/cache/recovery/command裡的指令去執行相應的操作,是安裝升級包還是恢復出廠預設值等。
3.2 Bootloader與Recovery通過BCB(Bootloader Control Block)通訊
BCB是Bootloader與Recovery的通訊介面,也是Bootloader與Main system之間的通訊介面。儲存在flash中的MISC分區,佔用三個page,其本身就是一個結構體,具體成員以及各成員含義如下,位於/bootloader/revocery/bootloader.h檔案中:
struct bootloader_message{
char command[32];
char status[32];
char recovery[1024];
};
l command欄位:當要重啟進入Recovery模式或更新radio、bootloader韌體時,Linux會更新這個值;當韌體更新完成後Bootloader也會更新這個值。另外在成功更新後結束Recovery時,會清除這個成員的值,防止重啟時再次進入Recovery模式。
l status欄位:在完成相應的更新後,Bootloader會將執行結果寫入到這個欄位。
l recovery欄位:可被Main System寫入,也可被Recovery服務程式寫入。該檔案的內容格式為:
“recovery\n
<recovery command>\n
<recovery command>”
該檔案儲存體的就是一個字串,必須以recovery\n開頭,否則這個欄位的所有內容域會被忽略。“recovery\n”之後的部分,是/cache/recovery/command支援的命令。可以將其理解為Recovery操作過程中對命令操作的備份。Recovery對其操作的過程為:先讀取BCB然後讀取/cache/recovery/command,然後將二者重新寫回BCB,這樣在進入Main system之前,確保操作被執行。在操作之後進入Main system之前,Recovery又會清空BCB的command域和recovery域,這樣確保重啟後不再進入Recovery模式。
4 Recovery模式的基本流程
Recovery模式的基本流程如下:
1. 選擇“設定”->“系統”->”系統還原”;
2. Main system向/cache/recovery/command寫入"--wipe_data";
3. Main system 重啟進入Recovery模式;
4. get_args() 函數向 BCB寫入"boot-recovery"和"--wipe_data",然後開始擦除;
-- after this, rebooting will restart the erase --
5. erase_volume() 重新格式化/data分區
6. erase_volume() 重新格式化/cache分區
7. finish_recovery() 清除BCB,然後call reboot()進入Main system。
流程圖如下所示:
Android 的Recovery機制【轉】