一错沃,背景
在我們項(xiàng)目上架到各大應(yīng)用市場(chǎng)平臺(tái)后,這時(shí)我們的APP修改了一下bug后,這時(shí)一般我們需要重新上架新版本,或者在APP應(yīng)用內(nèi)從服務(wù)器下載新的APP,重新安裝APP,這叫 全量更新
. 全量更新有以下缺點(diǎn):
1,小功能或者小bug產(chǎn)品頻繁迭代.
2,服務(wù)器及客戶端下載耗流量.
比如:一個(gè)APP的V1.0.0版本的大小為20MB,現(xiàn)在需要發(fā)布V1.0.1版本的大小為22MB,我們對(duì)這兩個(gè)版本的apk文件差分對(duì)比,他們的差異包只有2Mb,如果我們使用增量更新這時(shí)只需要下載2MB,而全量更新就需要下載22MB大小的apk。
二睁冬,增量更新原理
1、增量更新主要分為兩步:
1)服務(wù)端拿新版本A和舊版本B做差分驾荣,生成差分包C‘
2)客戶端檢測(cè)到可增量更新的差分包摸屠,下載差分包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了育谬。
客戶端:用戶手動(dòng)更新或程序主動(dòng)請(qǐng)求檢測(cè)更新:
1)客戶端用MD5值和版本號(hào)作為參數(shù)向服務(wù)端請(qǐng)求更新數(shù)據(jù),若服務(wù)端沒有差分包則返回全量包下載URL帮哈、MD5值膛檀、簽名值。
2)若服務(wù)端存在相應(yīng)的差分包則返回差分包下載URL娘侍,全量包簽名值咖刃、全量包和差分包MD5值,全量包簽名值和MD5值憾筏。把差分包下載到本地之后(C1)嚎杨,先做MD5值校驗(yàn),確保下載的差分包數(shù)據(jù)的完整性氧腰,校驗(yàn)失敗則走全量更新邏輯磕潮,校驗(yàn)無誤和本地現(xiàn)有安裝的舊版本(B1)進(jìn)行差分合并生成新版本(A),之后進(jìn)行合成版本的MD5值校驗(yàn)和簽名校驗(yàn)容贝,確保合成文件的完整性和簽名信息的正確性。校驗(yàn)無誤進(jìn)行安裝之景。
3斤富、需要考慮的一些問題:
1)服務(wù)端生成的差分包大小接近新包大小,或者直接超過新包大小锻狗,就沒必要進(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的過程中有可能被劫持或者被運(yùn)營(yíng)商重定向潦嘶,如果是全量更新下載涩嚣,可以和服務(wù)端約定每段下載數(shù)據(jù)的校驗(yàn)邏輯規(guī)則,在HTTP頭中附加校驗(yàn)字段數(shù)據(jù)掂僵,確保萬無一失航厚;
4)服務(wù)端是否根據(jù)客戶端的更新請(qǐng)求實(shí)時(shí)生成差分?jǐn)?shù)據(jù)?從目前生成差分包的測(cè)試數(shù)據(jù)來看锰蓬,這個(gè)實(shí)現(xiàn)是不靠譜的幔睬。最好就是有新版本之后,在服務(wù)端先把差分包數(shù)據(jù)準(zhǔn)備好芹扭,而不是等到請(qǐng)求更新的時(shí)候再生成差分包麻顶。
原著來自:http://www.reibang.com/p/6cda8fd3464a
三,BSDiff/BSPatch舱卡、HPatch辅肾、XDelta工具測(cè)試數(shù)據(jù)對(duì)比
四,Android 增量更新的完整實(shí)現(xiàn)步驟
轉(zhuǎn)載: http://www.reibang.com/p/f1f9d1c8bb4e
五灼狰,PC端生成差分包步驟
1宛瞄, 準(zhǔn)備工具
開源框架:http://www.daemonology.net/bsdiff/
依賴bzip2庫:https://sourceforge.net/projects/gnuwin32/files/bzip2/
下載后的工具:(有需要可聯(lián)系我發(fā)給你們)
2, 解壓bsdiff-v4.3-win-x64.zip ,在當(dāng)前文件夾輸入一下命令生成差異包patch.
六, Android端實(shí)現(xiàn)合成
1, 創(chuàng)建一個(gè)NDK的AS項(xiàng)目,如果你原有的項(xiàng)目沒有NDK文件,可以把新創(chuàng)建的NDK項(xiàng)目把以下文件拷貝到老項(xiàng)目中.
在build.gradle中添加:
externalNativeBuild {
cmake {
cppFlags ""
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
參考: https://blog.csdn.net/qq_34106574/article/details/84298944
2,執(zhí)行bsPath合成