Android OTA升級原理 - 實現流程(整理一)

OTA升級概述

OTA(Over-the-AirTechnology)是指手機終端通過無線網絡下載遠程服務器上的升級包,對系統或應用進行升級的技術。有關網絡部分不做過多討論,本文重點放在系統升級這一概念上。

目前主要分爲兩大類:

  • 按照升級的方式可以分爲:T卡升級和網絡升級
  • 按照包的內容可以分爲:增量升級和整包升級

那麼對於設備來說我們需要考慮幾點:

  • 升級包是怎麼產生的
  • 升級包是怎麼寫入設備對應的分區的。

製作升級包

對於Android系統升級包製作主要分兩種:

  • 一種是通過命令自動產出全包和增量包;
  • 另一種是在之前升級包的基礎(通常是增量包)上進行修改/增加新的內容;
    實際上第二種是對第一種的補充方式。

自動生成update.zip升級包

這種方式就是通過Android提供的編譯指令進行自動製作。
該方法主要概括爲以下幾個步驟:

make  # 先編譯Android源碼
make otapackage  # 開始製作ota全量包
# 製作差分包, 這一步需要準備基包base.zip, target_files.zip是剛剛生成的包, update.zip就是基於前面兩個包產生的增量包,用於後面升級使用
./build/tools/releasetools/ota_from_target_files -k build/target/product/security/testkey -s vendor/mediatek/proprietary/scripts/releasetools/mt_ota_from_target_files --block -i base.zip target_files.zip update.zip

注:
以上步驟是製作升級包的大概步驟,具體細節請各位自行搜索,網上資料實在太多了。

手動生成update升級包

這種模式通常情況下在改動很小或者只更新了某幾個APK應用程序,不想再重新make otapackage的情況下采用的。
該方法主要概括以下幾個步驟:

# 1.將現有的update.zip解壓
# 2.將改動的apk替換到system/app或者其他具體的工作目錄中
# 3.重新打包成update.zip, 打包的時候不能有二級目錄,即解壓後直接就是內容
# 4.對新的update.zip重新簽名 - 必須做, 重新簽名的指令如下:
java -Djava.library.path=out/host/linux-x86/lib64 \
    -jar out/host/linux-x86/framework/signapk.jar \
    -w build/target/product/security/testkey.x509.pem \
    build/target/product/security/testkey.pk8 update.zip update-new.zip

注:
1.以上步驟是製作升級包的大概步驟,具體細節請各位自行搜索,網上資料實在太多了。
2.網上有的資料提供的簽名指令,沒有增加-Djava.library.path=out/host/linux-x86/lib64這一句,導致簽名失敗,如果有遇到簽名失敗問題,可以加上試試。

增量包目錄結構

製作好的update.zip結構通常如下:不同的平臺可能有稍許差異
├── lk.img
├── META-INF
│ └── com
│ ├── android
│ │ ├── metadata
│ │ └── otacert
│ └── google
│ └── android
│ ├── update-binary
│ └── updater-script

├── odmdtbo.img
├── patch
│ └── boot.img.p
├── scatter.txt
├── system.new.dat
├── system.patch.dat
├── system.transfer.list
├── tee.img
├── type.txt
├── vendor.new.dat
├── vendor.patch.dat
└── vendor.transfer.list
其中有兩個文件需要說明一下,這個和後面升級會用到:

  • update-binary 是一個二進制文件,相當於一個腳本解釋器,它定義描述了updater-script中所使用的語法行爲,即最終實現的操作。該文件在Android源碼編譯後被放置在out/target/product/<TARGET_TYPE>/system bin/updater,在做make otapackage時會將updater重命名爲update-binary並放置到META-INF\com\google\android這個目錄中。
    源碼位置在:bootable\recovery\updater中
  • update-script 此文件是一個腳本文件,具體描述了更新過程。我們可以根據具體情況編寫該腳本來適應我們的具體需求。 它的語法是在update-binary中定義的。這個腳本也是我們後續會被改動的,比如我們需要增加一個自定義的更新,我們就可以手動增加重新打包簽名。

升級包寫入設備分區

這裏也是最重要核心的地方,設備是如何開始升級的。首先我們需要知道Android設備的幾種工作模式

Android的三種工作模式

主要有三種:

  • 正常模式
  • Recovery 模式
  • Fastboot模式

在這裏插入圖片描述
由上圖可以知道如何進入不同的模式:

  • 正常啓動模式: 用戶什麼都沒有操作,開機將自動進入該模式。
  • Recovery 模式: 可以有兩種種方式:
    [1] 開機時按下home+power組合鍵
    [2] 在正常模式下通過reboot recovery命令進入
  • fastboot:快速刷機模式:開機時按下camera+home組合鍵

Recovery升級模式

在前面我們製作的ota升級包就是需要在該模式下完成升級操作。

正常的升級流程如下圖:
在這裏插入圖片描述
這是一個從APP一路執行到底層的大概流程。在這我們只需要通過命令模擬從APP到framework的過程來驗證recovery 升級。
首先需要知道APP - Framework做了什麼事情;簡單可以概括爲:從APP接收到升級包並獲取完整路徑,給到framework,然後framework將進行校驗是否合法,然後再對/cache/recovery目錄相關歷史記錄做清除操作,並寫入接收到的完整路徑到command文件中,最後通過reboot recovery讓設備重啓進入升級模式。
所以我們只需要模擬這一過程就可以:

  • 首先提供上述update.zip升級包放入到/sdcard/update.zip中
  • 其次 寫入升級包名到 /cache/recovery/command - 格式爲: --update_package=/sdcard/update.zip
  • 其次清除/cache/recovery目錄中的歷史信息如: log, sqlite等
  • 最後通過reboot recovery指令讓設備重啓進入升級模式

這樣整個升級將完成了。本節只是讓同學初步認識到OTA升級的基本過程。
對於Recovery模式,是如何進行升級操作的,它的具體過程是如何?

接下來我們將進行分析Recovery服務流程細節請看下篇分析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章