专栏名称: 郭霖
Android技术分享平台,每天都有优质技术文章推送。你还可以向公众号投稿,将自己总结的技术心得分享给大家。
目录
相关文章推荐
开发者全社区  ·  ​海淀妈妈的「炫富大赛」 ·  14 小时前  
开发者全社区  ·  昔日同学中的三好学生都翻车了 ·  15 小时前  
开发者全社区  ·  ​金融行业是真不行了​ ·  昨天  
开发者全社区  ·  女孩住酒店注意安全 ·  2 天前  
开发者全社区  ·  北京泛体制内offer排序 ·  3 天前  
51好读  ›  专栏  ›  郭霖

Android增量升级方案

郭霖  · 公众号  · android  · 2016-09-12 07:31

正文


结束了愉快的周末,又到了给大家更新的时候。


本篇来自公众号“老司机” 何以诚 的投稿,分享了如何进行增量升级(亦作增量更新)。文中提到的一个插件化框架 Small,有兴趣的朋友可以访问最后的github地址查看。


何以诚 的博客地址:

http://blog.csdn.net/u013022222


背景


随着业务的发展,安装包的体积也在不断的增大,这时候,如果要版本更新,用户不得不去下载完整的安装包。但是如果使用增量升级方案,用户只需要下载新旧版本的差异包,然后在本地合成就行,这样省时省力。我们可以看下某产品使用增量升级时的数据:


xxx.2.4.0000.apk 32MB

xxx.2.5.0000.apk 28MB

差异包 6.3MB


其中增量包就是上文提到的差异包,可见 用户每次升级只需下载差异包就行 ,省时省力。


原理





其原理就是,我们在服务器端先拿新版本安装包和旧版本安装包进行对比,在生成差异包之后下发,之后客户端根据对应的差异包和本地旧版本安装包合成,便生成了新版本安装包。


实现


下载编译差分合并工具


apk文件的差分和合并都是使用的开源的二进制比较工具 bsdiff 实现,值得注意的是,该工具依赖 bizp2 这个库。


在下载完毕后,直接make便可以编译工具,不过我在一台苹果机器上编译的时候出现了一点问题,那时候make文件没法正确的读取,所以我修改了make文件,读者编译的时候(仅限mac, linux)只需要运行 install.sh 脚本就行。这部分的代码我已经单独抽出来作为一个 repo ,读者喜欢可以自行star,然后下载编译 repo


bsdiff

http://www.daemonology.net/bsdiff


bizp2

http://www.bzip.org


repo

https://github.com/ChanJLee/AndroidPatch


生成差异包


如果你刚刚编译成了 bsdiff ,在命令行里面输入 bsdiff 或者 bspatch 就会出现如下的信息:




其中 bsdiff 用于比较新旧文件的差异部分并生成差异包, bspatch 根据之前差异包和旧文件生成新文件,我们可以从这两个可执行文件的报错信息看出该命令如何使用。我们这里有两个文件: new.so old.so




之后我们运行 diff old.so new.so patch.so 便生成了差异包 patch.so




合成新版本


通过刚刚的介绍,我们已经在Android端实现了相关的库,只需要简单的调用:


YPatch.patch(oldFilePath, newFilePath, patchFilePatch)


便可以将新版本存放到 newFilePath 指定的目录下。


结合Small框架


上面好像都是在讲原理,没有具体的实践讲解的话,估计读者还是不懂,我们现在就结合 Small 框架 来看看如何做到增量更新。


对于我们的 Small框架 ,我们要知道,它把每个插件都编译成 .so文件 ,然后存放到app的 native目录 下,不过,如果它发现自己的 download 目录 有新的插件,那么就会去加载 download目录 下的插件,并且这种加载优先权是最大的,也就是说它会 优先加载download目录 下的插件。


所以,如果我们要做增量更新, 旧文件就从app的native目录进行读取 ,然后从服务器端下载增量包,最后合成的文件存放到 download目录 ,这样每次插件启动都会到 download目录 下加载新的插件。


实现:




可以看到这个函数中出现的 pluginUri ,它其实对应的是 bundle.json 中插件的 uri




也就是这里的 main 以及 setting


而这个 bundle.json 就是宿主中 asset 下的 small配置文件




示例代码:


OkSmall.merge(LaunchActivity.this, "setting", "http://192.168.1.100:8080/patch.so");
Toast.makeText(LaunchActivity.this, "重启应用后更新生效", Toast.LENGTH_SHORT






请到「今天看啥」查看全文


推荐文章
开发者全社区  ·  ​海淀妈妈的「炫富大赛」
14 小时前
开发者全社区  ·  昔日同学中的三好学生都翻车了
15 小时前
开发者全社区  ·  ​金融行业是真不行了​
昨天
开发者全社区  ·  女孩住酒店注意安全
2 天前
开发者全社区  ·  北京泛体制内offer排序
3 天前
冷爱  ·  如何有逼格地秀恩爱?
8 年前
黄三角早报  ·  好消息,你的钱有了翻倍的机会!!!
7 年前