Android 增量更新方案對(duì)比

什么是增量更新

由于 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í)間。

圖1 增量更新流程.png

增量更新方案

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


表1 框架對(duì)比(注:[ / ]:未知;[ √ ]:表示支持;[ × ]:表示不支持).png

實(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ù)如下所示。

圖2 15M 左右 APK 耗時(shí)對(duì)比.png
表2 15M 左右 APK 實(shí)驗(yàn)數(shù)據(jù)結(jié)果.png

測(cè)試二(100M左右APK)

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

圖3 l100M 左右 APK 耗時(shí)對(duì)比.png

表3 100M 左右 APK 實(shí)驗(yàn)數(shù)據(jù)結(jié)果.png

測(cè)試三(500M左右 APK)

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

圖4 l500M 左右 APK 耗時(shí)對(duì)比.png

表4 500M 左右 APK 實(shí)驗(yàn)數(shù)據(jù)結(jié)果.png

測(cè)試四(1.8GB左右 APK)

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

圖5 l1.8G 左右 APK 耗時(shí)對(duì)比.png

表5 1.8G 左右 APK 實(shí)驗(yàn)數(shù)據(jù)結(jié)果.png

注:數(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)行合成。

圖6 大量動(dòng)態(tài)申請(qǐng)內(nèi)存空間.png

綜上所述,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é)果:如下表所示。


1.png
  • 實(shí)驗(yàn)測(cè)試二(100M 左右 APK)

測(cè)試對(duì)象:微信 6.7.3 (75.5MB)、7.0.3 (104MB)
測(cè)試結(jié)果:如下表所示。


2.png
  • 實(shí)驗(yàn)測(cè)試三(500M 左右 APK)

?????????????? 測(cè)試對(duì)象:亂世王者 1.6.8.25 (532MB)、1.6.12.26 (560MB)

測(cè)試結(jié)果:如下表所示。


3.png
  • 實(shí)驗(yàn)測(cè)試四(1.8GB 左右 APK)

?測(cè)試對(duì)象:絕地求生 0.13.5(1.79GB)、0.14.5 (1.86GB)???????

測(cè)試結(jié)果:如下表所示。


4.png
  • 結(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))。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容