首先我们来了解一下什么是增量更新:
在前几年,整体移动网络环境相比现在差很多,加之流量费用又相对较高,因此每当我们发布新版本的时候,一些用户升级并不是很积极,这就造成了新版本的升级率并不高。
增量更新的关键在于如何理解增量一词。来想想平时我们的开发过程,往往都是今天在昨天的基础上修改一些代码,app的更新也是类似的:往往都是在旧版本的app上进行修改。这样看来,增量更新就是原有app的基础上只更新发生变化的地方,其余保持原样。
与原来每次更新都要下载完整apk包的做法相比,这样做的好处显而易见:每次变化的地方总是比较少,因此更新包的体积就会小很多。比如安装包的体积在6m左右,如果不采用增量更新,用户每次更新都需要下载大约6m左右的安装包,而采用增量更新这种方案之后每次只需要下载小于6m的更新包即可,相比原来做法大大减少了用户下载等待的时间。
我们需要用到的框架以及工具:
1.BsDiff(依赖与bzip2)
2.Bzip2(一种压缩算法)
如何现实:
增量跟新包含两个功能实现:一个是在新版本文件与旧版本文件对比之后生成增量更新patch(这个功能是在服务器端进行的),另外一个是旧版本的文件与增量更新patch合并生成一个新版本的文件进行升级(这个功能是在移动端进行的)
服务器端:
由于我们是在windows上实现服务端的功能,所以需要下载win32-src的源码,我们把源码下载之后,把需要用到的源码跟头文件解压出来,在vs中新建项目,由于服务端只用到了bsdiff功能,所以暂时不需要bspatch。
然后我们需要在eclipse中新建java项目
package com.jason.bsdiff;
public class BsDiff {
public static native void diff(String oldfile, String newfile, String patchfile);
static{
System.loadLibrary("Bsdiff");
}
}
利用javah命令生成JNI头文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_jason_bsdiff_BsDiff */
#ifndef _Included_com_jason_bsdiff_BsDiff
#define _Included_com_jason_bsdiff_BsDiff
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_jason_bsdiff_BsDiff
* Method: diff
* Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_com_jason_bsdiff_BsDiff_diff
(JNIEnv *, jclass, jstring, jstring, jstring);
#ifdef __cplusplus
}
#endif
#endif
我们把JNI的头文件拷贝到vs项目中,并且在bsdiff.cpp中引入JNI头文件,添加实现
JNIEXPORT void JNICALL Java_com_jason_bsdiff_BsDiff_diff
(JNIEnv *env, jclass jcls, jstring oldfile_jstr, jstring newfile_jstr, jstring patchfile_jstr){
int argc = 4;
char* oldfile = (char*)env->GetStringUTFChars(oldfile_jstr, NULL);
char* newfile = (char*)env->GetStringUTFChars(newfile_jstr, NULL);
char* patchfile = (char*)env->GetStringUTFChars(patchfile_jstr, NULL);
//参数(第一个参数无效)
char *argv[4] = { "bsdiff", oldfile, newfile, patchfile };
bsdiff_main(argc, argv);
env->ReleaseStringUTFChars(oldfile_jstr, oldfile);
env->ReleaseStringUTFChars(newfile_jstr, newfile);
env->ReleaseStringUTFChars(patchfile_jstr, patchfile);
}
在vs工具栏点击生成解决方案 (x64生成dll),我们可以在相应的文件夹下得到Bsdiff.dll动态库,大功告成,这个dll动态库就相当于linux下的so文件,只不过现在我们实在windows环境下编译的,那么我们要如何使用这个dll库呢。其实很简单,跟so文件没有任何区别,拷贝到Eclipse中的java项目目录下,创建Main方法,在方法中直接调用Bsdiff
package com.jason.bsdiff;
public class BaDiffTest {
public static void main(String[] args) {
//BsDiff.diff(ConstantsWin.OLD_APK_PATH, ConstantsWin.NEW_APK_PATH, ConstantsWin.PATCH_PATH);
BsDiff.diff("E:/hitv/apk/HitvShellDemo_old.apk",
"E:/hitv/apk/HitvShellDemo_new.apk",
"E:/hitv/apk/apk.patch");
}
}
就会在指定的目录下生成一个apk.patch的文件,这个文件就是我们所说的增量更新patch了。
下一篇文章会讲解如何在移动端实现合并增量包更新升级的功能!