定义
增量更新指在数据进行更新的时候,不进行覆盖式写入,而只变更改动的部分。是一种用时间换空间的方式。
涉及对象
数据包:一般在一次增量更新的时候涉及到两个数据包,原始数据包和目标数据包。
更新包:描述将原始数据编辑成目标数据的数据和操作包,是单向的。
生产者者:数据包与更新包的生产者。生产完一个数据包后,这个数据包会和其他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版本升级流程
服务器

客户端
