一、原理
1、服务端通过bsdiff工具根据新旧版本的apk生成差分包,然后将生成的差分包下发到客户端。差分包的大小会小于等于新旧apk包大小的差。
2、客户端在得到差分包后,通过bspatch工具,将差分包和旧版本的本地安装包合成新的apk包。
3、最后,通过安装新的apk包实现应用的升级。
【Binary diff/patch utility官网】http://www.daemonology.net/bsdiff/
二、步骤
1. 差分(在服务器端进行)
1.1 编译bsdiff生成动态链接库.so/.dll;
/*
* Class: com_fmtech_update_ApkDiff
* Method: diff
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_fmtech_update_ApkDiff_diff
(JNIEnv *env, jclass jazz,jstring oldPath_jst, jstring newPath_jst, jstring patchPath_jst)
{
int argc = 4;
char *argv[4];
char *oldPath = (char*)env->GetStringUTFChars(oldPath_jst, NULL);
char *newPath = (char*)env->GetStringUTFChars(newPath_jst, NULL);
char *patchPath = (char*)env->GetStringUTFChars(patchPath_jst, NULL);
argv[0] = "bsdiff";
argv[1] = oldPath;
argv[2] = newPath;
argv[3] = patchPath;
bsdiff_main(argc, argv);
env->ReleaseStringUTFChars(oldPath_jst, NULL);
env->ReleaseStringUTFChars(newPath_jst, NULL);
env->ReleaseStringUTFChars(patchPath_jst, NULL);
}
VS编译bsdiff动态链接库dll.png
说明:
#1.ApkDiff.h是在Eclipse下生成头文件;
#2.jni.h和jni_md.h是windows环境下的jni相关头文件;
#3.在bsdiff.cpp中引入ApkDiff.h,并实现其中的函数Java_com_fmtech_update_ApkDiff_diff,这个函数最终用于在服务器程序端调用,并生成差分文件;
#4.差分操作的核心函数;
1.2 编写服务器应用程序,在应用程序中加载动态链接库.so/.dll;
ServerBsDiff.png
1.3 Linux下编译bsdiff的.so库;
gcc -fPIC -shared blocksort.c decompress.c bsdiff.c randtable.c bzip2.c huffman.c compress.c bzlib.c crctable.c -o ApkDiff.so
生成的linux下动态库( 在服务器的后台可以直接使用,安卓客户端不能直接用 )。
2. 合并 (在客户端进行)
2.1 编译bspatch动态库到项目中。
bispatch.png
说明:
#1.编译BsPatch.so需要的源文件和头文件;
#2.com.fmtech.incrementalupdate.BsPatch生成的对应的头文件。
2.2 CMakeList.txt配置
cmake_minimum_required(VERSION 3.4.1)
file(GLOB my_c_path src/main/cpp/bzip2/*.c)
add_library(
BsPatch
SHARED
${my_c_path}
src/main/cpp/bspatch.c )
find_library(
log-lib
log )
target_link_libraries(
BsPatch
${log-lib} )
2.3、客户端获取差分包,合并,安装的逻辑
patchLogic.png
【相关源码】
Android:https://github.com/ChiangC/NDK/tree/master/IncrementalUpdate
C++:https://github.com/ChiangC/NDK/tree/master/IncrementalUpdateDiff/IncrementalUpdateDiff
Java:https://github.com/ChiangC/NDK/tree/master/IncrementalUpdateServer
网友评论