Android 增量更新,是在应用商场中非常常见的一个功用,并且许多游戏等 App 也会选用增量更新的方法晋级版别,能够说是常见并且老练的一门技能。

什么是增量更新

appointment量更指针式万用表新是依据 BSDiff 这个差量更新算法,依据两个 apk 字节码的差异,在服务端生成 patch 包,然后客户端经过相同的算法,把已设备的 apk 与 patch 包结合生成更新后的apk进行设备,以此减小 app 版别晋级时的下载时间,进步更新效率。

增量更新有什么优点?

关于当时商场上大部分app,apk 体积一般在 100M 左右,假定网速 4M/s,那么全量更新需求的时间便是半分钟。至于增量更新,所需求的patch包与新老版别 app 改动的范围有关,绝大部分时间都能够减小一半以上的下载体积。

bsdiff 算法的原理

Android_增量更新(BSDiff)详解

已然 bsdiff 是差量更新,那么这个算法的核心就在于,找不同。

首要,bsdiff 会记载以前缀分组的各个字符串组的毕竟一个字符串在old中的初步方位,这样对oldappointment文件中所有子字符串构成一个字典

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++appstore) buckets[pold[i]]++;
for业务文书 (i = 1;i &l业务文书t; 256;i++) buc前端技能kets[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 < o指针万用表的使用方法ldsize;i++) V[i] = bucke字节码文件是与渠道无关的什么文件ts[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 + 1);h += h) {
len = 0;
for (applicationi = 0;i < oldsize + 1;) {
if (业务性作业是什么意思I[i] < 0)appreciate {
len -= I[i];
i -= I[i];
}
else {
if (len) I[i - len] = -len;
len = V[I[i]] + 1 - i;
split(I, V, i, len, h);
i += le前端面试题n;
len = 0;
};
};
if (len) I[i - len] = -len;
};
for (i = 0;i &lt指针式万用表怎样读数; oldsize前端工程师 + 1;i++) I[V[i]] = i;
}

然后,比照o指针式万用表ld文件和new文前端面试题件,发生diffs指针式万用表怎样读数tring和extra string

    wh指针式万用表的使用方法图解ile (scan &lt指针万用表的使用方法; newsize) {
oldscore = 0;
// 先找到相同代码的长度
for (scsc = scan += len;scan < newsi指针式万用表的使用方法图解ze;scan++) {指针数组和数组指针的差异
...
};
if ((len != oldscappleore) || (scan == newsize)) {
// 再找到不同代码的长度
...
// 将存在差异的当地放到 d指针数学b中
// 将新增的当地放到 eb 中
for (i = 0;i < lenf;i++)
db[dblen + i] = pnew[lastscan + i] - pold[lastpos + i];
for (i = 0;i < (scan - lenb) - (lastscan + lenf)appointment;i++)
eb[eblen + i] = pnew[lastscan + lenf + i];
// 计算长度
dblen += lenf;
eblen += (scan业务性作业 - le业务所是干什么的nb) - (业务员lastscan + lenf);
// 将差异存在的方位等信息,写入到 pfbz2 中
}指针式万用表图片;
};

毕竟,将diffstring 和extra string 以及相应的控制字用zip压缩成一个patch包


/* 将存在差异的数据写入 pf 中 */
if ((pfbz2 = BZ2字节码是什么意思_bzWriteOpen(&bz2err, pf, 9, 0, 0)) == NULL)
errx(1, "BZ2_bzWrit前端开发eOpen, bz2err = %d", bz2err);
BZ2_bzWrite(&bz2err, pfbz2, db, dblen);
if (bz2err != BZ_OK)
errx(1, "BZ2_bzWrite, bz2er指针式万用表图片r = %d", bz2err);
BZ2指针c语言_bzWriteClose(&bz2err, pfbz2, 0, NULL, NULL);
if (bz2err != BZ_OK)
errx(1, "BZ2_bzWriteClose, bz2err = %d", bz2err);
...
/* 将新添加的appstore额外数据写到 pf 中 */
if ((pfbz2 = BZ2_bzWriteOpen(&bz2err, pf, 9, 0, 0)) == NULL)
er业务文书rx(1, "BZ2_bzWriteOpen, bz2err = %d", bz2err);
BZ2_bzWrite(&bz2err, pfbz2, eb, eblen);
if (bz2err != BZ_OK)
errx(1字节码对象, "BZ2_业务局bzWrite, bz2err = %d", bz2err);
BZ2_bzWriteClose(&bz2err, pfbz2, 0, NULL, NULL);
if (appointmentbz2err != BZ_OK)
erappreciaterx(1, "BZ2_bzWriteClose, bz2err = %d"前端技能, b指针式万用表的使用方法图解z2err);
/* 将文件读写指指针万用表的使用方法针移到头部,去写hea字节码和机器码的差异der */
if业务性作业 (fseek(pf, 0, SEEK_SET))
err(1, "fseeko");
if (fwrite(header, 32, 1, pf) != 1)
err业务阻隔等级(1, "fwrite(%s)", a业务的四个特性rgv[3]);
if (fclose(pf))
err(1, "fAPPclose");

毕竟,pf指向的文件便是新生成的 patch 包。能够看到这个算法中,用到了许多的bzip2这个包,对 patc前端h 的体积进行了压缩。

如何增量更新

一、下载 bs指针式万用表的使用方法图解diff 源文件

Android_增量更新(BSDiff)详解

Android_增量更新(BSDiff)详解

因为官网现在下载链接无法正常翻开,所以我在网上找了一份windows上编译完毕的项目。下载字节码文件的扩展名是什么后,是一个编译完毕的c言字节码是虚拟机的机器码语程序。在source中能看到前端和后端的差异 bsdiff.c bspatch.c 等源码。

二、查验增量更新指针式万用表

已然 bsdiff 是依据二进制的增量更新算法,那么这个算法适用与任何文件类型,包括但不限于 apk txt jpg 等。所以前端面试题这次,我以 txt 格式文本做简略的查验。

先简略写一个 old.txt 文件,里头就随意写几句话

Android_增量更新(BSDiff)详解

保存成功后,咱们再新建一个 new.txt

Android_增量更新(BSDiff)详解

这时分,咱们就字节码编辑器有新老两个版指针数学其他文档,就能够经过 bsdiff 打增量更新的 patch 包了

Android_增量更新(BSDiff)详解

假定字节码编辑器咱们在指令窗口输appstore入 bsdiff 的时分,假定没有给出需求的字节码编辑器文件名,它就会提示参数格式。所以咱们依照提示的格式将新老两个txt文档的称谓填入,更新包的称谓就叫patch吧

Android_增量更新(BSDiff)详解

当指令实行完后,咱们就能够看到 patch 文件现已存在于文件夹中了。有了这个patch包,咱们就能够经过 bspat业务ch 将 old.txt 经过 patch 从头生成一个文档,这时分咱们命名为 result.txt

Android_增量更新(BSDiff)详解

假定咱们只输入 bspatch业务性作业, 也是会提示参数示意

Android_增量更新(BSDiff)详解

当指令实行完毕后,咱们就能够看到 result.txt 现已存在于文件夹中

Android_增量更新(BSDiff)详解

字节码文件的扩展名是什么开它一看,就能看到和 new前端训练机构.txt 一摸字节码文件的扩展名是什么相同的内容了。

三、增量更新实战

现在咱们了解了增量appointment更新是怎样玩的,结合实际的业务场景,简略描绘便是服务端依据新老appearance版别生成 patch 文件字节码和机器码的差异,客户端下载对应的 patch 文件后,与本地的 apk 一同生成最新版其他 apk,毕竟实行设备指令。

这个进程就这么简略,顶多涉及到部分 ndk 开发常识

Android_增量更新(BSDiff)详解

除了 bspatch.c 以外,咱们还需求引进 bzip2 的源码

Android_增量更新(BSDiff)详解

Android_增量更新(BSDiff)详解

Android_增量更新(BSDiff)详解

经过 BsPatchUtils 这个东西类,咱们就能够引用到 bspatch.c 中的方法了

Android_增量更新(BSDiff)详解

获取本地当时设备的 apk 和下载完毕的 patch 文件后,咱们就能够调用 BsPatchUtils 这个东西类生成最新版其他 apk,然后和全量更新相同直前端和后端的差异接依据 apk 文件进行设备就能够了。

毕竟一点考虑

增量更新只能应用于两个指定版其他 apk 中,在实际情况中却有许多的版别运行于线上,所以需appointment求有不同的 patch 文件去对应多个版别,也就需求后台依据版别生成并装备许多的文件。

一同,bsdiff 是依据二进制进行对业务性作业是什么意思比生成的 patch 文件,因而当客户端设备的是破解版的 apk,就会导致无法更新,最好对本地 apk 文件、patch 文件、生成后的 apk 文件,最好都字节码文件是与渠道无关的什么文件进行 md5 校验。

本文apple作者:自如大前端研制中心-李益