Android 系統Recovery工作原理

2021-08-02 05:18:39 字數 2184 閱讀 2703

一、 recovery模式中的三個部分

recovery的工作需要整個軟體平台的配合,從通訊架構上來看,主要有三個部分。

①mainsystem:即上面提到的正常啟動模式(bcb中無命令),是用boot.img啟動的系統,android的正常工作模式。更新時,在這種模式中我們的上層操作就是使用ota或者從sd卡中公升級update.zip包。在重啟進入recovery模式之前,會向bcb中寫入命令,以便在重啟後告訴bootloader進入recovery模式。

②recovery:系統進入recovery模式後會裝載recovery分割槽,該分割槽包含recovery.img(同boot.img相同,包含了標準的核心和根檔案系統)。進入該模式後主要是執行recovery服務(/sbin/recovery)來做相應的操作(重啟、公升級update.zip、擦除cache分割槽等)。

③bootloader:除了正常的載入啟動系統之外,還會通過讀取misc分割槽(bcb)獲得來至mainsystem和recovery的訊息。

recovery對其操作的過程為:先讀取bcb然後讀取/cache/recovery/command,然後將二者重新寫回bcb,這樣在進入main system之前,確保操作被執行。

先從main system開始看,當我們在main system使用update.zip包進行公升級時,系統會重啟並進入recovery模式。在系統重啟之前,我們可以看到,main system定會向bcb中的command域寫入boot-recovery(粉紅色線),用來告知bootloader重啟後進入recovery模式。這一步是必須的。至於main system是否向recovery域寫入值我們在原始碼中不能肯定這一點。即便如此,重啟進入recovery模式後bootloader會從/cache/recovery/command中讀取值並放入到bcb的recovery域。而main

system在重啟之前肯定會向/cache/recovery/command中寫入recovery將要進行的操作命令。

至此,我們就大概知道了,在上層使用update.zip公升級時,主系統是怎樣告知重啟後的系統進入recovery模式的,以及在recovery模式中完成什麼樣的操作。

在重啟之前會向bcb中寫入資訊,以告知bootloader如何啟動,具體操作是這樣的:

• 向command域中寫入「boot-recovery」      // 此操作必做

• 向recovery域寫入「recovery\n」         // 此操作也可不做

這些操作很可能在kernel_restart(char *cmd)中完成,因為這一部分與體系結構無關,如果要實現完整的recovery,這部分工作是必須做的。

bootloader得到進入recovery模式的指示,用recovery.img啟動,進入recovery模式,init.rc (bootable/recovery/etc/init.rc)的內容比main system的要短的多,最重要的是把recovery程式作為服務啟動:

service recovery /sbin/recovery

而recovery[1024]中則存放著公升級包路徑,其儲存結構如下:第一行存放字串「recovery」;第二行存放路徑資訊「--update=/mnt/sdcard/update.zip」等。

2.get_arg():這個函式主要做了上圖中get_arg()往右往下直到parse arg/v的工作。我們對照著流程乙個乙個看。

①read_bootloader_message():主要工作是根據分割槽的檔案格式型別(mtd或emmc)從misc分割槽中讀取bcb資料塊到乙個臨時的變數中。

②然後開始判斷recovery服務是否有帶命令列的引數(/sbin/recovery,根據現有的邏輯是沒有的),若沒有就從bcb中讀取recovery域。如果讀取失敗則從/cache/recovery/command中讀取然後(logi("got arguments from boot message\n");)。這樣這個bcb的臨時變數中的recovery域就被更新了。在將這個bcb的臨時變數寫回真實的bcb之前,又更新的這個bcb臨時變數的command域為「boot-recovery」。這樣做的目的是如果在公升級失敗(比如公升級還未結束就斷電了)時,系統在重啟之後還會進入recovery模式,直到公升級完成。

③在這個bcb臨時變數的各個域都更新完成後使用write_bootloader_message()寫回到真正的bcb塊中。

這個過程可以用乙個簡單的圖來概括,這樣更清晰:

dataifle誤刪除的模擬recover

oracle 恢復試習一 1.熱備份tablespace users.2.a scott login,b create table tt seq number c declare i number begin for i in 1.20 loop insert into tt values i en...

iOS系統 android系統

ios系統版本與機型的對應關係 q ios10,11游標透明屬性失效問題 caret color transparent safari無效 text indent 99.99rem 輸入文字間隔縮小,游標靠邊 padding left 99.99rem 左間距放大 left 99.99rem 定位左...

Android系統設定

com.android.settings.accessibilitysettings 輔助功能設定 com.android.settings.activitypicker 選擇活動 com.android.settings.apnsettings apn設定 應用程式 設定com.android.s...