Android 增量更新(BSDiff / bspatch)


Android 增量更新

BSDiff / bspatch
http://www.daemonology.net/bsdiff/
android的代碼目錄下 \external\bsdiff

 

bsdiff是二進制差分工具,其對應的 bspatch 是相應的補丁合成工具

命令:bsdiff oldfile newfile patchfile

用戶在下載了xx.patch補丁包后,需要用到補丁所對應的apk,即原來系統安裝的舊版本apk和補丁合成的bspatch工具。
系統舊版本的apk可以通過copy系統data/app目錄下的apk文件獲取,而補丁合成的bspatch可以通過將bspatch源碼稍作修改,封裝成一個so庫,供手機端調用。

bspatch的命令格式為:
bspatch oldfile newfile patchfile
和差分時的參數一樣。合成新的apk便可以用於安裝。
以上只是簡單的操作原理,增量升級還涉及很多其他方面,例如,升級補丁校驗等問題,可以參考android源碼中bootable\recovery\applypatch的相關操作


不足
增量升級並非完美無缺的升級方式,至少存在以下兩點不足:

1.增量升級是以兩個應用版本之間的差異來生成補丁的,你無法保證用戶每次的及時升級到最新,所以你必須對你所發布的每一個版本都和最新的版本作差分,以便使所有版本的用戶都可以差分升級,這樣操作相對於原來的整包升級較為繁瑣,不過可以通過自動化的腳本批量生成。

2.增量升級成功的前提是,用戶手機端必須有能夠讓你拷貝出來且與你服務器用於差分的版本一致的apk,這樣就存在,例如,系統內置的apk無法獲取到,無法進行增量升級;對於某些與你差分版本一致,但是內容有過修改的(比如破解版apk),這樣也是無法進行增量升級的,為了防止合成補丁錯誤,最好在補丁合成前對舊版本的apk進行sha1sum校驗,保證基礎包的一致性。

由於apk本質上是一個壓縮包,壓縮會導致做差分的時候效果並沒有那么明顯,差分包與新文件大小還是比較接近。所以我們可以做更進一步的優化,首先在服務端將apk1和apk2解壓,逐文件對比。另外創建一個清單記錄,如果有文件增加則標記增加,刪除做刪除標記,更改則對文件做差分,類似git的原理,然后將清單和差分文件最后一起打包。客戶端則根據下載下來的清單和差分文件做逆操作即可。


使用bsdiff進行差分升級,還並不是最優的方式,google在它的Chromium項目中,對這個差分算法進行了優化,優化后的版本叫做小胡瓜Courgette,據說性能優化了很多不是一個數量級了,官方的一個例子:
Full update 10,385,920
bsdiff update 704,512
Courgette update 78,848

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM