Android 的Recovery機制【轉】

來源:互聯網
上載者:User

標籤:技術   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機制【轉】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.