Android增量升级这东西很不错,当时我们这运营的人把​​百度​​​的一个管理软件拿过来说他们这个升级包提示可以节省流量是怎么回事,当时各种猜测,难道是有什么特殊算法将包压缩了?特意试了一下压缩,根本大小就没变化~后来开发的人找到是增量升级,文章抛给我研究下。拿过来后发现如果单纯的用命令处理真的很简单,当时想法也是很简单,就是让开发把bspatch这个命令内嵌到Apk包里,反正它不大,但后来我在Android模拟器里试了一下,发现根本不行,在继续看参考的那篇文章,发现下面还有,c++这部分要弄成so包,然后在通过javah 去生成一个中间的class才能执行bspatch(另一个开发研究的,在参考的那篇文章里也有这个处理方法)
bsdiff网站:​​http://www.daemonology.net/bsdiff/​​​
下载bsdiff: ​​百度网盘​​​
windows:
​​​http://sites.inka.de/tesla/download/bsdiff4.3-win32.zip​​​ (32bit)
​​​ http://sites.inka.de/tesla/download/bsdiff4.3-win32-src.zip​​​ (32bit)
linux:
​​​http://www.daemonology.net/bsdiff/bsdiff-4.3.tar.gz​

执行

tar -zxvf bsdiff-4.3.tar.gz
cd bsdiff-4.3

编辑Makefile,因为编译器的问题多数编译会出问题(Makefile:13: *** 遗漏分隔符 。 停止。)
原因是:目标体下一行的,命令要用TAB键开头,且不能隔一行。
也就是说在.ifndef的前面要有TAB开头才可以~因为他是安装的下一个子集命令。
修改文件为:

[root@kinggoo.com bsdiff-4.3]# cat 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

开始编译安装bsdiff和bspatch

[root@kinggoo.com bsdiff-4.3]# make
[root@kinggoo.com bsdiff-4.3]# ls
bsdiff bsdiff.1 bsdiff.c bspatch bspatch.1 bspatch.c Makefile

好了,我们要得到的两个文件bsdiff、bspatch都有了
由于测试一下,所以我就直接传到这台机器上两个apk文件,名为v1.1.apk、v1.0.apk
先来看下当前文件夹内文件信息(因为是测试,所以是直接在bsdiff源码目录下直接操作的)
注意一下,那两个apk文件的大小

[root@kinggoo.com bsdiff-4.3]# ls -l
总计11260-rwxr-xr-x 1 root root 1410205-2814:25 bsdiff
-rw-r--r--11001100222262005-08-17 bsdiff.1-rw-r--r--110011002101072005-08-17 bsdiff.c
-rwxr-xr-x 1 root root 1146305-2814:25 bspatch
-rw-r--r--11001100220382005-08-17 bspatch.1-rw-r--r--11001100259962005-08-17 bspatch.c
-rw-r--r--11001100232405-2814:25Makefile-rwxr-xr-x 1 root root 380533105-2814:53 v1.0.apk-rwxr-xr-x 1 root root 374050405-2814:53 v1.1.apk

v1.0.apk大小3805331(3.8M)
v1.1.apk大小3740504(3.7M)
由于1.1有版本优化,所以反而小了。不用管他,执行如下操作:

[root@kinggoo.com bsdiff-4.3]#./bsdiff v1.0.apk   v1.1.apk diff.patch

格式: bsdiff 上一版本apk包 本版本 对比增量差异部分
通过ls -l查看发现多出 diff.patch文件,大小为1842353(1.8M),用户也就只需要下载这1.8M大小的增量包即可
在使用bspatch,将其增量部分与上一版本包合成

[root@kinggoo.com bsdiff-4.3]#./bspatch v1.0.apk v1.1_diff_patch.apk ./diff.patch

对合成升级版本的apk包及最新版本apk包进行MD5、SHA1效验
md5效验

[root@kinggoo.com bsdiff-4.3]# md5sum  v1.1_diff_patch.apk  #合成包
a7d9af832a5e546e3fdce2d1b29c930e v1.1_diff_patch.apk
[root@kinggoo.com bsdiff-4.3]# md5sum v1.1.apk#原始升级包
a7d9af832a5e546e3fdce2d1b29c930e v1.1.apk

sha1效验

[root@kinggoo.com bsdiff-4.3]# sha1sum  v1.1_diff_patch.apk 
94fe99bc40bab8908bccce70aa6a68c5a4fd11b1 v1.1_diff_patch.apk
[root@kinggoo.com bsdiff-4.3]# sha1sum v1.1.apk94fe99bc40bab8908bccce70aa6a68c5a4fd11b1 v1.1.apk

以上均无问题
最后将合成包安装到2.3.3系统上是没有任何问题!
下步是生成给android应用内调用的.so包,下篇文章会介绍,暂时没时间。

参考资料:
​​javascript:void(0)​​

在这个人写的文章里,看到说有Courgette,更牛,到官网上看发现能达到几倍的压缩率 (​​javascript:void(0)​​ 这里应该是开源出来的代码吧)