本来还想跟着鸿大的脚步,尝试自己编译Bsdiff的,无奈自己用的Win10,也没搭建Ubuntu虚拟机,网上搜索无果只能找了别人编译好的。
一句话原理解析:对比新旧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了。
二、新建项目,做下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方法);
3、新建一个类,并声明一个native方法(包名、方法名很重要);
4、修改bspatch.c文件,提供native方法供java调用;
5、然后调用native方法bspatch,传入旧apk的所在路径、合并后新apk的保存路径、增量文件patch的所在路径;
6、最后运行不报错不闪退就可以了,拿着新apk去安装就行了,安装失败/提示解析包失败错误等等等的,一般是用来生成增量文件patch的旧apk和已安装的apk不一致导致的;
- 编译好后,生成的.so文件在如下目录下,可以直接拿到项目里用了。
写在最后
第一次接触JNI,掉坑里不少,不过这次主要学习的内容是Bsdiff增量更新,就没深入了解JNI,顺便简单的记录下印象深刻的坑。
1、上面二.1说的坑,就是要把/src/main/jni目录下的所有.c文件添加到Module根目录下的CMakeLists.txt文件里,不然编译会报错找不到相关函数方法
2、如果还有什么报错之类的,肯定是我给忘了~折腾了一天…