本文對BSDiff/Patch、HDiffPatch和XDelta三種差分包實現(xiàn)方案做對比測試,在Android APK的差分更新實現(xiàn)上,XDelta差分方案實現(xiàn)是最優(yōu)的。
一、增量更新原理

1、增量更新主要分為兩步:
????1)服務(wù)端拿新版本A和舊版本B做差分,生成差分包C‘
????2)客戶端檢測到可增量更新的差分包,下載差分包C‘之后,和本地舊版本B做合成,生成新版本A。
2、步驟詳細(xì)展開:
????服務(wù)器端:服務(wù)端的同學(xué)拿到客戶端同學(xué)開發(fā)的新版本A,跟已發(fā)布的舊版本B1,B2,B3...做了差分生成相應(yīng)的差分包C1,C2,C3...,并生成相應(yīng)差分包的MD5值,當(dāng)然全量包的簽名、MD5值也是需要的,這樣客戶端需要的所有數(shù)據(jù)就OK了。
????客戶端:用戶手動更新或程序主動請求檢測更新:
????????1)客戶端用MD5值和版本號作為參數(shù)向服務(wù)端請求更新數(shù)據(jù),若服務(wù)端沒有差分包則返回全量包下載URL、MD5值、簽名值。
????????2)若服務(wù)端存在相應(yīng)的差分包則返回差分包下載URL,全量包簽名值、全量包和差分包MD5值,全量包簽名值和MD5值。把差分包下載到本地之后(C1),先做MD5值校驗,確保下載的差分包數(shù)據(jù)的完整性,校驗失敗則走全量更新邏輯,校驗無誤和本地現(xiàn)有安裝的舊版本(B1)進(jìn)行差分合并生成新版本(A),之后進(jìn)行合成版本的MD5值校驗和簽名校驗,確保合成文件的完整性和簽名信息的正確性。校驗無誤進(jìn)行安裝。
3、需要考慮的一些問題:
????1)服務(wù)端生成的差分包大小接近新包大小,或者直接超過新包大小,就沒必要進(jìn)行差分更新;
????2)下載到本地之后是否需要進(jìn)行簽名校驗依賴各自情況,若有和系統(tǒng)方進(jìn)行合作的,系統(tǒng)方一般會拿APK進(jìn)行二次簽名之后作為系統(tǒng)內(nèi)置應(yīng)用。
????3)下載文件當(dāng)然也需要支持?jǐn)帱c續(xù)傳,考慮再細(xì)點,下載APK的過程中有可能被劫持或者被運(yùn)營商重定向,如果是全量更新下載,可以和服務(wù)端約定每段下載數(shù)據(jù)的校驗邏輯規(guī)則,在HTTP頭中附加校驗字段數(shù)據(jù),確保萬無一失;
????4)服務(wù)端是否根據(jù)客戶端的更新請求實時生成差分?jǐn)?shù)據(jù)?從目前生成差分包的測試數(shù)據(jù)來看,這個實現(xiàn)是不靠譜的。最好就是有新版本之后,在服務(wù)端先把差分包數(shù)據(jù)準(zhǔn)備好,而不是等到請求更新的時候再生成差分包。
二、現(xiàn)有增量更新實現(xiàn)方案????
1、BSDiff/Patch???
????這個實現(xiàn)方案是最多的,網(wǎng)上一大堆都是這個方案的實現(xiàn),Android系統(tǒng)也整合了這個實現(xiàn)。更多資料可參考Binary diff/patch?
2、HPatch
????博客資料參考開源我的基于字節(jié)的數(shù)據(jù)補(bǔ)丁算法庫HDiffPatch,GitHub代碼資源:HDiffPatch,這份代碼資源也提供了三個實現(xiàn)方案的對比測試,但是不是基于Android APK文件的差分,所以測試結(jié)果數(shù)據(jù)跟下面的測試結(jié)果有差異。
????另附上:HDiffPatch和BSDiff/Patch兩個方案Android Demo實現(xiàn)GitHub代碼資源,解決了不熟悉C開發(fā)的環(huán)境編譯配置問題。
3、XDelta
????參考XDelta官網(wǎng),這邊需要注意的是必須基于3.0.4版本,最新的版本編譯生成的SO得到的測試結(jié)果有問題,生成的差分包很大,差分包的合成也有問題,對比了兩個版本的代碼,只在幾個小地方的處理邏輯有差異,那些邏輯看著也不像是導(dǎo)致問題的原因,如果有熟悉XDelta和C開發(fā)的大神知道原因煩告知下原因。
4、Courgette
????用在Chrome 瀏覽器的更新上,在BSDiff/BSPatch基礎(chǔ)上改進(jìn)的,性能更優(yōu),But...不適用于Android APK更新,詳細(xì)可參考Courgette測試報告。
????想要了解更多Courgette的內(nèi)容可參考Courgette官方文檔。
>> 完整內(nèi)容見個人博文:Android 增量更新全解
