美文网首页
Android 增量更新实现(Bsdiff)

Android 增量更新实现(Bsdiff)

作者: 蓝胖子_Android | 来源:发表于2017-10-10 09:56 被阅读0次

一,增量更新的原理,主要是根据新旧包生成差分包,这个差分包由服务器端生成,客户端下载,下载完成后,进行合并,合并成功后通知用户进行安装。

二,如何生成差分包:

一般来说,这个不需要客户端关心,这个由后台开发人员去实现,现在比较流行的开源项目,bsdiff。 里面有两个核心的文件,一个Bsdiff.c和Bspatch.c,Bsdiff.c给后台生成差分包,Bspatch.c给客户端合并这个差分包。

三,具体实现(只实现Bspatch部分,Bsdiff主要是服务器端使用,感兴趣的同学可以自己研究,本文不作解释)

第一步:从http://www.daemonology.net/bsdiff/下载后解压文件,到文件目录中.其中依赖的bzip2也要copy到Jni目录中,如图:

第二步:编写mk文件:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := bspatch

LOCAL_SRC_FILES := bspatch.c

include $(BUILD_SHARED_LIBRARY)

第三步:定义java层本地方法:

public classBsPatch {

/**

* 合并

*

*@paramoldfile

*@paramnewfile

*@parampatchfile

*/

public native static voidpatch(String oldfile,String newfile,String patchfile);

static{

System.loadLibrary("bspatch");

}

}

第四步:生成头文件,并实现这个方法:

//合并

JNIEXPORTvoidJNICALLJava_xm_bsdiff_BsPatch_patch

(JNIEnv*env,jclassjcls,jstringoldfile_jstr,jstringnewfile_jstr,jstringpatchfile_jstr){

intargc =4;

char* oldfile = (char*)(*env)->GetStringUTFChars(env,oldfile_jstr,NULL);

char* newfile = (char*)(*env)->GetStringUTFChars(env,newfile_jstr,NULL);

char* patchfile = (char*)(*env)->GetStringUTFChars(env,patchfile_jstr,NULL);

__android_log_print(ANDROID_LOG_ERROR,"HelloJni","oldfile*%s",oldfile);

__android_log_print(ANDROID_LOG_ERROR,"HelloJni","newfile*%s",newfile);

__android_log_print(ANDROID_LOG_ERROR,"HelloJni","patchfile*%s",patchfile);

//参数(第一个参数无效)

char*argv[4];

argv[0] ="bspatch";

argv[1] = oldfile;

argv[2] = newfile;

argv[3] = patchfile;

//特别注意,bspatch.c文件没有bspatch_main方法,把main方法改成bspatch_main即可

bspatch_main(argc,argv);

__android_log_print(ANDROID_LOG_ERROR,"HelloJni","bspatch_main*%s","bspatch_main");

(*env)->ReleaseStringUTFChars(env,oldfile_jstr,oldfile);

(*env)->ReleaseStringUTFChars(env,newfile_jstr,newfile);

(*env)->ReleaseStringUTFChars(env,patchfile_jstr,patchfile);

}

第五步,编译,生成so动态库。然后可以直接调用这个动态库的方法。

//1.下载差分包

Log.d("jason","开始合并");

//获取当前应用的apk文件/data/app/app

String oldfile = ApkUtils.getSourceApkPath(MainActivity.this,getPackageName());

//2.合并得到最新版本的APK文件

String newfile = Constants.NEW_APK_PATH;

String patchfile = Constants.PATCH_FILE;

BsPatch.patch(oldfile,newfile,patchfile);

Log.d("jason","oldfile:"+oldfile);

Log.d("jason","newfile:"+newfile);

Log.d("jason","patchfile:"+patchfile);

Toast.makeText(MainActivity.this,"您正在进行无流量更新",Toast.LENGTH_SHORT).show();

//合并完成后安装。

ApkUtils.installApk(MainActivity.this,Constants.NEW_APK_PATH);

相关文章

  • Android 增量更新实现(Bsdiff)

    一,增量更新的原理,主要是根据新旧包生成差分包,这个差分包由服务器端生成,客户端下载,下载完成后,进行合并,合并成...

  • centos7安装bsdiff

    centos7安装bsdiff bsdiff是一个差异包比较工具,可以用来实现增量更新. 安装bsdiff 参考链...

  • bsdiff实现增量更新

    概述 在目前的大部分热门应用中(QQ、微信、抖音等)都包含了一个名称类似libbspatch.so 的动态库。 可...

  • Android 增量更新

    Android 增量更新 首先通过bsdiff 生成patch包 bspatch生成新的APK: 无论是windo...

  • Android_增量更新(BSDiff)

    Android中的增量更新指的是利用差分算法,计算两个App版本的差异,生成差分包,只需要下载差分包,不需要下载整...

  • Android增量更新(bsdiff使用)

    简单了解 增量更新是什么?APP版本更新时不需要客户端下载新的apk,只需要下载差分包(两个apk的差异)。 差分...

  • Android应用增量更新/升级方案

    @[增量更新,差分包,bsdiff/patch] 背景 随着Android app的不断迭代升级,功能越来越多,a...

  • bsdiff 编译与运行

    bsdiff是一个差异包比较工具,可以用来实现增量更新. 1.mac解压下载的bsdiff-4.3.tar.gz ...

  • 增量更新之服务器端解决方案

    准备工作: 增量更新开源库:http://www.daemonology.net/bsdiff/bsdiff还依赖...

  • 增量更新之APP端解决方案

    准备工作: 增量更新开源库:http://www.daemonology.net/bsdiff/bsdiff还依赖...

网友评论

      本文标题:Android 增量更新实现(Bsdiff)

      本文链接:https://www.haomeiwen.com/subject/fttvyxtx.html