这篇文章需要会以下:
- 搞一个 Linux 环境
- Linux 系统下的命令行
- JNI 开发流程 (Android Studio 搭建 JNI 开发环境)
- c 语言开发
增量更新大体流程
- 客户端发送更新请求
- 服务端生成差分包(生成差分包是动态生成的 而不是已经生成好的)
- 客户端下载差分包并且与旧的 apk 合并成最新的 apk
- 最后安装
那么问题来了
- 差分包怎么生成的
- 每次请求都生成差分包 效率呢
- 旧的 apk 怎么与差分包合并生成新的 apk
- 旧版本的 apk 从哪里来(服务器下载肯定不可能 本地的要是被删了呢)
- 差分包怎么生成的
差分包的生成跟新 apk 的合并都是用到 bzip2 这个项目。
- 每次请求都生成差分包效率问题
差分包可以定期缓存在服务器
- 旧版本apk从哪里来
apk 安装的时候手机系统会复制一个份 apk 到手机的系统的 data/app/包名-1/base.apk 目录下这个目录可以调用
ApplicationInfo appInfo = context.getPackageManager().getApplicationInfo(packageName,0);
String oldFilePath = appInfo.sourceDir
- 如果用户 root 了手机 手贱贱的删了这个apk呢
这时候只能特殊情况特殊处理 从服务端下载最新版本
Linux 下生成差分文件
- 将 diffsrc 文件复制到 Linux 系统下生成可执行文件。(cd 到文件目录 执行生成可执行文件的命令 : gcc -fPIC blocksort.c bsdiff.c bzlib.c compress.c crctable.c decompress.c huffman.c randtable.c -o testDiff 生成在 Linux 系统下的可执行文件 testDiff )
- 复制 新/旧版本的 apk 到相同目录下。
- 执行可执行文件 testDiff (执行命令 ./testDiff apkOld.apk apkNew.apk test.patch apkOld.apk apkNew.apk是自己文件的文件名)
- 最后没有错的话就生成了差分包 test.patch .
在安卓项目里将差分包跟旧的 apk 合并生成最新版 apk。
- 在自己安卓项目目录的 src/main 下面新建一个文件夹 cpp,将上面的 diffsrc 下的文件 拷贝到 cpp目录下
- 配置 CMakeList.txt (配置所有 c 文件的路径 跟库的名字 )
- 安卓项目里写 native 方法( 记得加载库文件 第二步配置的库: System.loadLibarary("bzip")
- 在 bspatch.c 实现 native 方法并调用 bspatch 的合并方法。
- 合并完成后安装
至于服务端写更新接口生成差分包、服务器缓存差分文件、表示我也不会。