之前寫了一個apk完成了OTA升級
一.應用層升級說明
大家知道android N已經是A/B升級模式,make otapackage之後就會生成update.zip升級文件
系統提供了UpdateEngine來完成這個升級:
UpdateEngine engine = new UpdateEngine();
mContext = context;
engine.bind(new UpdateEngineCallback(){
@Override
public void onStatusUpdate(int status, float percent){
SLog.i(TAG, "onStatusUpdate status = " + status + ", percent = " +
percent);
}
@Override
public void onPayloadApplicationComplete(int errorCode){
SLog.i(TAG, "onPayloadApplicationComplete errorCode = " + errorCode);
if(0 == errorCode){
reboot();
}
}
});
engine.applyPayload(url, offset, size, headerKeyValuePairs);
二.最近同事測試增量升級, 發現一些問題:
1.通過兩次的make otapackage, 生成update文件之後, 無法生成增量包
執行命令:
/build/tools/releasetools/ota_from_target_files –v –-block -p out/host/
linux-x86 -k build/target/product/security/testkey -i
path_to_target_files_v1.zip path_to_target_files_v2.zip update.zip
報錯如下:
執行: mmm external/bsdiff/ 之後解決這個問題
2.升級過程中system檢驗報錯:
執行命令:
update_engine_client --update --follow --payload=file:///data/ota_package/update.zip --offset=45 --size=674344122 --headers="FILE_HASH=AVkwRr5bgVPJE3MDYUsrmMI1p0dYs5mK/Lo8JVwq/Ao=
FILE_SIZE=674344122
METADATA_HASH=Fyi0UPUbvcjTjsJPC7ixBceA9J/VDr7ehVRIidHK104=
METADATA_SIZE=86724
報錯如下:
最後發現是同事修改了system的權限, 有remount操作導致.
總結, 遇到這個問題有2種情況:
a.out/target/product/msm9999/obj/PACKAGING/target_files_intermediates,解壓.zip文件之後的system.img
和out/target/product/msm9999/裏面的system.img不是同一個, 使用diff 比較一下即可發現
b.使用remount操作, 導致system改變了.
參考:https://blog.csdn.net/qq_25804863/article/details/80538248