recovery mode


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。

流程圖如下所示:

 

from: https://blog.csdn.net/csh86277516/article/details/76212157

 


免責聲明!

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



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