美文网首页
四、增量更新

四、增量更新

作者: ChiangCMBA | 来源:发表于2018-04-07 23:11 被阅读0次

    一、原理

        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

    相关文章

      网友评论

          本文标题:四、增量更新

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