JNI——增量更新

bspatch 官网:http://www.daemonology.net/bsdiff/

bzip2 官网:http://www.bzip.org/

流程:客服端会请求网络把vesioncode 发送给服务端,然后服务端根据vesioncode 判断需不需要更新,如果要更新就使用新的包(new.apk)和 老包(old.apk)生成一个差分包(apk.patch),客服端在下载这个apk.patch,和本地old.pak合并得到一个new.apk。

服务器有可能是windows环境的也有可能是linux环境的。

windows环境的差分:

1、生成windows 的差分工具

从官网下载windows环境的bsdiff(可能会打不开)


解压下载下来的bsdiff,已经有编译好的diff.exe和patch.exe(做差分和合并用的),但是我们要的是一个动态库(dll动态库),所以我们自己生成一个动态库。

第一步:首先使用Visual Studio 新建一个C++的空项目

JNI——增量更新_第1张图片

第二步:然后在项目中新建两个文件夹


JNI——增量更新_第2张图片

include放头文件,src中放源文件


JNI——增量更新_第3张图片

把绿色的头文件拷入include,红框的源文件拷入src文件,因为是生成差分工具所以只需要bsdiff.cpp,如果要生成合并工具只要bspatch.cpp,他们二者只能取其一。其他.c文件都需要。


JNI——增量更新_第4张图片

右键源文件——》添加——》现有项,然后选择src里面的源文件,头文件也是这样操作。

然后有点C_Diff ——》属性——》C/C++——》常规——》附加包含目录——》编辑——》选择inculde目录(这个是解决bsdiff.cpp中头文件出错的问题)

准备好这些赶紧编译吧,结果一堆错误。。。

第三部:解决错误,先把警告去掉:右键C_Diff ——》属性——C/C++——》预处理器——》预处理器定义,把_CRT_SECURE_NO_WARNINGS拷贝进去。

继续编译 只有两个错误了。


这是错误是安全检查,并不是代码问题。

右键C_Diff ——》属性——C/C++——》常规——》SDL检查  把是改成否。

第三步:右键C_Diff ——》属性——》配置类型 由应用程序(.exe)改为动态库(.dll)

第四步:编写JNI代码,eclipse新建一个服务器项目,创建一个类,一个native的差分方法,生成头文件。

然后把头文件拷入刚才的Visual Studio项目的include里面,同样的添加现有项,然后再把jni.h和jni_md.h两个头文件也拷进去(主意这里是生成windows平台的差分工具,所以jni.h和jni_md.h要在windows版本的NDK中拷贝)。

第五步:把都文件中的方法diff复制到bsdiff.cpp中,别忘了导入头文件,然后就可以编写JNI了。

把bsdiff.cpp中的main方法改名叫bsdiff_main了

JNI——增量更新_第5张图片

生成解决方案得到一个dll动态库,拷贝到项目中就可以用啦。

linux 生成差分包:

使用ftp把上面说到的那些C文件都上传到linux环境的文件中,

修改C文件中的main方法(随便起个名字)bsdiff.c除外,然后执行

gcc -fPIC -shared blocksort.c bzip2.c bsdiff.c bzlib.c 。。。-o  mik.so就能得到linux环境下的so库了,只能在服务器中使用,安卓客户端不能直接使用。

具体的上传 后面的shell脚本会讲

Android 客户端生成合并包:

把下载的linux环境的bsdiff包和bzip2包解压,把bsdiff包中的bspatch.c和bzip2中的所有.c文件和.h文件都复制到Android Studio项目中(main/cpp下),别忘记修改c文件中的main方法(其实dlltest.c、mk251.c、spewG.c、unzcrash.c、bzip2recover.c没有用到)把bsdiff.c中的#include改为#include "bzlib.h"

然后就开始写JNI方法了。

JNI——增量更新_第6张图片

因为在data/app目录中会有本地的APK(除非root之后删除),所以不用担心本地没有旧的apk。

源码

你可能感兴趣的:(JNI——增量更新)