本文對(duì)BSDiff/Patch九默、HDiffPatch和XDelta三種差分包實(shí)現(xiàn)方案做對(duì)比測(cè)試,在Android APK的差分更新實(shí)現(xiàn)上,XDelta差分方案實(shí)現(xiàn)是最優(yōu)的。
一杉畜、增量更新原理
1、增量更新主要分為兩步:
????1)服務(wù)端拿新版本A和舊版本B做差分衷恭,生成差分包C‘
????2)客戶端檢測(cè)到可增量更新的差分包此叠,下載差分包C‘之后,和本地舊版本B做合成随珠,生成新版本A灭袁。
2猬错、步驟詳細(xì)展開(kāi):
????服務(wù)器端:服務(wù)端的同學(xué)拿到客戶端同學(xué)開(kāi)發(fā)的新版本A,跟已發(fā)布的舊版本B1茸歧,B2兔魂,B3...做了差分生成相應(yīng)的差分包C1,C2举娩,C3...,并生成相應(yīng)差分包的MD5值构罗,當(dāng)然全量包的簽名铜涉、MD5值也是需要的,這樣客戶端需要的所有數(shù)據(jù)就OK了遂唧。
????客戶端:用戶手動(dòng)更新或程序主動(dòng)請(qǐng)求檢測(cè)更新:
????????1)客戶端用MD5值和版本號(hào)作為參數(shù)向服務(wù)端請(qǐng)求更新數(shù)據(jù)芙代,若服務(wù)端沒(méi)有差分包則返回全量包下載URL、MD5值盖彭、簽名值纹烹。
????????2)若服務(wù)端存在相應(yīng)的差分包則返回差分包下載URL,全量包簽名值召边、全量包和差分包MD5值铺呵,全量包簽名值和MD5值。把差分包下載到本地之后(C1)隧熙,先做MD5值校驗(yàn)片挂,確保下載的差分包數(shù)據(jù)的完整性,校驗(yàn)失敗則走全量更新邏輯贞盯,校驗(yàn)無(wú)誤和本地現(xiàn)有安裝的舊版本(B1)進(jìn)行差分合并生成新版本(A)音念,之后進(jìn)行合成版本的MD5值校驗(yàn)和簽名校驗(yàn),確保合成文件的完整性和簽名信息的正確性躏敢。校驗(yàn)無(wú)誤進(jìn)行安裝闷愤。
3、需要考慮的一些問(wèn)題:
????1)服務(wù)端生成的差分包大小接近新包大小件余,或者直接超過(guò)新包大小讥脐,就沒(méi)必要進(jìn)行差分更新;
????2)下載到本地之后是否需要進(jìn)行簽名校驗(yàn)依賴各自情況蛾扇,若有和系統(tǒng)方進(jìn)行合作的攘烛,系統(tǒng)方一般會(huì)拿APK進(jìn)行二次簽名之后作為系統(tǒng)內(nèi)置應(yīng)用。
????3)下載文件當(dāng)然也需要支持?jǐn)帱c(diǎn)續(xù)傳镀首,考慮再細(xì)點(diǎn)坟漱,下載APK的過(guò)程中有可能被劫持或者被運(yùn)營(yíng)商重定向,如果是全量更新下載更哄,可以和服務(wù)端約定每段下載數(shù)據(jù)的校驗(yàn)邏輯規(guī)則芋齿,在HTTP頭中附加校驗(yàn)字段數(shù)據(jù)腥寇,確保萬(wàn)無(wú)一失;
????4)服務(wù)端是否根據(jù)客戶端的更新請(qǐng)求實(shí)時(shí)生成差分?jǐn)?shù)據(jù)觅捆?從目前生成差分包的測(cè)試數(shù)據(jù)來(lái)看赦役,這個(gè)實(shí)現(xiàn)是不靠譜的。最好就是有新版本之后栅炒,在服務(wù)端先把差分包數(shù)據(jù)準(zhǔn)備好掂摔,而不是等到請(qǐng)求更新的時(shí)候再生成差分包。
二赢赊、現(xiàn)有增量更新實(shí)現(xiàn)方案????
1乙漓、BSDiff/Patch???
????這個(gè)實(shí)現(xiàn)方案是最多的,網(wǎng)上一大堆都是這個(gè)方案的實(shí)現(xiàn)释移,Android系統(tǒng)也整合了這個(gè)實(shí)現(xiàn)叭披。更多資料可參考Binary diff/patch?
2、HPatch
????博客資料參考開(kāi)源我的基于字節(jié)的數(shù)據(jù)補(bǔ)丁算法庫(kù)HDiffPatch玩讳,GitHub代碼資源:HDiffPatch涩蜘,這份代碼資源也提供了三個(gè)實(shí)現(xiàn)方案的對(duì)比測(cè)試,但是不是基于Android APK文件的差分熏纯,所以測(cè)試結(jié)果數(shù)據(jù)跟下面的測(cè)試結(jié)果有差異同诫。
????另附上:HDiffPatch和BSDiff/Patch兩個(gè)方案Android Demo實(shí)現(xiàn)GitHub代碼資源,解決了不熟悉C開(kāi)發(fā)的環(huán)境編譯配置問(wèn)題樟澜。
3剩辟、XDelta
????參考XDelta官網(wǎng),這邊需要注意的是必須基于3.0.4版本往扔,最新的版本編譯生成的SO得到的測(cè)試結(jié)果有問(wèn)題贩猎,生成的差分包很大,差分包的合成也有問(wèn)題萍膛,對(duì)比了兩個(gè)版本的代碼吭服,只在幾個(gè)小地方的處理邏輯有差異,那些邏輯看著也不像是導(dǎo)致問(wèn)題的原因蝗罗,如果有熟悉XDelta和C開(kāi)發(fā)的大神知道原因煩告知下原因艇棕。
4、Courgette
????用在Chrome 瀏覽器的更新上串塑,在BSDiff/BSPatch基礎(chǔ)上改進(jìn)的沼琉,性能更優(yōu),But...不適用于Android APK更新桩匪,詳細(xì)可參考Courgette測(cè)試報(bào)告打瘪。
????想要了解更多Courgette的內(nèi)容可參考Courgette官方文檔。
>> 完整內(nèi)容見(jiàn)個(gè)人博文:Android 增量更新全解