什么是增量更新
由于 APP 隨著業(yè)務(wù)需求的不斷迭代更新,功能越來(lái)越多(復(fù)雜),APK 包的體積也會(huì)越來(lái)越大,導(dǎo)致客戶端的更新操作需要占用更多的帶寬流量、時(shí)間等等,因此需尋求一些更優(yōu)的更新方案。
而增量更新是將一個(gè)完整新版 APK 跟舊版 APK 進(jìn)行二進(jìn)制差分對(duì)比,產(chǎn)生更小的增量包,給到客戶端進(jìn)行下載更新,增量更新與完全更新相對(duì),流程如圖1所示。
增量更新的好處是能減少流量成本的消耗,降低客戶端升級(jí)時(shí)間。

增量更新方案
網(wǎng)上現(xiàn)在有的增量更新方案有 BSDiff、Xdelta、Courgette(谷歌)等等。由于 Courgette 并不適用于 Android APK 更新,所以這里不對(duì)它進(jìn)行對(duì)比測(cè)試。表1是針對(duì)前兩者方案進(jìn)行對(duì)比。

實(shí)驗(yàn)測(cè)試
前提條件
差分生成環(huán)境:Windows 10(64位)、CPU i5-6500(3.2GHz)、RAM 16GB
差分合成環(huán)境:SamSung SM-P583、Android 7.0、RAM 3GB
注:差分生成階段通常在服務(wù)端進(jìn)行操作,而差分合成階段通常在手機(jī)端進(jìn)行操作。
測(cè)試一(15M左右APK)
這里選取Flipboard 紅板報(bào)作為測(cè)試對(duì)象,版本分別為4.3.12 (14.5MB)、4.3.13 (14.6MB),測(cè)試對(duì)比數(shù)據(jù)如下所示。


測(cè)試二(100M左右APK)
這里選取微信作為測(cè)試對(duì)象,版本分別為6.7.3 (75.5MB)、7.0.3 (104MB),測(cè)試對(duì)比數(shù)據(jù)如下所示。


測(cè)試三(500M左右 APK)
這里選取游戲包亂世王者作為測(cè)試對(duì)象,版本分別為1.6.8.25 (532MB)、1.6.12.26 (560MB),測(cè)試對(duì)比數(shù)據(jù)如下所示。


測(cè)試四(1.8GB左右 APK)
這里選取游戲包絕地求生作為測(cè)試對(duì)象,版本分別為0.13.5(1.79GB)、0.14.5 (1.86GB),測(cè)試對(duì)比數(shù)據(jù)如下所示。


注:數(shù)據(jù)來(lái)源于5次實(shí)驗(yàn)數(shù)據(jù)平均值
結(jié)論
由前面幾組測(cè)試實(shí)驗(yàn)結(jié)合相關(guān)源碼,可以得出如下結(jié)論:
1)差分耗時(shí)方面,Xdelta3在差分生成和差分合成都優(yōu)于 BSDiff,兩者的差距約10倍左右。兩者的差分合成都優(yōu)于差分生成;
2)內(nèi)存消耗方面,隨著 APK 包的大小增大,BSDiff 的內(nèi)存也會(huì)翻倍增大占用,而Xdelta3 卻是穩(wěn)定一定范圍;
3)當(dāng) APK 達(dá)到一定大小時(shí),BSDiff 會(huì)出現(xiàn)差分失?。◤?C 的源代碼可以分析出,差分進(jìn)行大量動(dòng)態(tài)申請(qǐng)內(nèi)存空間導(dǎo)致,同時(shí)也是占用內(nèi)存大的原因,如圖6所示),而 Xdelta 依舊可以差分;
4)另外,BSDiff 需將新舊文件一次性讀進(jìn)內(nèi)存形成字符串字典,進(jìn)行排序(qsufsort)、搜索(search)對(duì)比等等,產(chǎn)生相關(guān) diffstring 和 extra string 塊,最后進(jìn)行 bzip2 壓縮生成增量包(patch),同時(shí)也發(fā)現(xiàn)排序、搜索等差異對(duì)比操作與 bzip2 壓縮生成操作各占一半時(shí)間;而 Xdelta3 應(yīng)用相關(guān)窗口算法對(duì)新舊文件分塊讀進(jìn)內(nèi)存,進(jìn)行差異對(duì)比生成增量包;
5)需要注意的是,兩個(gè)加固包產(chǎn)生的增量包不能與無(wú)加固包進(jìn)行合成。

綜上所述,BSDiff 和 Xdelta 這兩個(gè)方案都可以對(duì) APK 進(jìn)行差分。其中 BSDiff 目前使用熱度較高,資料較多;而Xdelta 無(wú)論在耗時(shí)或是內(nèi)存開(kāi)銷都有優(yōu)于 BSDiff,唯一不足是資料缺少,目前沒(méi)發(fā)現(xiàn)使用的 APP。排除 Xdelta 的不足,建議優(yōu)選 Xdelta。
附(后續(xù)考慮點(diǎn)):
1) 維護(hù)需要相關(guān)有 C 語(yǔ)言開(kāi)發(fā)經(jīng)驗(yàn);
2) 服務(wù)端多個(gè)版本差分包策略。
------------------------------------------ 2019-06-28 更新↓↓↓ -----------------------------------------
Xdelta3 二次實(shí)驗(yàn)測(cè)試
實(shí)驗(yàn)測(cè)試前提
Xdelta 版本:3.1.1
差分生成環(huán)境:Windows 10(64位)、CPU i5-6500(3.2GHz)、RAM 16GB
差分合成環(huán)境:SamSung SM-P583、Android 7.0、RAM 3GB
差分工具:Mingw-w64(x86_64-8.1.0)編譯器生成 .exe 可執(zhí)行文件
差分 so 庫(kù):android-ndk-r16b-windows-x86_64 交叉編譯器生成 armeabi 和
armeabi-v7a 架構(gòu) .so
差分生成設(shè)置:默認(rèn)壓縮等級(jí)3、默認(rèn)窗口大小8M
-
實(shí)驗(yàn)測(cè)試一 (15M 左右 APK)
測(cè)試對(duì)象:Flipboard 紅板報(bào) 4.3.12 (14.5MB)、4.3.13 (14.6MB)
測(cè)試結(jié)果:如下表所示。

-
實(shí)驗(yàn)測(cè)試二(100M 左右 APK)
測(cè)試對(duì)象:微信 6.7.3 (75.5MB)、7.0.3 (104MB)
測(cè)試結(jié)果:如下表所示。

-
實(shí)驗(yàn)測(cè)試三(500M 左右 APK)
?????????????? 測(cè)試對(duì)象:亂世王者 1.6.8.25 (532MB)、1.6.12.26 (560MB)
測(cè)試結(jié)果:如下表所示。

-
實(shí)驗(yàn)測(cè)試四(1.8GB 左右 APK)
?測(cè)試對(duì)象:絕地求生 0.13.5(1.79GB)、0.14.5 (1.86GB)???????
測(cè)試結(jié)果:如下表所示。

-
結(jié)論
????????????????????? ??????????????經(jīng)過(guò)實(shí)驗(yàn)測(cè)試,總結(jié)如下:
????????????????????? 1)通過(guò) Xdelta3 前后兩次實(shí)驗(yàn)測(cè)試,得出的結(jié)果是相近的;
????????????????????? 2)其次,Xdelta 3.1.1 版本相對(duì) 3.1.0 版本在耗時(shí)、內(nèi)存等方面有稍微的優(yōu)化;
????????????????????? 3)另外,發(fā)現(xiàn)不同的編譯器編譯生成的 Xdelta 可執(zhí)行文件對(duì)差分耗時(shí)有相關(guān)影響,例如 Mingw-w64 編譯器和 CL 編譯器生成執(zhí)行文件,在進(jìn)行差分生成操作耗時(shí)會(huì)相差一半左右(前者更優(yōu))。