製作target_files
make otapackage
可以將編譯的全部命令打出來跟蹤詳細編譯中間包的過程
製作差分包
ota_from_target_files.py製作全量包、或者增量包
./build/tools/releasetools/ota_from_target_files -v -p out/host/linux-x86 -k device/****/***Key -n -i A.zip B.zip
- 覆蓋所有分支情況
版本A的target_file到版本B的target_file中,會有下面四種情況
(1)版本A中沒有分區custom,版本B中沒有分區custom
(2)版本A中沒有分區custom,版本B中有分區custom
(3)版本A中有分區custom,版本B中沒有分區custom
(4)版本A中有分區custom,版本B中有分區custom
因而對應這四種情況都需要考慮,參考《代碼大全》中防禦式編程
直接讀取版本A,版本B中相關的文件,然後進行比較,如果不一樣則進行更新,如果一樣則不需要更新
製作差分包比較文件差異是,如果遇到解壓文件找不到臨時文件的情況,需要制定python解壓時不要刪除臨時文件
對zip簽名
-
替換zip中updater
unzip -o -q AtoB_update.zip -d AtoB cd AtoB zip -r ../AtoB_modified.zip ./
修改updater後,需要進行手動簽名
java -Xms2048m -jar out/host/linux-x86/framework/signapk.jar -w device/AAAA/common/keys/AAAAKey.x509.pem device/AAAA/common/keys/AAAAKey.pk8 I1029toJ0601_unsigned.zip update.zip
執行updater
-
updater中讀取機型名稱,同樣需要防禦式編程
機型名稱屬性是否存在
機型名稱屬性值是否有異常字符,前後是否有空格,參考如下
C語言去除字符串首尾空格,trim()函數實現 -
解壓zip中文件到data分區
參考install.cpp中代碼解壓文件到/data/分區,這樣就得要求此時/data分區已掛載
利用現有函數掛載分區
load_volume_table()
ensure_path_mounted()
調用execl執行想要執行的命令
在updater.c中fork出一個進程後,調用execl("/sbin/busybox", "sh", "-c", cmd, (char *) 0));
區分execl與system——應用程序中執行命令
./updater 1 /tmp/update.log AtoB_signed.zip
參考:
https://www.cnblogs.com/cxchanpin/p/7020315.html
https://blog.csdn.net/huangyabin001/article/details/43965307