Android App补丁更新

上一周比较忙,忙的不可开交,写的文章也就两篇,在此但愿你们见谅。这周呢,忽然闲下来了,有时间了,就重构了下代码,捣鼓点前卫的技术,沉淀沉淀。因此呢,今天就分享下这几天研究的东西。java

移动互联网主打的就是用户体验和产品的快速迭代,经过用户反馈和用户行为跟踪及时调整产品方向,这样才能持续保持生命力和创造力。说的接地气点就是,你频繁的升级更新,有时只是修复了几个bug或者微调了下界面,就让用户下载10几兆甚至更大的apk,并且在目前国内这个4G还不是普及的时候,对用户来讲是很不友好的。有没有这样一种策略呢,就如windows系统上打补丁同样,经过体积比较小的补丁来完善系统存在的bug或者新功能的实现,若是能够实现的话,用户就再不会苦着脸去更新app了。答案是确定的,要实现这个功能,须要如下两个步骤。android

1、比对新版本与老版本之间的差别,最好只下载差别的部分git

思路很简单,也很是清晰,那咱们就照着这个目标行进。apk自己实际上是一个zip压缩包,你改下后缀名,再双击解压就能获得apk内部的编译打包后的文件,图片音频等文件是直接能够可读的,其余的就得经过反编译工具去查看了。因此咱们应用的安装文件apk就是一个二进制文件,如何获得两个二进制文件的差别文件---差别包呢?好消息是已经有前人实现了,它的名字bsdiff,一个差别包比较工具,全称是binary diff,二进制差别的意思。经过bsdiff,咱们就能获得两个apk的差别包了,下面我会把整理的命令文件打包到代码中上传Github上供你们使用的。bsdiff为咱们提供的仅是一组用C实现的代码,须要本身去编译构建,我已经为你们准备了windows、OSX、Linux不一样平台下使用的命令。github

因为个人电脑是macbook,执行命令以下windows

执行命令以后,获得xx.patch,咱们下面要下载的就是这个差别包。根据不一样版本之间的差别,相对整个apk来讲,差别包的体积会小不少。同时若是你的应用老版本有多个的话,你就须要生成对应的多个差别包。若是要想生成的流程自动化的话,找后台的哥们配合下就能轻松解决。后端

2、手机本地下载差别包,再和旧版本apk进行合并,最后合并成新版本apk。api

根据当前版本号,向服务器发起请求,就得下载到对应的差别包。下面就是旧版本apk和patch合并的一步了,因为java自己并无提供相应的api,咱们须要C去帮助实现,而后生成.so包进行调用。相对于生成差别包的bsdiff,也给提供了另外一个bspatch,这个就是帮助咱们进行文件和平的。若是要在Android中实现这一步,就须要去配置NDK的开发环境了,若是不想的同窗能够直接把demo里面的.so文件拿出来用。调用下面的这个方法就能够实现文件的合并服务器

合并出的apk文件,与最新的安装包并没有区别,具备一样的特征值。最后经过Intent进行安装。微信

写在最后:有可能有的用户所使用的版本比较老,与最新的apk相差很大的话,仍是建议根据生成差别包的大小进行断定是否去直接下载apk进行更新。同时根据不一样版本对应不同的差别包,和后端的小伙伴合做去自动化生成的话,大大减小了生成差别包时间上的浪费。最后若是只是修复关键性bug或者几个新需求的添加,产生的差别包会很小,也会大大的减小了用户的下载时间和流量消耗。app

源码地址:https://github.com/JackCho/AndroidPatchUpdate

 

若是以为对你有所帮助,欢迎你们订阅个人微信公众帐号——Android干货分享(ID:android_share)。下面是微信的二维码,为你提供及时高质的Android干货。技术交流QQ群:318588906,欢迎你们加群,共同探讨下Android和Java技术,一块儿壮大咱们的微信干货分享社区。

相关文章
相关标签/搜索