androidstudio实现增量更新步骤

 本文demo和参考例子参考-传送  门:http://blog.csdn.net/duguang77/article/details/17676797

一.增量更新优点:节省客户端和服务器端流量

  增量更新和热修复是不同的两个技术

 学习要求:学会jni相关操作,例如androidstudio如何生成和应用.so文件

 这里有.so文件的生成和应用的简单介绍  http://www.cnblogs.com/mrszhou/p/6859137.html

二.增量更新原理-APK的查分合成

  差分包:比如old.apk(大小是4M)要升级到new.apk(大小是10M),在服务器(或者手动生成old-new.patch(差分包的大小是6M)

       开源工具

    bsdiff下载http://www.daemonology.net/bsdiff/ 
    bzip2下载http://www.bzip.org/downloads.html 

     bsdiff:  

     bsdiff.c      二进制比较代码生成差分包.patch用的  在命令窗口生成patch用的命令 ./bsdiff old.apk new.apk old-to-new.patch

     bspatch.c   二进制文件合成代码合成新apk用的   在命令窗口合成新apk用的命令./bspatch old.apk new2.apk old-to-new.patch

     bzip2:放到客户端的jni包里面的文件有以下13个:

       blocksort.c   bzip2.c   bzip2recover.c  bzlib_private.h  bzlib.c  bzlib.h  compress.c  crctable.c   decompress.c   dlltest.c  huffman.c  randtable.c   spewG.c  

            在生成.so文件的时候可能报错:Error:(70) multiple definition of `main'

         这时候把报错的main函数的名字改成main1,main2等等就行了

  1.在服务端生成新旧apk的差分包

 (注意:要生成每个旧版本和新版本的差分包,根据客户端传过来该客户端当前的VersionCode来查找服务端是否有该版本和新客户端的差分包,

  如果没有的话就生成差分包)

  例如:

     1.0->4.0  生成1.0和4.0的差分包;

     2.0->4.0  生成2.0到4.0的差分包

  2.在客户端使用已经安装的旧版apk,使用已安装的旧版apk和old-new.patch合成新apk

  3.对比合成的apk的签名、md5是否一样,一样的话就能提示安装

三.客户端实现

  服务端上面传送门有demo例子下载

  客户端:按照http://www.cnblogs.com/mrszhou/p/6859137.html这里生成jni包内的example.h文件,再复制.h文件到jni包里面,改文件类型为example.c   文件

 

 并在该文件的native函数内编写

  

JNIEXPORT jint JNICALL Java_service_update_app_myzenglianupdate_MainActivity_zengliangu
  (JNIEnv* env,object othis, jstring argv1, jstring argv2, jstring argv3){
   char ** argv;
    int loopVar,result;

    //__android_log_print(ANDROID_LOG_INFO, "bspatch.c", "开始打包之。。。。。。");
    argv = (char**) malloc(4 * sizeof(char*));
    for (loopVar = 0; loopVar < 4; loopVar++) {
        argv[loopVar] = (char*) malloc(100 * sizeof(char));
    }
    argv[0] = "bspatch";
    argv[1] = (*env)->GetStringUTFChars(env, argv1, 0);
    argv[2] = (*env)->GetStringUTFChars(env, argv2, 0);
    argv[3] = (*env)->GetStringUTFChars(env, argv3, 0);

    result=bspatch(argv);

    //Important:释放内存,防止内存泄露
    (*env)->ReleaseStringUTFChars(env, argv1, argv[1]);
    (*env)->ReleaseStringUTFChars(env, argv2, argv[2]);
    (*env)->ReleaseStringUTFChars(env, argv3, argv[3]);
    return result;

  };

  然后在app/src/mian内新建jniLibs包,在包生成的.so文件拖进去

 

  

 这些步骤是在前人的例子里自己亲自学习过程中,.so文件的生成和NDK的版本,报错很多,基本生成.so文件后面的就简单很多

 

原文地址:https://www.cnblogs.com/mrszhou/p/6859176.html