[Framework] 製作OTA升級包
build/tools/releasetools
中提供的 ota_from_target_files 工具可以構建兩種型別的軟體包:完整更新軟體包和增量更新軟體包。該工具將 Android 構建系統生成的 target_files .zip 檔案作為輸入檔案。
完整更新
完整更新是指軟體包將對裝置的整個最終狀態(system分割槽、boot分割槽和recovery分割槽)進行更新。只要裝置能夠接收軟體包並啟動恢復系統,軟體包就可以安裝所需的版本,而不受裝置當前狀態的影響。
示例:使用釋出工具為假設的msm8953_32 裝置構建完整更新:
# first, build the target-files .zip . build/envsetup.sh && lunch msm8953_32-user mkdir dist_output make dist DIST_DIR=dist_output
target_files .zip 包含構建 OTA 軟體包所需的所有內容。
./build/tools/releasetools/ota_from_target_files dist_output/tardis-target_files.zip ota_update.zip
ota_update.zip 現已準備就緒,可以傳送到測試裝置(所有內容均使用測試金鑰進行簽名)。
增量更新
增量更新包含一組要應用於裝置上的已有資料的二進位制補丁程式。以下原因可能會導致此類更新軟體包非常小:
- 未更改的檔案不需要包含在其中。
- 更改的檔案通常與之前的版本非常相似,因此軟體包中只需包含針對兩個檔案之間的不同之處進行的編碼。
只有當裝置具有構建相應軟體包所使用的舊版本或源版本時,您才能在裝置上安裝增量更新軟體包。要構建增量更新,您需要擁有上一個版本(您要更新的版本)中的 target_files .zip 以及新版本中的 target_files .zip。
./build/tools/releasetools/ota_from_target_files -i PREVIOUS-tardis-target_files.zip dist_output/tardis-target_files.zip incremental_ota_update.zip # make incremental from the older version
該版本與上一個版本非常類似,而且增量更新軟體包(約 1 MB)比對應的完整更新軟體包 (60 MB) 小得多。
僅當裝置執行的上一個版本與相應增量更新軟體包的起點版本完全一樣時,才向其分發該增量更新軟體包。如果嘗試在執行其他版本的裝置上安裝該增量包,系統將會顯示恢復錯誤圖示。此時使用者只要重新啟動裝置,即可回到舊系統;軟體包會先驗證它要更新的所有檔案是否已回到之前的狀態,然後再對其執行操作,因此,如果發生上述情況,裝置不應留在半升級狀態。
製作升級包
為了減小升級包的大小,我們選擇製作差分包(增量升級包)。
要製作差分升級包,需要先做出兩個全升級包,然後根據這兩個包製作出差分升級包。
編譯系統
製作升級包之前需要先對系統程式碼進行整編。編譯之前記得清空out目錄,因為系統編譯不會自動檢查刪除當前版本棄用的檔案。
. build/envsetup.sh lunch msm8953 make clobber make -j20
編譯完成就會在$OUT
目錄下生成所有的img檔案。
可以通過printenv檢視$OUT
指向哪裡。
編譯升級包
使用
make otapackage
編譯結束會在$OUT/obj/PACKAGING/target_files_intermediates/
目錄下生成升級用的.zip
包。比如:msm8953-target_files-eng.Data.BU.zip
製作差分包
有了升級包,將其拷貝到一個目錄下儲存,比如OTA/old
,然後對原始碼做一些修改,保證有更新。然後clean掉$OUT
目錄,再次整編,製作升級包,然後把新的升級包拷貝到OTA/new
目錄下。
最後使用ota_from_target_files指令碼製作差分包就可以了:
./build/tools/releasetools/ota_from_target_files -i OTA/old/*.zip OTA/old/*.zip OTA/update/update.zip
差分包簽名
使用
make otapackage
生成的包是系統簽過名的。耳機通過指令碼做出來的差分包也是簽過名的:
$ unzip update.zip Archive: update.zip signed by SignApk inflating: META-INF/com/android/metadata inflating: META-INF/com/google/android/update-binary inflating: META-INF/com/google/android/updater-script inflating: META-INF/com/android/otacert inflating: META-INF/MANIFEST.MF inflating: META-INF/CERT.SF inflating: META-INF/CERT.RSA $ keytool -printcert -file META-INF/CERT.RSA
能夠打印出我們的keystore。
如果手動修改自定義升級包,需要再次簽名
./build/tools/releasetools/ota_from_target_files \ -k ~/.android-certs/releasekey \ signed-target_files.zip \ signed-ota_update.zip
編寫升級包製作指令碼
指令碼在croot目錄執行,思路是首先製作一個升級包放在OTA/old
目錄下,之後每次編譯,都會編譯出升級包放在OTA/new
目錄下,製作完差分包後,把新的升級包移動到OTA/old
目錄作為下一次升級的基礎包。
#!/bin/sh OTA_PATH="OTA/" OTA_OLD="OTA/old/" OTA_NEW="OTA/new/" OTA_DIFF="OTA/update/" create_dir() { if [ ! -d "$1" ] then mkdir "$1" echo "Create $1" fi } check_dir_empty() { if [ "`ls -A $1`" = "" ]; then echo "Couldn\`t find update package in folder $1" exit 404 fi } create_dir $OTA_PATH create_dir $OTA_OLD create_dir $OTA_NEW create_dir $OTA_DIFF #. build/envsetup.sh make otapackage -j20 # copy this time's build upgrade package to OTA/new cp $OUT/obj/PACKAGING/target_files_intermediates/*.zip OTA/new # compare this one to old one to make a diff package check_dir_empty $OTA_OLD check_dir_empty $OTA_NEW ./build/tools/releasetools/ota_from_target_files -i $OTA_OLD*.zip $OTA_NEW*.zip OTA/update/update.zip check_dir_empty $OTA_UPDATE echo "update.zip created in $OTA_UPDATE" # put this zip to old folder mv $OTA_NEW*.zip $OTA_OLD echo "Finished!"
Ref:
ofollow,noindex">https://blog.csdn.net/mike8825/article/details/47871481
https://source.android.com/devices/tech/ota