四、增量更新

一、原理

    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

你可能感兴趣的:(四、增量更新)