本文內容轉載自FOTA升級流程以及FOTA相關知識總結兩篇文章,有需要可去原文查看。
Android設備的系統升級有兩種方式:
(1)下載更新包到手機後,手動安裝,即所謂“卡刷包”的形式更新;
(2) 通過 Over-the-air(OTA)的方式更新系統,簡稱爲FOTA(Firmware Over The Air)。FOTA升級有兩種方式,一種是Full update,即將整個IMG置於升級包中,然後將升級包直接拷貝到系統;一種是Increamental update,即通過增量式的差分包,只是將系統更新的部分打包,然後以打補丁的形式應用到系統。
Android系統分區
在介紹FOTA升級流程之前,先來看看Android系統的分區。一般,Android系統有如下幾個分區(不同廠商、設備可能有差異):
- /boot:用於系統啓動的分區,包括Linux系統內核和最小的系統文件。它負責安裝系統和其他分區,並加載system分區的代碼。沒有該分區,手機是無法正常啓動的;
- /system:該分區包含了出了 kernel/ramdisk之外的系統應用程序和庫文件。正常操作情況下,該分區是隻讀狀態, 其內容僅在OTA更新期間更改;
- /recovery:用於系統升級打補丁,包含了一個完整的Linux操作系統和一個特殊的recovery包。FOTA升級時,下載完更新包後,進入recovery模式,recovery程序會讀更新包,然後將各個patch應用到各個分區;
- /misc:升級時,recovery用於存儲相關信息的小分區
- /data:主要包含了用戶的數據,如聯繫人、短信、設置以及安裝的應用。清除該分區等同於將手機重置,OTA不會影響該分區;
- /cache:應用使用的臨時儲存區域,訪問該區域需要特殊權限,同時要用於儲存下載的FOTA包。其他程序使用這個空間,期望文件可以隨時消失。某些OTA軟件包安裝可能會導致此分區被完全擦除。
FOTA升級流程
- 手機會定期檢測是否有更新(也可手動檢測),並通知用戶有新版本可用。
- 將安裝包下載到cache分區,若cache分區不夠,下載到data分區(這時候要注意是否有寫入和刪除權限),並根據
system/etc/security/otacerts.zip
的證書驗證其加密簽名。系統提示用戶安裝更新。 - 系統重啓到recovery模式,運行的是recovery分區中的系統內核。而不是boot中的系統。
- init進程通過執行init.rc 腳本:service recovery /sbin/recovery 啓動recovery程序
- recovery首先校驗下載的安裝包是否與res/keys(ramdisk)中的公匙相匹配。
- recovery根據腳本解析安裝包,然後將修改分別更新到對應的分區中,在system 分區中包含了用於更新recovery分區的內容。
- 系統正常啓動:啓動更新後的boot,system分區。啓動時檢測是否對recovery分區有更新,若有差異,則更新到recovery分區(這裏也是爲什麼修改了recovery的代碼後,需要更新完,且在下個更新中才能得到驗證)
- 設備通知服務器更新完成。
OTA包的製作可去FOTA相關知識總結查看。