1. title: Android NDK之增量更新

1.增量更新使用到的库bsdiff和bzip2

bsdiff库是一个开源的二进制差分工具,通过对比Apk的二进制,从而进行差分包的生成。

bsdiff库可以参考官网:bsdiff

下载地址:已经将用到的bsdiff和bzip上传到百度云


2.AS创建项目,并导入头文件

本项目使用Android Studio,通过cmake进行编译。

新建一个工具类,进行差分包的生成及合并

Diffutils

  1. public class Diffutils {
  2. static {
  3. System.loadLibrary("native-lib");
  4. }
  5. /**
  6. * @param oldPath 旧的安装包路径
  7. * @param newPath 新的安装包路径
  8. * @param patchPath 差分包路径
  9. * @return 生成的结果
  10. */
  11. public static native int generateDiffApk(String oldPath, String newPath, String patchPath);
  12. /**
  13. * @param oldPath 旧的安装包路径
  14. * @param newPath 新的安装包路径
  15. * @param patchPath 差分包路径
  16. * @return 生成的结果
  17. */
  18. public static native int mergeDiffApk(String oldPath, String newPath, String patchPath);
  19. }

导入bsdiff和bzip2的头文件以及.c文件

)

将生成的.cpp文件改成.c文件。为什么要修改成.c文件?主要是因为c和c++对void * malloc这个函数编译不同,c中不用将结果强制转换成类型* ,而c++则不同,它必须要将结果强制转换成类型*。我们使用到的bsdiff库和bzip2库好多地方都使用了malloc函数,如果使用c++编译会报大量的错误,因此我们采用c编译。

修改了cpp文件我们不要忘记在CMakeList中进行更新以及导入新的文件

CMakeList.txt

  1. # Sets the minimum version of CMake required to build the native
  2. # library. You should either keep the default value or only pass a
  3. # value of 3.4.0 or lower.
  4. cmake_minimum_required(VERSION 3.4.1)
  5. # Creates and names a library, sets it as either STATIC
  6. # or SHARED, and provides the relative paths to its source code.
  7. # You can define multiple libraries, and CMake builds it for you.
  8. # Gradle automatically packages shared libraries with your APK.
  9. add_library( # Sets the name of the library.
  10. native-lib
  11. # Sets the library as a shared library.
  12. SHARED
  13. # Provides a relative path to your source file(s).
  14. # Associated headers in the same location as their source
  15. # file are automatically included.
  16. src/main/cpp/native-lib.c )
  17. #include src/main/cpp/include目录下的所有文件
  18. include_directories(src/main/cpp/include)
  19. # Searches for a specified prebuilt library and stores the path as a
  20. # variable. Because system libraries are included in the search path by
  21. # default, you only need to specify the name of the public NDK library
  22. # you want to add. CMake verifies that the library exists before
  23. # completing its build.
  24. find_library( # Sets the name of the path variable.
  25. log-lib
  26. # Specifies the name of the NDK library that
  27. # you want CMake to locate.
  28. log )
  29. # Specifies libraries CMake should link to your target library. You
  30. # can link multiple libraries, such as libraries you define in the
  31. # build script, prebuilt third-party libraries, or system libraries.
  32. target_link_libraries( # Specifies the target library.
  33. native-lib
  34. # Links the target library to the log library
  35. # included in the NDK.
  36. ${log-lib} )

3. 差分方法以及合并方法的实现

差分的方法在bsdiff.c的main函数已经实现,但是我们为了区分差分方法和合并方法我将main函数修改成generateDiffApk。同理合并方法在bspatch中已经实现,我将其main函数修改成mergeDiffApk

native-lib.c

  1. #include <jni.h>
  2. #include "include/bsdiff.c"
  3. #include "include/bspatch.c"
  4. JNIEXPORT jint JNICALL
  5. Java_com_nick_bsdiff_Diffutils_generateDiffApk(JNIEnv *env, jclass type, jstring oldPath_,
  6. jstring newPath_, jstring patchPath_) {
  7. int argc = 4;
  8. char *argv[argc];
  9. argv[0] = (char *) "bspatch";
  10. argv[1] = (char *) (*env)->GetStringUTFChars(env, oldPath_, 0);
  11. argv[2] = (char *) (*env)->GetStringUTFChars(env, newPath_, 0);
  12. argv[3] = (char *) (*env)->GetStringUTFChars(env, patchPath_, 0);
  13. jint result = generateDiffApk(argc, argv);
  14. (*env)->ReleaseStringUTFChars(env, oldPath_, argv[1]);
  15. (*env)->ReleaseStringUTFChars(env, newPath_, argv[2]);
  16. (*env)->ReleaseStringUTFChars(env, patchPath_, argv[3]);
  17. return result;
  18. }
  19. JNIEXPORT jint JNICALL
  20. Java_com_nick_bsdiff_Diffutils_mergeDiffApk(JNIEnv *env, jclass type, jstring oldPath_,
  21. jstring newPath_, jstring patchPath_) {
  22. int argc = 4;
  23. char *argv[argc];
  24. argv[0] = (char *) "bspatch";
  25. argv[1] = (char *) (*env)->GetStringUTFChars(env, oldPath_, 0);
  26. argv[2] = (char *) (*env)->GetStringUTFChars(env, newPath_, 0);
  27. argv[3] = (char *) (*env)->GetStringUTFChars(env, patchPath_, 0);
  28. printf("old apk = %s \n", argv[1]);
  29. printf("patch = %s \n", argv[3]);
  30. printf("new apk = %s \n", argv[2]);
  31. jint result = mergeDiffApk(argc, argv);
  32. (*env)->ReleaseStringUTFChars(env, oldPath_, argv[1]);
  33. (*env)->ReleaseStringUTFChars(env, newPath_, argv[2]);
  34. (*env)->ReleaseStringUTFChars(env, patchPath_, argv[3]);
  35. return result;
  36. }

4.效果展示

旧版本:

生成的差分包(app3.patch):

合并后的新的安装包(app1):

安装后:


5.项目地址

我将完整项目上传到了GitHub上,有兴趣的可以点击这里进入

Android 增量更新的更多相关文章

  1. Android 增量更新(BSDiff / bspatch)

    Android 增量更新 BSDiff / bspatchhttp://www.daemonology.net/bsdiff/android的代码目录下 \external\bsdiff bsdiff ...

  2. Android 增量更新研究

    Android 增量更新实例(Smart App Updates) http://blog.csdn.net/duguang77/article/details/17676797 Android AP ...

  3. 一句话的Android增量更新框架(增量更新)

    转自:http://www.jianshu.com/p/a9ec8fa780e2 Android应用更新要使用完整的新版本Apk安装,增量更新则是提供一个新旧版本偏差数据的patch包供应用下载,然后 ...

  4. Android 增量更新实例(Smart App Updates)

    原地址:http://my.oschina.net/liucundong/blog/160436 官方说明 实现原理 实现 (1)生成差异包 (2)使用旧apk+差异包,在客户端合成新apk 注意事项 ...

  5. Android 增量更新完全解析 是增量不是热修复(转)

    转自:http://blog.csdn.net/lmj623565791/article/details/52761658 本文在我的微信公众号:鸿洋(hongyangAndroid)首发. 转载请标 ...

  6. Android 增量更新和升级

    在年初的时候,尝试了一把热修复技术,当时选择的是阿里的andfix,使用起来也很简单,这里就不在多少,如果你对andfix有兴趣请链接:点击打开链接.虽然网上将热修复的文章很多,不过我还是想说原理,然 ...

  7. android 增量更新原理

    原理如下:服务器端设计增量表,记录数据操作顺序id,和增删改查信息.在进行数据库表操作的时候同时进行将信息保存在增量表. android客户端在请求的时候上传最后保存的id.服务端判断最后的id,返回 ...

  8. Android增量更新

    http://blog.csdn.net/tu_bingbing/article/details/8538592 (转)

  9. android studio增量更新

    一.概述 1.1 概念 增量更新即是通过比较 本机安装版本 和 想要安装版本 间的差异,产生一个差异安装包,不需要从官网下载并安装全量安装包,更不需要将本机已安装的版本下载,而仅仅只是安装此差异安装包 ...

随机推荐

  1. bzoj2049

    2049: [Sdoi2008]Cave 洞穴勘测 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 7579  Solved: 3548[Submit] ...

  2. Jenkins搭建Windows slave 环境

      因为之前的接口测试平台是在windows上,后来换了linux,花了半天时间也没有成功,就想着建立一个windows的节点曲线救国   创建WindowsSlave 首先要保证windows和sl ...

  3. Zepto.js入门介绍

    GitHub Zepto Zepto的一些可选功能是专门针对移动端浏览器的:因为它的最初目标在移动端提供一个精简的类似jquery的js库. Zepto不支持旧版本的Internet Explorer ...

  4. Angular - - form.FormController、ngModel.NgModelController

    form.FormController FormController跟踪所有他所控制的和嵌套表单以及他们的状态,就像有效/无效或者脏值/原始. 每个表单指令创建一个FormController实例. ...

  5. mysql调优 参数说明

    原文地址:http://wenku.baidu.com/view/49087bbafd0a79563c1e72c8.html 关键字: mysql *1, 查看 MySQL 服务器配置信息 *1. m ...

  6. linux下安装openmpi

    之前在win10的bash下折腾很久没有成功,后来经高人指点,发现其实一条命令就行了. sudo apt-get install libopenmpi-dev openmpi-bin 对的,就这一条命 ...

  7. jquery图片放大镜和遮罩层效果

    图片放大镜效果将借助于jqzoom插件,遮罩层借助于thickbox插件. 1.引入样式表 /*整体样式*/ <link rel="stylesheet" href=&quo ...

  8. atoi

    , KInvalid}; int g_nStatus=kValid; int StrToInt(const char *str) { g_nStatus=KInvalid; ; if((str!=NU ...

  9. #图# #SPFA# #Tarjan# ----- BZOJ1179

    SPFA算法 SPFA(Shortest Path Faster Algorithm)(队列优化)算法是求单源最短路径的一种算法. 判负环(在差分约束系统中会得以体现).如果某个点进入队列的次数超过N ...

  10. 在Java中打开浏览器

    try { Runtime.getRuntime().exec( "explorer http://www.baidu.com"); java.net.URI uri = new ...