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.youkuaiyun.com/qxs965266509/article/details/49802429
原理解析: http://blog.youkuaiyun.com/qxs965266509/article/details/49816007
3.DynamicAPK(携程)
git地址: https://github.com/CtripMobile/DynamicAPK
原理分析: http://www.infoq.com/cn/articles/ctrip-android-dynamic-loading?email=947091870@qq.com