Android App增量更新

2,321 阅读3分钟

定义

增量更新指在数据进行更新的时候,不进行覆盖式写入,而只变更改动的部分。是一种用时间换空间的方式。

涉及对象

数据包:一般在一次增量更新的时候涉及到两个数据包,原始数据包和目标数据包。
更新包:描述将原始数据编辑成目标数据的数据和操作包,是单向的。
生产者者:数据包与更新包的生产者。生产完一个数据包后,这个数据包会和其他N个数据包进行比较差异,并生成最大2N个更新包。
使用者:数据包与更新包的使用者。一般两个功能:使用数据包、将原始数据包根据对应的更新包描述编辑成目标数据包。

涉及操作

Diff 将原始数据包和目标数据包比较,生成将原始数据包编辑成目标数据包单向的更新包的行为,称为 目标数据包Diff原始数据包。是一个单向双元操作。 Patch 根据更新包,将原始数据包编辑成目标数据包的行为,称为 原始数据宝Patch更新包。是一个单向双元操作。

流程

适用范围

目标数据包传递消耗>生产者Diff消耗+更新包传递消耗+使用者Patch消耗
涉及到数据传输消耗,算力消耗,存储空间消耗的计算和取舍

优劣

技术实现

通用:
bsdiff/patch 推荐
xdelta3 推荐
Courgette:专为pe,elf优化,对apk优化不如bsdiff
基于zip格式:
apkdiffpatch:会导致原始数据包变更,并且patch后的数据包与目标数据包并不完全一致。
archive-patcher:unzip后对文件用bsdiff/patch。

其他待加入:
hdiff (编译出现问题。。

使用对比

archive-patcher的patch大小是比较稳定的,且耗时在可接受范围内。

Android App增量更新

App 数据包

App 分为版本和渠道两个维度,其中版本是递增的,渠道是并列的,相同版本不同渠道的App 可能渠道号 或代码不一致

App 渠道

签名与渠道号

目前使用V2签名,APK文件可修改,即将渠道号写在ApkSignBlock中。

渠道包之间的关系

同一版本中,存在渠道包之间渠道号不同,且Apk文件不同(例如 代码 资源不同),也存在渠道包之间仅有渠道号不同,Apk相同

不同版本渠道包如何增量更新

渠道包=基准包 + 渠道 + (渠道特殊代码)?
对于没有渠道特殊代码的包,使用基准增量更新:
    (老渠道包-渠道号)=老基准包
    老基准包patch基准更新包=新基准包
    新基准包+渠道号=新渠道包  

对于有渠道特殊代码的包,使用渠道增量更新:
    老渠道包patch渠道更新包=新渠道包

如图:

Android App版本升级流程

服务器

客户端

其他

参考资料