现在的应用市场,很多都有省流量更新,到底是使用什么技术实现的呢?了解一番后,原来,是使用到了增量更新,而且实现的手段,其实也挺简单的。
基本流程就是这样的:用户手机上已经安装的应用,比如版本为1.0,下载新版本2.0与1.0的增量包(也可以称为差分包),然后1.0与增量包合并为新的2.0包,重新安装。
结合上面的流程,基本技术点就是生成和合并增量包:
- 生成增量包
- 合并增量包
生成bsdiff和bspatch可执行文件
下载
增量包的生成,目前已经有很多开源库了,可以直接使用bsdiff,进去bsdiff下载页面,点击here
就可以下载并解压。可以看到有以下文件
1 | ➜ bsdiff-4.3 ls |
bsdiff:比较两个文件的二进制数据,生成差分包。一般会在你的存储服务器当中执行,接下来以Mac系统环境下演示
bspatch:合并旧的文件与差分包,生成新文件。一般在Android环境中执行,也就是会集成到Android项目中。
编译
1 | 执行make命令 |
出现错误提示的原因是:在makefile中,命令行要以tab键开头,所以我们要对MakeFile进行编辑
1 | # 原来的代码 |
修改完成后,重新执行make命令
1 | ➜ bsdiff-4.3 make |
成功生成了bsdiff可执行文件,但是在生成bspathc的时候,却出现错误提示,原因是:找不到u_char的声明,所以需要引入#include <sys/types.h>
到bspatch.c
文件中,再次执行make。
1 | ➜ bsdiff-4.3 make |
可以发现多出了bsdiff
和bspatch
文件
合并增量文件
生成差分包的步骤,就先放在后面,先介绍怎样在项目中实现合并增量包,然后再编译不同的包进行增量更新。
创建项目
创建NDK项目,最简单的就是在创建时,勾选Include C++ Support,拷贝bspatch.c
到src/main/cpp
文件中,修改CMakeList.txt文件。
1 | add_library( native-lib |
尝试编译运行,提示出错如下,找不到bzlib.h
1 | fatal error: 'bzlib.h' file not found |
因为bspathc依赖于bzip2(zip压缩库),所以需要导入bzip2库文件,bizp2下载地址,直接解压,然后在cpp文件下创建bzip文件(文件名可以随便取),把其中的.c
和.h
文件拷贝进去。
如果不想全部拷贝进去,可以分析MakeFile文件,生成bzip2的库,需要下列这些文件,只需要对应找其中的.c
文件,执行编译就通过错误提示不断导入需要的文件。
1 | OBJS= blocksort.o \ |
并且需要修改CMakeList.txt文件
1 | 新增 |
导入bzlib.h
文件后,编译运行仍然出现如下
1 | fatal error: 'bzlib.h' file not found |
再修改CMakeList.txt文件,不断添加文件直到编译成功不报错
1 | include_directories(src/main/cpp/bzip) |
编写native方法
导入bzlib库成功后,新建一个native方法,用于执行合并拆分包
1 | /** |
修改native-lib.cpp文件
1 |
|
在MainActivity中,点击按钮,执行更新
1 | /** |
差分包下载后就需要执行安装,不同版本的执行流程不一样需要额外处理
1 | /** |
另外,还要需要修改AndroidManifest.xml,开启必要的权限
1 | // 读写SDCard权限 |
创建xml目录下的文件file_paths.xml
1 | <?xml version="1.0" encoding="utf-8"?> |
生成增量包
编译以上项目,生成old.apk,修改版本号为2.0,再次编译生成new.apk。都拷贝到与bsdiff同一个目录下,执行
1 | ./bsdiff 旧版本apk 新版本apk 差分包(文件名和格式可以随便取) |
拷贝patch.diff到手机根目录中,执行旧项目代码,就可以看到跳转到应用安装界面
完整项目
完整项目demo代码,可以自行到github看
错误
编译的时候,出现错误提示如下,应该是提示链接库失败
1
2Build command failed.
Error while executing process ‘...省略忘记先复制完整错误信息了....bzip2.c.o', missing and no known rule to make it修改方法:Build -> Refresh Linked C++ Projects
参考资料
-
鸿洋的文章
-
介绍通过DownloadManager下载文件,还介绍了root模式下自动安装