上次说到微软windows平台下bsdiff的运用,而我们服务器一般都是linux系统,今天来搭建自己的服务器,并且在linux平台下增量更新的文件差分操作;最后在安卓应用中下载服务器差分文件,将旧APK和差分文件合并,实现增量更新
1.环境配置
首先需要有一个linux服务器,我这边使用的是一个装载了CentOS的虚拟机,所以后续操作都需要在同一个网络下面。
环境配置分为2步:1:安装JDK 2:安装tomcat
1.安装JDK,在命令行输入以下命令
yum install java-1.8.0-openjdk-devel.x86_64
2.安装tomcat
安装教程:https://blog.csdn.net/zhaoyanjun6/article/details/79131856
注意:tomcat需要使用8080端口,防火墙可能会禁用该端口,最快解决方法:直接关闭防火墙
systemctl stop firewalld.service
2.下载linux平台下的bsdiff,并放入linux服务器中
bsdiff:http://www.daemonology.net/bsdiff/
bzip:http://www.bzip.org/downloads.html(需要翻墙)
我这边将bzip上传到了网盘:https://pan.baidu.com/s/1TJcU9cxY50ok0chcHkc7Og 提取码:jcd1
将解压后的两个文件夹中所有的.c .cpp .h文件复制到一个文件夹中
将所有文件拖入notepad++,重命名所有main方法,因为我们是要java调用c/c++方法,c/c++生成的只是动态链接库,含有main方法会报错
修改完成后将这些文件上传到服务器,我这边是利用sftp
使用gcc编译
gcc -fPIC blocksort.c decompress.c bsdiff.c randtable.c bzip2.c huffman.c compress.c bzlib.c crctable.c -o bsDiff
把之前两个apk文件传入服务器后,执行差分操作
执行:
./bsDiff oldApk.apk newApk.apk apk.patch
接下来是安卓中使用bspatch对文件进行合并
将.c和.h文件入NDK工程
编写native方法,并最终调用bspatch方法
package com.dn.tim.dntimlsn12bspatch;
public class BsPatch {
public native static int patch(String oldfile, String newFile, String patchFile);
static {
System.loadLibrary("TimBisPatch");
}
}
/*
* Class: com_dn_tim_dntimlsn12bspatch_BsPatch
* Method: patch
* Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I
*/
JNIEXPORT jint JNICALL Java_com_dn_tim_dntimlsn12bspatch_BsPatch_patch
(JNIEnv *env, jclass jazz, jstring oldPath_jstr, jstring newPath_jstr, jstring patchPatch_jst) {
int ret= -1;
LOGD(" jni patch begin");
char *oldPath = (*env) -> GetStringUTFChars(env, oldPath_jstr, JNI_FALSE);
char *newPath = (*env) -> GetStringUTFChars(env, newPath_jstr, JNI_FALSE);
char *patchPath = (*env) -> GetStringUTFChars(env, patchPatch_jst, JNI_FALSE);
int argc = 4;
char *argv[4];
argv[0] = "TimBsPatch";
argv[1] = oldPath;
argv[2] = newPath;
argv[3] = patchPath;
//如果成功ret等于0
ret = bspatch_main(argc,argv);
(*env) -> ReleaseStringUTFChars(env, oldPath_jstr, oldPath);
(*env) -> ReleaseStringUTFChars(env, newPath_jstr, newPath);
(*env) -> ReleaseStringUTFChars(env, patchPatch_jst, patchPath);
return ret;
}