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