概述
在应用中做增量更新,一般都会这样做,提示用户升级(也就是下载差分包),当用户下载了差分包后,将当前版本和差分包合并成最新版本,然后提醒用户安装新版本的apk。
上一篇中通过bsdiff的win版已经可以将两个版本的apk差分出差分包,然后将差分包放到服务器中,提示用户下载即可。
下载好差分包后,需要将旧版本的apk和差分包合并起来,这就用到了bsdiff,而bsdiff依赖于bzip2。直接到网上下载bsdiff和bzip2就行。
步骤
1.将bsdiff和bzip下的文件拷贝到项目中
新建android项目,然后下载 bsdiff解压后,将其中的bspatch.c复制到项目中的jni目录下,由于bsdiff是依赖bzip2的,所以需要下载bzip2,解压并将其包下的所有的c文件和.h文件复制到jni的bzip2目录下.
2.修改bspatch.c
修改bspatch.c的头文件引用,将bzip2下的所有c文件都引用过来。这里引用的是是.c文件而不是.h文件,如果要引用.h文件也是可以的,但需要在Android.mk下将所有的c文件配置,否则编译通不过。
//将bzip2中的所有c都引入到文件中
#include "bzip2/bzlib.c"
#include "bzip2/crctable.c"
#include "bzip2/compress.c"
#include "bzip2/decompress.c"
#include "bzip2/randtable.c"
#include "bzip2/blocksort.c"
#include "bzip2/huffman.c"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <err.h>
#include <unistd.h>
#include <fcntl.h>
仔细阅读 bspatch.c 的源码
int bspatch_main(int argc,char * argv[])
{
...
if(argc!=4) errx(1,"usage: %s oldfile newfile patchfile\n",argv[0]);
...
}
在bspatch.c中可以做合并的方法,就是int main方法,可以看到其中的参数,和差分时的差不多,这就可以看出,如果你上回的差分做了,这次合并做法是同样的,将main修改为bspatch_main。
3.编写native方法
根据bspatch中的方法,java中可以提供这样的native方法
public class PatchUtil {
/**
* 合并
* @param oldApkPath 老apk路径
* @param newApkPath 合并成新的apk路径
* @param diffPath 差分包
*/
public