学习目的

  • 在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 进行了覆盖安装。

包的拆分

需要的工具

如何生成多个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包是否有读写权限 可以这样

不懂得可以查看代码,最直观
https://github.com/wanghao200906/NdkBsDiffPractise

01-22 00:37
查看更多