Bootstrap

java bsdiff_Android增量更新从入坑到成功

流程step1 使用bsdiff生成差异包PATCH.patch

step2 在手机上合并base包和差异包,生成新版本的安装包

step3 安装新的安装包

准备bsdiff-4.3 (用于生成差异包,合并新包)

bzip2 (bsdiff要使用到)

试验step1 解压bsdiff4.3的压缩包

step2 修改Makefile文件,将.ifndef和.endif缩进,要么无法进行后面的操作CFLAGS      +=  -O3 -lbz2

PREFIX      ?=  /usr/localINSTALL_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

.endifstep3 在该文件夹的命令行里执行make命令,会生成bsdiff和bspatch两个可执行的文件。如果是从上面的地址下载的bsdiff的话,会爆出bspatch.c:39:21: error: unknown type name 'u_char'; did you mean 'char'?这样的错误。这是由于bspatch.c中缺少了#include ,加上即可。然后执行make命令。bogon:bsdiff-4.3 Tony$ make

cc -O3 -lbz2    bsdiff.c   -o bsdiff

cc -O3 -lbz2    bspatch.c   -o bspatchstep4 准备两个同一签名的apk,old.apk和.apk,放在bsdiff-4.3解压后的文件夹里。

step5 使用bsdiff生成差异文件PATCH.patch,命令格式:bsdiff oldfile newfile patchfile(这一步操作可以放在服务端来执行)bogon:bsdiff-4.3 Tony$ ./bsdiff old.apk new.apk PATCH.patch

-step6 使用bspatch合成新的apk,dest.apk。命令格式:bspatch oldfile newfile patchfilebogon:bsdiff-4.3 Tony$ ./bspatch old.apk  dest.apk PATCH.patchstep7 验证生成的dest.apk和之前的new.apk使用一样,验证两个apk的md5值,即可。bogon:bsdiff-4.3 Tony$ md5 new.apk

MD5 (new.apk) = 55005cec2de8ad3668a0fd5bd8746f43

bogon:bsdiff-4.3 Tony$ md5 dest.apk

MD5 (dest.apk) = 55005cec2de8ad3668a0fd5bd8746f43

bogon:bsdiff-4.3 Tony$ md5 old.apk

MD5 (old.apk) = 822cc0938694008089ea5523f86585d7

bogon:bsdiff-4.3 Tony$

在Android中使用增量更新

ndk部分step1 新建一个PatchUtils的类,用于调用native的方法public class PatchUtils {    static PatchUtils instance;    public static PatchUtils getInstance() {        if (instance == null) {

instance = new PatchUtils();

}        return instance;

}    static {

System.loadLibrary("patchutils");

}    /**

* native方法 使用路径为oldApkPath的apk与路径为patchPath的补丁包,合成新的apk,并存储于newApkPath

* 返回:0,说明操作成功

*

* @param oldApkPath 示例:/sdcard/old.apk

* @param newApkPath 示例:/sdcard/new.apk

* @param patchPath  示例:/sdcard/xx.patch

* @return

*/

public static native int bspatch(String oldApkPath, String newApkPath, String patchPath);

}step2 使用javah命令生成PatchUtils的头文件,或者使用ndk-build里的javah生成头文件。会在jni文件夹下生成一个com_bigademo_updatedemo_PatchUtils.h的文件,其中com_bigademo_updatedemo是我的包名。

step3 将bsdiff4.3文件夹中的bspatch.c文件导入到jni文件夹下。

step

;