上一周比較忙,忙的不可开交,写的文章也就两篇,在此希望大家见谅。这周呢,突然闲下来了,有时间了,就重构了下代码,捣鼓点前卫的技术,沉淀沉淀。所以呢。今天就分享下这几天研究的东西。
移动互联网主打的就是用户体验和产品的高速迭代,通过用户反馈和用户行为跟踪及时调整产品方向,这样才干持续保持生命力和创造力。说的接地气点就是,你频繁的升级更新。有时仅仅是修复了几个bug或者微调了下界面,就让用户下载10几兆甚至更大的apk,并且在眼下国内这个4G还不是普及的时候。对用户来说是非常不友好的。
有没有这样一种策略呢,就如windows系统上打补丁一样。通过体积比較小的补丁来完好系统存在的bug或者新功能的实现,假设能够实现的话。用户就再不会苦着脸去更新app了。答案是肯定的。要实现这个功能。须要下面两个步骤。
一、比对新版本号与老版本号之间的差异,最好仅仅下载差异的部分
思路非常easy。也非常清晰,那我们就照着这个目标行进。apk本身事实上是一个zip压缩包,你改下后缀名,再双击解压就能得到apk内部的编译打包后的文件,图片音频等文件是直接能够可读的,其它的就得通过反编译工具去查看了。所以我们应用的安装文件apk就是一个二进制文件。怎样得到两个二进制文件的差异文件---差异包呢?好消息是已经有前人实现了。它的名字bsdiff,一个差异包比較工具,全称是binary diff,二进制差异的意思。通过bsdiff。我们就能得到两个apk的差异包了,以下我会把整理的命令文件打包到代码中上传Github上供大家使用的。bsdiff为我们提供的仅是一组用C实现的代码,须要自己去编译构建,我已经为大家准备了windows、OSX、Linux不同平台下使用的命令。
因为我的电脑是macbook。运行命令例如以下
运行命令之后。得到xx.patch,我们以下要下载的就是这个差异包。依据不同版本号之间的差异。相对整个apk来说,差异包的体积会小非常多。同一时候假设你的应用老版本号有多个的话,你就须要生成相应的多个差异包。
假设要想生成的流程自己主动化的话。找后台的哥们配合下就能轻松解决。
二、手机本地下载差异包,再和旧版本号apk进行合并。最后合并成新版本号apk。
依据当前版本号号,向server发起请求,就得下载到相应的差异包。以下就是旧版本号apk和patch合并的一步了,因为java本身并没有提供相应的api。我们须要C去帮助实现,然后生成.so包进行调用。
相对于生成差异包的bsdiff。也给提供了还有一个bspatch,这个就是帮助我们进行文件和平的。
假设要在Android中实现这一步。就须要去配置NDK的开发环境了,假设不想的同学能够直接把demo里面的.so文件拿出来用。
调用以下的这种方法就能够实现文件的合并
合并出的apk文件,与最新的安装包并无差别,具有相同的特征值。
最后通过Intent进行安装。
写在最后:有可能有的用户所使用的版本号比較老,与最新的apk相差非常大的话,还是建议依据生成差异包的大小进行判定是否去直接下载apk进行更新。同一时候依据不同版本号相应不一样的差异包,和后端的小伙伴合作去自己主动化生成的话,大大降低了生成差异包时间上的浪费。
最后假设仅仅是修复关键性bug或者几个新需求的加入,产生的差异包会非常小,也会大大的降低了用户的下载时间和流量消耗。
源代码地址:https://github.com/JackCho/AndroidPatchUpdate
假设认为对你有所帮助,欢迎大家订阅我的微信公众账号——Android干货分享(ID:android_share)。以下是微信的二维码,为你提供及时高质的Android干货。技术交流QQ群:318588906,欢迎大家加群,共同探讨下Android和Java技术,一起壮大我们的微信干货分享社区。