天天看点

android热补丁初探之二 热补丁分析对比

android热补丁初探之二 热补丁分析对比 2015,年,各大国内互联网公司都开始研究热补丁技术,android热补丁技术层出不穷,下面是总结的热补丁的技术对比分析, 主要针对以下三种类型: 1.hotfix (QQ空间) 2.andfix  (支付宝) 3.DynamicAPK(携程) 这三个都是国内的三家公司分享的开源技术。

此篇文章主要集中前两种讲解以及和对底单中简单分析 1.hotfix (QQ空间)   上一篇文章已经介绍了hotfix的使用,这里在做以下简单的原理归纳和总结 按照正常的思路:如何把线上的bug解决掉。 1.需要两个apk包:bug.apk,fix.apk (1)bug.apk安装到用户手机中。 (2)fix.apk是打补丁的包 (3)基本思路就是,发现bug.apk安装到用户手机中后发现了有bug,然后在本地把bug修复掉。 之后打包成fix.apk传到用户手机的某个位置。然后让bug.apk加载fix.apk进来,然后就bug修复了。 2.因为hotfix只能实现类级别的修复功能,所以这里不考虑资源图片的问题,只考虑class的修复问题。 3.要实现这正常的逻辑hotfix给了技术支持。要做一些操作就可以实现了。 fix.apk中只需打包需要修复的class文件,不需要修复的不用传。 4.hotfix提供了技术支持哪些呢? (1)android的classes.dex文件加载问题,其中是可以加载多个dex文件的,并且可以考虑将哪个dex文件先加载, 后加载哪个dex文件。这样我们设置先加载补丁中的dex文件, 从这中间先找到对应的类,然后就可以把最原始的bug类覆盖了,执行fix.apk中的class.  (2)按第(1)步的逻辑基本就搞定了补丁修复的问题了。但实际上,还有一个小问题需要解决。  例如:bug.apk中的 TestClass        fix.apk中的 TestClass        系统默认是加载bug.apk中的TestClass        我们把加载方式改变了让程序先加载fix.apk中的TestClass。        但是发现最终执行的还是bug.apk中的TestClass类。        这是系统在编译默认apk的时候就,将bug.apk中的TestClass打上了CLASS_ISPREVERIFIED标志,         这个标志就是表示系统不论什么时候都直接加载bug.apk中的TestClass。是系统编译优化中执行的。 这样即使有fix.apk中的TestClass这个类,也就不执行这个了。 那么该如何操作呢? 就是在bug.apk打包编译的时候,让CLASS_ISPREVERIFIED标志去掉。 如何去掉呢? 在编译bug.apk中的TestClass类的时候在构造方法中执行加载另外一个Dex文件, 这样bug.apk中的TestClass类就不会打上CLASS_ISPREVERIFIED标志了。 之后的fix.apk中的 TestClass就可以执行了。 这个是重点重点重点。 (3)hotfix如何执行的呢? 正常编写代码,在编译的时候用gradle把加载另一个dex文件的方法动态加入到要修复的bug类中。 例如:System.out.print(AntilazyLoad.class); (4)CLASS_ISPREVERIFIED标志在哪? 这个标志是每个类对应的一些属性,咱们正常写程序看不到的另外一些属性。 (5)怎么生成第二个dex文件 正常是通过写一个类*.java、然后编译成*.class,再用dx工具,编译成Dex文件。 (6)程序中原理大概是这样的,需要亲自的练习和理解。

2.andfix  (支付宝) 这个和hotfix是不一样的实现原理, 这个是方法级别的,用于方法级别的bug修复。也是不支持资源加载的。 然后用的是C++中的钩子函数,当调用原来dex文件中的某个bug方法时,用钩子函数直接指向到补丁的方法中, 然后执行补丁的替换。

3.DynamicAPK(携程) 这个是比较新的开源的。其中包含资源的加载,activity的加载,不用代理或者fragment等。

下面是这三种的资源:

1.hotfix  qq空间 git地址:  https://github.com/dodola/HotFix 原理分析: https://mp.weixin.qq.com/s?__biz=MzI1MTA1MzM2Nw==&mid=400118620&idx=1&sn=b4fdd5055731290eef12ad0d17f39d4a&scene=1&srcid=1106Imu9ZgwybID13e7y2nEi#wechat_redirect 原理分析(备用): http://zhuanlan.zhihu.com/magilu/20308548

2.andfix  阿里支付宝 git地址:  https://github.com/alibaba/AndFix 使用方法: http://blog.csdn.net/qxs965266509/article/details/49802429 原理解析: http://blog.csdn.net/qxs965266509/article/details/49816007

3.DynamicAPK(携程) git地址:  https://github.com/CtripMobile/DynamicAPK 原理分析: http://www.infoq.com/cn/articles/[email protected]