OTA 軟件包工具
本文地址http://wossoneri.github.io/2018/09/21/%5BAndroid%5D%5BFramework%5Dcreate-ota-update-zip/
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:
https://blog.csdn.net/mike8825/article/details/47871481
https://source.android.com/devices/tech/ota