四、增量更新

一、原理

    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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 增量更新在Android开发中是一种很常见的技术。 增量更新的原理 增量更新的原理非常简单,就是将本地apk与服务...
    re冷星阅读 5,478评论 3 3
  • @[增量更新,差分包,bsdiff/patch] 背景 随着Android app的不断迭代升级,功能越来越多,a...
    SunYo阅读 15,275评论 2 7
  • 1.概述 1.1.什么是应用增量更新 当我们要更新一个应用的时候,以前很多更新的做法是下载一个新版本去覆盖一个旧版...
    揚灵阅读 8,699评论 8 19
  • 最近就是在练习ndk开发,刚好遇到android增量更新的话题,主要是工具的运用,略带使用第三方so库的流程~~~...
    红黑军团号阅读 3,693评论 1 3
  • 浅黄色的帆布书皮,我在图书馆里随意翻阅,看到了这本小诗集《每个人都是一盏灯》,不知你是否也会因为书名,爱上一本书,...
    喜欢木心的月小溪阅读 3,933评论 -1 2

友情链接更多精彩内容