Android 增量更新方案对比

什么是增量更新

由于 APP 随着业务需求的不断迭代更新,功能越来越多(复杂),APK 包的体积也会越来越大,导致客户端的更新操作需要占用更多的带宽流量、时间等等,因此需寻求一些更优的更新方案。

而增量更新是将一个完整新版 APK 跟旧版 APK 进行二进制差分对比,产生更小的增量包,给到客户端进行下载更新,增量更新与完全更新相对,流程如图1所示。

增量更新的好处是能减少流量成本的消耗,降低客户端升级时间。

图1 增量更新流程.png

增量更新方案

网上现在有的增量更新方案有 BSDiff、Xdelta、Courgette(谷歌)等等。由于 Courgette 并不适用于 Android APK 更新,所以这里不对它进行对比测试。表1是针对前两者方案进行对比。


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

实验测试

前提条件

差分生成环境:Windows 10(64位)、CPU i5-6500(3.2GHz)、RAM 16GB

差分合成环境:SamSung SM-P583、Android 7.0、RAM 3GB

注:差分生成阶段通常在服务端进行操作,而差分合成阶段通常在手机端进行操作。

测试一(15M左右APK)

这里选取Flipboard 红板报作为测试对象,版本分别为4.3.12 (14.5MB)、4.3.13 (14.6MB),测试对比数据如下所示。

图2 15M 左右 APK 耗时对比.png
表2 15M 左右 APK 实验数据结果.png

测试二(100M左右APK)

这里选取微信作为测试对象,版本分别为6.7.3 (75.5MB)、7.0.3 (104MB),测试对比数据如下所示。

图3 l100M 左右 APK 耗时对比.png

表3 100M 左右 APK 实验数据结果.png

测试三(500M左右 APK)

这里选取游戏包乱世王者作为测试对象,版本分别为1.6.8.25 (532MB)、1.6.12.26 (560MB),测试对比数据如下所示。

图4 l500M 左右 APK 耗时对比.png

表4 500M 左右 APK 实验数据结果.png

测试四(1.8GB左右 APK)

这里选取游戏包绝地求生作为测试对象,版本分别为0.13.5(1.79GB)、0.14.5 (1.86GB),测试对比数据如下所示。

图5 l1.8G 左右 APK 耗时对比.png

表5 1.8G 左右 APK 实验数据结果.png

注:数据来源于5次实验数据平均值

结论

由前面几组测试实验结合相关源码,可以得出如下结论:

1)差分耗时方面,Xdelta3在差分生成和差分合成都优于 BSDiff,两者的差距约10倍左右。两者的差分合成都优于差分生成;

2)内存消耗方面,随着 APK 包的大小增大,BSDiff 的内存也会翻倍增大占用,而Xdelta3 却是稳定一定范围;

3)当 APK 达到一定大小时,BSDiff 会出现差分失败(从 C 的源代码可以分析出,差分进行大量动态申请内存空间导致,同时也是占用内存大的原因,如图6所示),而 Xdelta 依旧可以差分;

4)另外,BSDiff 需将新旧文件一次性读进内存形成字符串字典,进行排序(qsufsort)、搜索(search)对比等等,产生相关 diffstring 和 extra string 块,最后进行 bzip2 压缩生成增量包(patch),同时也发现排序、搜索等差异对比操作与 bzip2 压缩生成操作各占一半时间;而 Xdelta3 应用相关窗口算法对新旧文件分块读进内存,进行差异对比生成增量包;

5)需要注意的是,两个加固包产生的增量包不能与无加固包进行合成。

图6 大量动态申请内存空间.png

综上所述,BSDiff 和 Xdelta 这两个方案都可以对 APK 进行差分。其中 BSDiff 目前使用热度较高,资料较多;而Xdelta 无论在耗时或是内存开销都有优于 BSDiff,唯一不足是资料缺少,目前没发现使用的 APP。排除 Xdelta 的不足,建议优选 Xdelta。

附(后续考虑点):

1) 维护需要相关有 C 语言开发经验;

2) 服务端多个版本差分包策略。

------------------------------------------ 2019-06-28 更新↓↓↓ -----------------------------------------

Xdelta3 二次实验测试

实验测试前提

Xdelta 版本:3.1.1
差分生成环境:Windows 10(64位)、CPU i5-6500(3.2GHz)、RAM 16GB
差分合成环境:SamSung SM-P583、Android 7.0、RAM 3GB
差分工具:Mingw-w64(x86_64-8.1.0)编译器生成 .exe 可执行文件
差分 so 库:android-ndk-r16b-windows-x86_64 交叉编译器生成 armeabi 和
armeabi-v7a 架构 .so
差分生成设置:默认压缩等级3、默认窗口大小8M

  • 实验测试一 (15M 左右 APK)

测试对象:Flipboard 红板报 4.3.12 (14.5MB)、4.3.13 (14.6MB)
测试结果:如下表所示。


1.png
  • 实验测试二(100M 左右 APK)

测试对象:微信 6.7.3 (75.5MB)、7.0.3 (104MB)
测试结果:如下表所示。


2.png
  • 实验测试三(500M 左右 APK)

​​​​​​​​​​​​​​ 测试对象:乱世王者 1.6.8.25 (532MB)、1.6.12.26 (560MB)

测试结果:如下表所示。


3.png
  • 实验测试四(1.8GB 左右 APK)

​测试对象:绝地求生 0.13.5(1.79GB)、0.14.5 (1.86GB)​​​​​​​

测试结果:如下表所示。


4.png
  • 结论

​​​​​​​​​​​​​​​​​​​​​ ​​​​​​​​​​​​​​经过实验测试,总结如下:

​​​​​​​​​​​​​​​​​​​​​ 1)通过 Xdelta3 前后两次实验测试,得出的结果是相近的;

​​​​​​​​​​​​​​​​​​​​​ 2)其次,Xdelta 3.1.1 版本相对 3.1.0 版本在耗时、内存等方面有稍微的优化;

​​​​​​​​​​​​​​​​​​​​​ 3)另外,发现不同的编译器编译生成的 Xdelta 可执行文件对差分耗时有相关影响,例如 Mingw-w64 编译器和 CL 编译器生成执行文件,在进行差分生成操作耗时会相差一半左右(前者更优)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容