Android增量更新的实现(一)

来源:互联网 发布:刺客信条黑旗帧数优化 编辑:程序博客网 时间:2024/06/05 10:37

首先我们来了解一下什么是增量更新:

在前几年,整体移动网络环境相比现在差很多,加之流量费用又相对较高,因此每当我们发布新版本的时候,一些用户升级并不是很积极,这就造成了新版本的升级率并不高。

增量更新的关键在于如何理解增量一词。来想想平时我们的开发过程,往往都是今天在昨天的基础上修改一些代码,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 __cplusplusextern "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了。

下一篇文章会讲解如何在移动端实现合并增量包更新升级的功能!

原创粉丝点击