Android 增量更新,是在应用市场中非常常见的一个功能,并且很多游戏等 App 也会采用增量更新的方式升级版本,可以说是常见而且成熟的一门技术。
什么是增量更新
增量更新是基于 BSDiff 这个差量更新算法,基于两个 apk 字节码的差异,在服务端生成 patch 包,然后客户端通过同样的算法,把已安装的 apk 与 patch 包结合生成更新后的apk进行安装,以此减小 app 版本升级时的下载时间,提高更新效率。
增量更新有什么好处?
对于当前市场上大部分app,apk 体积一般在 100M 左右,假设网速 4M/s,那么全量更新需要的时间就是半分钟。至于增量更新,所需要的patch包与新老版本 app 改变的范围有关,绝大部分时间都可以减小一半以上的下载体积。
bsdiff 算法的原理
既然 bsdiff 是差量更新,那么这个算法的核心就在于,找不同。
首先,bsdiff 会记录以前缀分组的各个字符串组的最后一个字符串在old中的开始位置,这样对old文件中所有子字符串形成一个字典
static void qsufsort(long *I, long *V, u_char *pold, long oldsize)
{
long buckets[256];
long i, h, len;
for (i = 0;i < 256;i++) buckets[i] = 0;
for (i = 0;i < oldsize;i++) buckets[pold[i]]++;
for (i = 1;i < 256;i++) buckets[i] += buckets[i - 1];
for (i = 255;i > 0;i--) buckets[i] = buckets[i - 1];
buckets[0] = 0;
for (i = 0;i < oldsize;i++) I[++buckets[pold[i]]] = i;
I[0] = oldsize;
for (i = 0;i < oldsize;i++) V[i] = buckets[pold[i]];
V[oldsize] = 0;
for (i = 1;i < 256;i++) if (buckets[i] == buckets[i - 1] + 1) I[buckets[i]] = -1;
I[0] = -1;
for (h = 1;I[0] != -(oldsize +