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/ctrip-android-dynamic-loading?email=947091870@qq.com




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

method_chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值