学习目的
- 在android studio 3.0的 基础上同时生成多个so包,cmake的编写
- 开发安卓程序进行ndk开发 自动生成 增量包 patch
- 生成 合并的so 库进行patch文件的合并
- 解决 引用三方so库 方法报红 的问题
演示
增量更新就是,app自动更新的时候不会把整个新版本的apk包下载下来 进行覆盖安装,而是将一个 新版本和老版本 进行比较 生成一个 patch包,把patch包下载下来 和当前版本进行合并。然后在进行覆盖安装。
为了演示 我们先创建一个项目。将相同包名 的两个不同版本的apk 放到assert 目录下。然后将这两个包拷贝到 指定文件夹下。在生成一个patch 包。
下过如下
就这样 我们把assets目录下的两个apk。拷贝到了文件夹下,并生成了一个patch包。
这个patch包就是 app-new 和app-old 中的区别的部分。
然后我们可以吧这个patch包放到服务器。这样用户在使用app的时候 只用下载patch包,然后和当前app进行合并。就可以覆盖安装了。
下面我们在看一下 合并包的效果。我们还在该手机上。直接安装目录下的app-old.apk,然后点击合成按钮。会在线程里合成一个新的apk。然后进行覆盖安装。
我们看到了。我们的app 进行了覆盖安装。
- 注意:
- 这个叫oldtonew.apk 并不是这个文件夹下的 patch 和 app-old.apk合成的。因为用户使用的时候并不一定手机里会有 老版本的apk安装包。
- 高于7.0 版本 的系统 覆盖安装会有一些坑。可以查看这篇文章。
https://wanghao200906.github.io/2018/01/31/2018-01-31androidFileProvider/
- 高于7.0 版本 的系统 覆盖安装会有一些坑。可以查看这篇文章。
- 这个叫oldtonew.apk 并不是这个文件夹下的 patch 和 app-old.apk合成的。因为用户使用的时候并不一定手机里会有 老版本的apk安装包。
包的拆分
需要的工具
bzip2 : http://www.bzip.org/downloads.html 下载放一边
bsdiff : https://github.com/mendsley/bsdiff clone 一波
有用的就两个文件 。ok了。下载完这些 准备完事儿了。开始写代码了。
如何生成多个so文件(先了解一下)
如果androidstudio 3.0 上还不会使用ndk 开发 请看这篇文章
https://wanghao200906.github.io/2018/01/25/2018-1-25AndroidStudio3.0NDK_Dev_init/
看完这个基本了解个大概了。androidstudio 已经不用 编写 .mk 文件了。
我们想创建一个项目。生成一个 diff.so 和patch.so 两个包。怎么做呢
这样一目了然了。再看看 这三个CmakeList.txt 怎么写的呢
|
|
在看一下 我们的gradle文件
请注意一下路径。
如果我们的代码写的没有问题。直接 build ->make project
可以看到 我们生成了 diff.so 和 patch.so 文件夹。
现在如果我们在创建什么项目 直接使用这两个so文件。就可以进行 拆分 和合并了。
拆分,合并代码编写。
拆分 和 合并 要使用 刚才 下载的 bsdiff 文件。bsdiff 文件又依赖于 bzip2 的库
因为拆分 与 合并 基本类似。就展示 拆分的代码了。我会把所有代码放到github上去。因为这两个库在使用的时候有特别多的坑。
先看一下目录结构吧
把刚才下载的bzip2 包放到 cpp目录下。注意 不是全部都放过来。
在diff目录下新建一些 拆分需要的代码。
注意
如果你不知道 sven_com_apkpatchserver_DiffUtils.h
这个文件是如何生成的,你需要先看这篇文章,不然下面的看不懂了
https://wanghao200906.github.io/2018/01/25/2018-1-25AndroidStudio3.0NDK_Dev_init/
新建一个 DiffUtils 的工具类
|
|
生成 他的 native 头文件
sven_com_apkpatchserver_DiffUtils.h
|
|
还记得 上文提到的github 中 有一个 bsdiff.c 的文件么 全部拷贝 放到diff文件夹下,这里更名为 diff.c 在这个代码的基础上进行编写
代码如下,特别多。请小心。下面全是c 语言的代码了。如果看不懂可以先从jni学起。
|
|
到这里 拆分就完成了。
只需要在java代码里执行如下代码就行
|
|
到这里 拆分 就都讲完了。合并 的代码 大同小异这里就不赘述了。我会把代码放到github上去。
使用patch.so 进行apk 与patch的合并。
新建一个项目,假设这个项目就是我们公司的app了。把刚才生成好的 patch.so文件 拿过来 复制到这里
然后我们开始编写 PatchUtils的代码了
注意
- 我们如果想完美的使用so文件。我们带么的 名字 和路径 都要和 生成so 项目的代码的路径一致
不然的话 代码 引用上就会有问题。
这就是为什么我们引用三方so文件 无法运行或者 写的代码报红了
比如这样
引用成功的话。基本就完成了。
我们只需要在代码里 简单调用就可以了
|
|
到这里 我们就完成了apk 的 增量更新
覆盖安装的一些坑
- 增量更新,在手机上安装的 apk。一定要是 release key 打包的,并且 v1 v2 对勾都要选中
- 覆盖安装 要适配7.0
https://wanghao200906.github.io/2018/01/31/2018-01-31androidFileProvider/ - 覆盖安装不要忘记 这句代码
|
|
- 如果怎么都不行,可以查看 你的apk包是否有读写权限 可以这样
|
|
不懂得可以查看代码,最直观
https://github.com/wanghao200906/NdkBsDiffPractise