Android增量更新的实现(一)

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值