1. 程式人生 > >Android FOTA 升級流程

Android FOTA 升級流程

Android裝置的系統升級有兩種方式:(1)下載更新包到手機後,手動安裝,即所謂“卡刷包”的形式更新;(2) 通過 Over-the-air(OTA)的方式更新系統,簡稱為FOTA(Firmware Over The Air),FOTA升級有兩種方式,一種是Full update,即將整個IMG置於升級包中,然後將升級包直接拷貝到系統;一種是Increamental update,即通過增量式的差分包,只是將系統更新的部分打包,然後以打補丁的形式應用到系統。

在介紹FOTA升級流程之前,先來看看android系統的分割槽。一般,Android系統有如下幾個分割槽(不同廠商、裝置可能有差異):

  • /boot: 用於系統啟動的分割槽,主要包括Kernel和ramdisk。主要用於掛載system和其他分割槽,並載入system分割槽的程式碼。沒有該分割槽,手機是無法正常啟動的;

ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard 

Linux feature.

  • /system:該分割槽包含了出了 kernel/ramdisk之外的系統應用程式和庫檔案;正常操作情況下,該分割槽是隻讀狀態;
  • /recovery:用於系統升級打補丁,包含了一個完整的Linux作業系統和一個特殊的recovery包。FOTA升級時,下載完更新包後,進入recovery模式,recovery程式會讀更新包,然後將各個patch應用到各個分割槽;
  • /misc:升級時,recovery用於儲存相關資訊的小分割槽
  • /data:主要包含了使用者的資料,如聯絡人、簡訊、設定以及安裝的應用。清除該分割槽等同於將手機重置,OTA不會影響該分割槽;
  • /cache:用於存放需要經常訪問使用的資料和應用元件,訪問該分割槽需要特殊的應用程式許可權;OTA升級時下載的升級包就位於該分割槽;

FOTA升級流程

  1. 裝置定時檢查FOTA伺服器是否有更新;如有更新,服務其傳送訊息(包括更新包URL,以及關於該更新包的描述)通知裝置
  2. 更新程式下載升級包到 cache 或者 data 分割槽,並驗證升級包的簽名證書(證書位於/system/etc/security/otacerts.zip),驗證通過後,通知使用者準備安裝
  3. 裝置重啟至 recovery模式,此時啟動的是recovery分割槽的kernel/system
  4. init程序通過init.rc指令碼: service recovery /sbin/recovery 啟動 recovery程式
  5. 執行 /cache/recovery/command中的指令碼命令,將其指向於升級包:

     "/sbin/recovery" "--update_package=/cache/fota/update.zip"
    • 1
    • 1
  6. recovery首先校驗升級包的簽名是否與 /res/keys (ramdisk)中的公鑰相匹配

  7. recovery通過FOTA中的指令碼解析更新包,然後將修改分別更新到對應的boot/system等分割槽;在系統分割槽包含的新檔案包含了用於更新recovery分割槽的內容
  8. 系統正常重啟:

    • 啟動更新後的boot/system 分割槽
    • 啟動時,系統檢查當前recovery分割槽和需要更新的recovery分割槽(事先儲存在/system分割槽),如果有差異,則更新recovery分割槽
  9. 裝置通知FOTA伺服器升級完成

參考文獻