前言
大家应该都有注意到,各大应用市场都在使用增量升级的技术。那么,今天,就来记录下,bsdiff和bspatch。
尝试
我们先去Binary diff/patch utility 中,把相关的资源下载下来,下载下来之后,我们进行编译,在编译之前,我们需要修改一点东西。
Makefile文件修改成如下:
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文件,增加如下代码:
typedef unsigned char u_char;
然后就可以进行编译了。
make
编译完成之后,我们就能进行初次尝试了。
首先我们用as,生成两个新旧的apk,old.apk new.apk
然后,我们终端进入bsdiff的目录,执行如下命令生成patch包。
#命令格式 bsdiff: usage: ./bsdiff oldfile newfile patchfile
./bsdiff old.apk new.apk patch.apk
然后,我们再用旧的apk和patch包,生成新的new.apk
#命令格式 bspatch: usage: ./bspatch oldfile newfile patchfile
./bspatch old.apk new_patch.apk patch.apk
最后,我们验证下new.apk 和我们生成的new_patch.apk的md5值和sha值
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包,虽然比完整包小,但是还是比较大。
- 版本多了之后,难以管理,建议控制在三个版本
如果想了解原理 可以阅读这篇文章,并结合源码进行。