最近在看热修复相干的框架,之前我们已看过了阿里的Dexposed和AndFix这两个框架了,不了解的同学可以点击这里进行查看:Dexposed框架原理解析 和 AndFix热修复框架原理解析,然后还有最近很火的1个是腾讯的Tinker热修复框架,再看他的原理实现的时候,发现了他使用到了开源的文件差分工具bsdiff/bspatch,所以就单独用这篇文章来详细介绍1下这个工具,由于这个工具有1个很大的用处就是增量更新,也就是我们看到现在大部份的利用市场推出的省流量更新利用的效果:
看到了吧,会提示你省了很多流量,依照之前常规的思路就是有利用更新了,就直接把更新的apk包下载然后升级安装,那末如果1个apk包很大,如果在非Wifi情况下还是很耗流量的,但是有时候我们会发现1个利用在升级的时候只是改了部份功能,有些功能并没有改,那末就想了如果要是能直接更新变动的功能的话,那末就会下载数据非常少了。这就需要借助我们几天介绍的这个文件差分工具bsdiff/bspatch了。
上面的省流量更新原理可以这么理解:服务端可以借助bsdiff工具,比对新旧apk包的文件,获得到差分文件以后下发到客户端,而这个差分文件的大小肯定是小于新的apk文件大小的。客户端得到这个差分文件以后,本地在使用bspatch工具进行差分文件和本地已安装的旧apk包进行合并成新的apk包文件,然后在进行升级安装。
在这个进程中,客户端在访问服务真个时候可能需要携带旧apk包的md5,利用包名,版本号等信息,服务端获得到以后会去数据库中查询其对应的本次需要升级的apk包和旧版本号对应的旧apk包,然落后行差分处理得到差分文件,在下发到客户端便可。
上面了解了原理以后,下面就直接看通过源码进行操作吧,前面已说过了,bsdiff和bspatch这个功能源码是开源的,可以从网上查找,关于他们的源码这里不做太多的介绍,由于是纯C代码,分析起来没甚么意思,可以自行浏览便可,由于是纯C语言的,所以如果我们想在Android端使用的话那末就需要使用NDK进行开发了,需要在上层用native方法进行关联访问,这个其实也没甚么大的问题,而关于服务端那边进行文件差分操作,这个已有现成的工具了,也是用C语言编译的可履行文件。所以下面第1步先来解决客户真个NDK开发工作:
第1步:定义native方法
这个native方法还是比较简单的,参数也很容易理解,新旧apk包路径,差分包路径。
第2步:使用javah生成头文件
注意:这里的命令是运行在源码src目录下,采取的类全名方式生成的。会在当前目录下生成对应的头文件:
第3步:新建jni目录
右击项目,选择Android Tools=》Add Native Support,点击下1步便可,在项目中会生成1个jni目录,然后我们把上面生成的头文件拷贝到这里,同时把网上找到的bsdiff和bspatch源码也拷贝到这个目录下:
然后记得添加编译脚本mk文件便可。
第4步:编写native层代码
这里代码非常简单,把上层传递的参数直接传入到applypatch函数中便可,相当于我们甚么都不用做。
第5步:使用编译以后的bsdiff工具生成差分文件patch
在这个目录下运行命令:bsdiff.exe demo_old.apk demo_new.apk demo.patch;然后生成了demo.patch文件,我们可以将其拷贝到sdcard目录下。
第6步:客户端编写代码进行差分文件合并
这里通过sdcard目录下的旧apk文件和生成的patch文件进行合并工作,生成新的apk文件,生成以后直接进行升级安装。
注意:这里我们为了懒,把旧apk直接拷贝到sdcard目录了,而在实际开发中我们应当通过系统提供的方法直接获得已安装利用的apk文件路径的:
上面的代码已编写完成了,下面就直接运行便可,会自动编译native的代码:
然后运行结果:
这样就简单实现了利用的增量升级了。而这个技术在后面介绍Tinker框架的时候会触及到,他内部做了差分文件也是借助这个工具来进行操作的。
项目下载地址:https://github.com/fourbrother/android_diffupdate
现在的热修复框架都会触及到修复文件,而这个文件现在都可能叫做差分文件。就是需要真正修复问题的文件包。这个技术在初期利用市场中的省流量升级已体现出来了。
更多内容:点击这里
关注微信公众号,最新技术干货实时推送
上一篇 2017程序员面试简历注意事项
下一篇 朴素贝叶斯