_StriveG Blog

浅谈客户端增量升级

前言

大家应该都有注意到,各大应用市场都在使用增量升级的技术。那么,今天,就来记录下,bsdiff和bspatch。

尝试

我们先去Binary diff/patch utility 中,把相关的资源下载下来,下载下来之后,我们进行编译,在编译之前,我们需要修改一点东西。

Makefile文件修改成如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CFLAGS += -O3 -lbz2
PREFIX ?= /usr/local
INSTALL_PROGRAM ?= ${INSTALL} -c -s -m 555
INSTALL_MAN ?= ${INSTALL} -c -m 444
all: bsdiff bspatch
bsdiff: bsdiff.c
bspatch: bspatch.c
install:
${INSTALL_PROGRAM} bsdiff bspatch ${PREFIX}/bin
.ifndef WITHOUT_MAN
${INSTALL_MAN} bsdiff.1 bspatch.1 ${PREFIX}/man/man1
.endif

就是在倒数第一行和倒数第三行增加缩进。

然后修改bspatch.c文件,增加如下代码:

1
typedef unsigned char u_char;

然后就可以进行编译了。

1
make

编译完成之后,我们就能进行初次尝试了。

首先我们用as,生成两个新旧的apk,old.apk new.apk

然后,我们终端进入bsdiff的目录,执行如下命令生成patch包。

1
2
3
#命令格式 bsdiff: usage: ./bsdiff oldfile newfile patchfile
./bsdiff old.apk new.apk patch.apk

然后,我们再用旧的apk和patch包,生成新的new.apk

1
2
3
#命令格式 bspatch: usage: ./bspatch oldfile newfile patchfile
./bspatch old.apk new_patch.apk patch.apk

最后,我们验证下new.apk 和我们生成的new_patch.apk的md5值和sha值

1
2
3
4
5
md5 new.apk
md5 new_patch.apk
shasum new.apk
shasum new_patch.apk

观察值是否相同,进行测试。

如何移植到Android

我们客户端要关心的,就是合成的过程,也就是bspatch,那么我们如何移植到Android上呢。

目前有两种移植到Android上的方案。

  • jni,讲bspatch.c稍微改造下,编译成so文件,但是我们这里需要注意的是,因为Android中没有bzip2相关的东西,我们需要将bzip2相关的源码也拿出来。具体参考bzip,源码也可在哪里下载。下载完成之后,将.c和.h等有效文件移植到我们的项目即可。
  • 使用bspatch.c的java翻译版本,tinker中有相关的翻译版本,我们可以使用.java翻译版本 ,我大致看了下,没有对magic进行校验,如果有需要,可自行加上校验,校验规则,参考bspatch.c

总结

  • bsdiff生成的patch包,虽然比完整包小,但是还是比较大。
  • 版本多了之后,难以管理,建议控制在三个版本

如果想了解原理 可以阅读这篇文章,并结合源码进行。

最近访客