天天看點

Android5.0 Recovery源代碼分析與定制(一)

在Tiny4412的Android5.0源代碼中:

bootable/recovery/recovery.cpp是recovery程式的主檔案。

仔細一看,對比了其它平台的recovery源代碼,除了MTK對Recovery做了相應的定制外,其它的平台幾乎沒有看到,關于MTK平台,後續再分析。

關于Android5.0的recovery,有什麼功能,在recovery.cpp中開頭就已經做了詳細的說明,我們來看看:

在這段英文注釋裡,詳細的說明了factory_reset(Android的恢複出廠設定功能)的流程以及OTA系統更新的流程。

在這段注釋得最前面說得很明白,我們隻要往/cache/recovery/command中寫入相應的指令:

比如寫入: 

--update_package=path(對應的OTA更新的路徑)

例如:

--update_package=/mnt/external_sd/xxx.zip

将這條指令寫入後,再重新開機Android系統,recovery檢測到有這個指令存在,就會去搜尋這個路徑,然後将這個路徑做路徑轉換,接下來擷取轉換後的路徑後,就挂載這個路徑,然後挂載這個路徑,擷取OTA包,解包,校驗,然後最後實作真正的更新。

如果我們往這個檔案寫入: --wipe_data

那麼就會做出廠設定,格式化/data分區的内容。

接下來,我們來看看代碼,從main函數開始分析:

進入main函數後,會将recovery産生的log資訊重定向到/tmp/recovery.log這個檔案裡,具體代碼實作如下:

redirect_stdio函數源代碼:

我們看到,所有産生來自stdout和stderr的資訊會使用freopen這個函數重定向到/tmp/recovery.log這個檔案裡。

stdout就是标準輸出,stdout就是标準出錯。标準輸出就是我們平時使用的printf輸出的資訊。

當然也可以使用fprintf(stdout,"hello world\n");也是一樣的

标準出錯就是fprintf(stderr,"hello world!\n");類似的代碼。

接下下來,将會判斷是否使用adb的sideload來傳入,通過參數--adbd來判斷:

做完這些步驟以後,會初始化并裝載recovery的分區表recovery.fstab,然後挂載/cache/recovery/last_log這個檔案,用來輸出log。

這裡主要看如何裝載分區表的流程,先來看看recovery.fstab

接下來看是如果挂載的:

挂載完相應的分區以後,就需要擷取指令參數,因為隻有挂載了對應的分區,才能通路到前面要寫入command的這個檔案,這樣我們才能正确的打開檔案,如果分區都沒找到,那麼當然就找不到分區上的檔案,上面這個步驟是至關重要的。

擷取到對應的指令,就會執行對應的标志,後面會根據标志來執行對應的操作。

做完以上的流程後,下面就是建立裝置,設定語言資訊,初始化recovery的UI界面,設定Selinux權限,代碼如下:

接下來是重要的環節,這個環節将會根據上面指令參數來做真正的事情了,比如恢複出廠設定,OTA更新等。

在這裡面,我們最常用的即是OTA更新和恢複出廠設定,先來說說恢複出廠設定,這個功能就是所謂的手機雙清,衆所周知,Android手機在使用很久後,由于垃圾資料,以及其它的因素會導緻手機的反應越來越慢,這讓人煩惱不已,是以就需要雙清,雙清一般就是清除

/data分區和/cache分區,代碼流程很詳細,有興趣可以自己去分析。

接下來看看OTA是如何實作更新的,我們看到install_ota_package這個函數,執行到這個函數,看到源碼:

其實到了really_install_package這一步,才是真正做到OTA更新,但是在OTA更新之前至關重要的一步就是設定安裝挂載對應的節點了,我曾經掉入此坑,現在拿出來分析一下,我們來看看setup_install_mounts這個函數:

如果在安裝更新的時候,OTA包經過路徑轉換後不是放在/tmp和/cache這個路徑下的時候,那麼就會走else分支,進而解除安裝所有的挂載節點,這樣就會導緻,傳的路徑正确,卻OTA更新不成功,如果是做自己定制的路徑,這一步一定要小心,我們可以在這裡繼續添加定制的挂載點。

那麼,執行完設定挂載節點的函數後,接下來就是執行真正的OTA更新了,我們來看看:

關于recovery的大緻流程,我們分析至此,關于如何像MTK平台一樣,定制recovery,這就需要讀者能夠讀懂recovery的流程,然後加入自己的代碼進行定制,當然我們也會看到,一些recovery花樣百出,很多UI做了自己的,而不是用安卓系統原生态的,安卓系統recovery原生态的UI如下:

Android5.0 Recovery源代碼分析與定制(一)

如何定制相應的UI,後續我們會對recovery源代碼中的UI顯示做進一步的分析。。。。

接下來,貼出Android5.0的recovery.cpp代碼和注釋:

繼續閱讀