Bsdiff增量更新实现

来源:互联网 发布:竹书纪年 知乎 编辑:程序博客网 时间:2024/05/16 08:24
  • 鸿大《Android 增量更新完全解析 是增量不是热修复》
  • wzben《呕心沥血Android studio使用JNI实例》

本来还想跟着鸿大的脚步,尝试自己编译Bsdiff的,无奈自己用的Win10,也没搭建Ubuntu虚拟机,网上搜索无果只能找了别人编译好的。

  • Demo

  • bsdiff4.3 + bzip2 + 编译好的bsdiff4.3-win32

一句话原理解析:对比新旧apk生成二进制差异文件patch(就是增量文件),app拿到patch文件后和已经安装在系统里的apk文件合并,然后执行安装。

原理都好简单,但是自己实现就难。但有几点要注意的:

  • 新旧apk签名要一致
  • 新apk版本要增加
  • 最好生成最近几个版本增量文件,每个版本下载对应的去做增量更新(毕竟保证不了客户都在用最新版本)
  • 版本差异太大/版本太久远,直接整包更新

一、下载NDK&搭建环境

用Android Studio还是挺方便的,选择相关插件下载安装就配置好了NDK开发环境。用的是Studio 2.2.1版本,新旧版本可能步骤有所不一样。
1、打开Studio>Settings>Android SDK;
2、在右边切换到SDK Tools面板;
3、勾选CMake、LLDB、NDK这三项;
4、点击Apply按钮,接着点击弹窗的OK按钮,然后等着下载安装完就Ok了。
AS的NDK环境搭建

二、新建项目,做下Gradle配置

1、新建项目就不用说了,可以不勾选Include C++ Support(第一个坑就是勾选了这个,文末再说);
新建项目
2、在Project的gradle.properties文件下配置

android.useDeprecatedNdk=true

3、在Module下的build.gradle文件的android>defaultConfig节点里配置

android {    // ...    defaultConfig {        // ...        // 增量更新        ndk {            // 指定so库名称            moduleName = 'bsdiff'            // 指定支持的cpu架构类型            abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'        }    }}

三、抒写代码

1、先把下载好的bsdiff压缩包里的bspatch.c拷贝到Module的src/main/jni目录下;
2、继续把下载好的bzip2压缩包里的所有.c和.h文件拷贝到Module的src/main/jni目录下(建议拷贝Demo里的文件,不然待会编译出错Error:(70) multiple definition of main要删掉报错文件里的所有main方法);
jni文件
3、新建一个类,并声明一个native方法(包名、方法名很重要);
native发法
4、修改bspatch.c文件,提供native方法供java调用;
bspatch.c
5、然后调用native方法bspatch,传入旧apk的所在路径、合并后新apk的保存路径、增量文件patch的所在路径;
6、最后运行不报错不闪退就可以了,拿着新apk去安装就行了,安装失败/提示解析包失败错误等等等的,一般是用来生成增量文件patch的旧apk和已安装的apk不一致导致的;

  • 编译好后,生成的.so文件在如下目录下,可以直接拿到项目里用了。

.so文件

写在最后

第一次接触JNI,掉坑里不少,不过这次主要学习的内容是Bsdiff增量更新,就没深入了解JNI,顺便简单的记录下印象深刻的坑。
1、上面二.1说的坑,就是要把/src/main/jni目录下的所有.c文件添加到Module根目录下的CMakeLists.txt文件里,不然编译会报错找不到相关函数方法
CMakeLists.txt
2、如果还有什么报错之类的,肯定是我给忘了~折腾了一天…

0 0
原创粉丝点击