关于Android热修复的几种解决方案

文中引用到的一些博客:
http://www.jianshu.com/p/0a31d145cad2

https://mp.weixin.qq.com/s?__biz=MzI1MTA1MzM2Nw==&mid=400118620&idx=1&sn=b4fdd5055731290eef12ad0d17f39d4a

阿里推出方案的同时还出了本热修复的书链接放这里,推荐!
http://download.csdn.net/download/xlitol/9892768?spm=5176.doc53240.2.28.WgTrVf

一、Dexposed(@Deprecated)
项目地址:https://github.com/alibaba/dexposed

Dexposed是一个阿里巴巴手机淘宝基于Xposed进行的改进,产生了针对Android Dalvik 虚拟机运行时的Java Method Hook 技术--Dexposed。

在native层中先找到要修复的Java函数对应的Method对象,修改它变为native方法,把它的nativeFunc指向hookedMethodCallback。这样对这个java函数的调用就转为调用hookedMethodCallback这个native函数了,然后再用这个native函数回调java层自己实现的统一接口来处理。这个统一接口是XC_MethodReplacement类,它主要有beforeHookedMethod、afterHookedMethod和replaceHookedMethod等几个方法,前两个在执行原java函数前后做一些事,replaceHookedMethod则是替换原java方法。

但这个方案由于对底层Dalvik结构的过于依赖,最终无法兼容Android 5.0以后的ART虚拟机,所以现在也没什么卵用。

关于Dalvik和ART的区别:http://www.jianshu.com/p/58f817d176b7
贴俩篇详细hook的过程分析:

http://blog.csdn.net/yueqian_scut/article/details/50939034

http://blog.csdn.net/yueqian_scut/article/details/50939034

二、Andfix
项目地址:https://github.com/alibaba/AndFix

之前的博客有对其使用的介绍
http://blog.csdn.net/wy12345432452/article/details/77008963

Andfix 是支付宝提出的一种底层结构替换的方案,也达到了运行时即时生效的效果,并且重要的是,做到了Dalvik和ART环境的全版本兼容。

实现原理:
AndFix的原理就是方法的替换,把有bug的方法替换成补丁文件中的方法。

对于实现方法的替换,需要在Native层操作,经过三个步骤:

总结该方案的优缺点:
优点:

1.BUG修复的即时性

2.补丁包同样采用差量技术,生成的PATCH体积小

3.对应用无侵入,几乎无性能损耗

不足:

1.不支持新增字段,以及修改方法,也不支持对资源的替换。

2.由于厂商的自定义ROM,对少数机型暂不支持。兼容性差。

(每一个java方法在art种都对应一个ArtMethod, ArtMethod记录了这个java方法的所有信息,包括所属类,访问权限、代码执行地址。
通过evn->FromReflectedMethod,可以由Method对象得到这个方法对应的ArtMethod的真正其实地址,然后就可以把它强转为ArtMethod指针,从而对其所有的成员进行修改。这样就全部替换完之后就完成了热修复逻辑。以后调用这个方法时就会直接走到新方法的实现中了。
然而由于andfix里面的ArtMethod的结构体遵照android虚拟机art源码里面的ArtMethod构建的,各个手机厂商对这个ArtMethod结构体进行修改就会导致喝原来开源代码里面的结构不一致,那么在这个修改过的设备上,替换机制就会出问题,无法正常执行热修复逻辑。)

详细的源码分析:
http://blog.csdn.net/qxs965266509/article/details/49816007

三、阿里百川Hotfix(@Deprecated)
阿里百川Hotfix其实是阿里手机淘宝根据对Andfix的使用,对相关业务解偶后推出的,所以Andfix的缺点它也有。而且阿里已经在此基础上推出了更好的替代方案Sophix。所以这个这个以后基本上用不上了。

四、阿里Sophix
这个是阿里最新的一个解决方案,下面这个是官网。
https://www.aliyun.com/product/hotfix

这个是挂在github上的Demo。
https://github.com/aliyun/alicloud-android-demo/tree/master/hotfix_android_demo?spm=5176.doc53241.2.1.B9j904

阿里推出这个方案的同时出了本关于热修复的书,不止介绍了这个项目,而且介绍了很多热修复的原理,和在探索热修复时的一些思考,觉得还是值得好好看下的,地址在这里:
http://download.csdn.net/download/xlitol/9892768?spm=5176.doc53240.2.28.WgTrVf

下面是阿里系的热修复方案的对比。

从上图来看Sophix 应该是阿里系现在最好的了,相比其他的方案:

优点:

每个厂商的官网都不例外的说自己的方案怎么怎么好,下面摘自官网的介绍,根据我的试用进行了标注。

总体来说最大的优势在于:

1、补丁即时生效,不需要应用重启;(这个听着好像很爽,其实好多时候还是都要冷启动才能生效,如果是资源文件要好几次下面是官网的图)

2、补丁包同样采用差量技术,生成的PATCH体积小;
3、对应用无侵入,几乎无性能损耗;
4、傻瓜式接入。(这个确实接入很简单,后台使用也简单,生成补丁的工具也是图形化的)

缺点:
1、这个不开源,只能用阿里的后台,如果你想发布在自己的后台那就不能用了。

五、QQ空间超级补丁技术
参考博文:
https://mp.weixin.qq.com/s?__biz=MzI1MTA1MzM2Nw==&mid=400118620&idx=1&sn=b4fdd5055731290eef12ad0d17f39d4a

超级补丁技术基于DEX分包方案,使用了多DEX加载的原理,大致的过程就是:把BUG方法修复以后,放到一个单独的DEX里,插入到dexElements数组的最前面,让虚拟机去加载修复完后的方法。

当patch.dex中包含Target.class时就会优先加载,在后续的DEX中遇到Target.class的话就会直接返回而不去加载,这样就达到了修复的目的。

六、Tinker
项目官网:http://www.tinkerpatch.com/

Tinker 是开源项目Github的地址:https://github.com/Tencent/tinker

参考:http://www.cnblogs.com/yyangblog/p/6268818.html

微信针对QQ空间超级补丁技术的不足提出了一个提供DEX差量包,整体替换DEX的方案。主要的原理是与QQ空间超级补丁技术基本相同,区别在于不再将patch.dex增加到elements数组中,而是差量的方式给出patch.dex,然后将patch.dex与应用的classes.dex合并,然后整体替换掉旧的DEX,达到修复的目的。

整体的流程是:

从流程图来看,同样可以很明显的找到这种方式的特点:

优势:

1.合成整包,不用在构造函数插入代码,防止verify,verify和opt在编译期间就已经完成,不会在运行期间进行。

2.性能提高。兼容性和稳定性比较高。

3.开发者透明,不需要对包进行额外处理。

不足:

1.与超级补丁技术一样,不支持即时生效,必须通过重启应用的方式才能生效。

2.需要给应用开启新的进程才能进行合并,并且很容易因为内存消耗等原因合并失败。

3.合并时占用额外磁盘空间,对于多DEX的应用来说,如果修改了多个DEX文件,就需要下发多个patch.dex与对应的classes.dex进行合并操作时这种情况会更严重,因此合并过程的失败率也会更高。

七、Amigo
项目地址:https://github.com/eleme/Amigo

参考博文:http://blog.csdn.net/yangxi_pekin/article/details/52523872

八、Robust
Robust插件对每个产品代码的每个函数都在编译打包阶段自动的插入了一段代码,插入过程对业务开发是完全透明。在Application中通过DexClassLoader,将补丁class文件事先加载,然后之后会调用新的class以替换旧apk中的bug class文件,通过反射进行新代码的调用,以达到热修复目的。大致流程如下图

优点:
1、高兼容和适配性,由于是java代码层面的替换调用,基本不涉及各个版本的适配和虚拟机的适配。
缺点:
1、由于对包体中的文件进行了代码侵入,对运行效率、方法数、包体积都有影响,文件方法数变多,企业级应用可能会涉及到65535的问题。
2、项目不够成熟,文档不够健全。

原文地址:https://www.cnblogs.com/zhujiabin/p/9944784.html

时间: 2024-11-02 12:52:02

关于Android热修复的几种解决方案的相关文章

Android热修复:Andfix和Hotfix,两种方案的比较与实现

Andfix和hotfix是两种android热修复框架. android的热修复技术我看的最早的应该是QQ空间团队的解决方案,后来真正需要了,才仔细调查,现在的方案中,阿里有两种Dexposed和Andfix框架,由于前一种不支持5.0以上android系统,所以阿里系的方案我们就看Andfix就好.Hotfix框架算是对上文提到的QQ空间团队理论实现.本文旨在写实现方案,捎带原理. Andfix 引入 框架官网:https://github.com/alibaba/AndFix 介绍是用英文

Android热修复——Tinker微信解决方案

Android的热修复 前言: 随着时代的发展,由于公司的项目需要去求变化平凡计划总赶不上变化,H5的高灵活性,开发周期短,更新速度快H5以及一些混合开发越来越被看好,然而主要原因之一:这种混合开发的方式容错率大,更新和修复BUG快.不用发布版本就可以让用户不觉的情况下就更新对应的内容或者BUG,我们不能否认混合开发的快捷,正在此前提下热修复和热更新技术也得到了非常大的发展,不管热修复还是热更新,都是对app的内容或者逻辑变化做出像web页面更新一样的体验.而本文只对热修复进行探索,不对H5进行

Android 热修复方案分析

绝大部分的APP项目其实都需要一个动态化方案,来应对线上紧急bug修复发新版本的高成本.之前有利用加壳,分拆两个dex结合DexClassLoader实现了一套全量更新的热更方案.实现原理在Android 基于Proxy/Delegate 实现bug热修复这篇博客中有分解.因为这套方案是在Java端实现,并且是全量更新所以兼容性较好,成功率较高.但是在线上跑了几个月之后就碰到了瓶颈,因为随着业务的增长分拆过之后的dex文件方法数也超过65535个,更换拆包方案的话维护成本太高.同时由于没有做差异

Android热修复框架汇总整理(Hotfix)

??Android平台出现了一些优秀的热更新方案,主要可以分为两类:一类是基于multidex的热更新框架,包括Nuwa.Tinker等:另一类就是native hook方案,如阿里开源的Andfix和Dexposed. 基于native hook的方案 ??需要针对dalvik虚拟机和art虚拟机做适配,需要考虑指令集的兼容问题,需要native代码支持,兼容性上会有一定的影响: 基于Multidex的方案 ??需要反射更改DexElements,改变Dex的加载顺序,这使得patch需要在下

聊聊Android 热修复Nuwa有哪些坑

原创地址:http://blog.csdn.net/sbsujjbcy/article/details/51028027 前面写了两篇关于Nuwa的文章 Android 热修复Nuwa的原理及Gradle插件源码解析 Android 热修复使用Gradle Plugin1.5改造Nuwa插件 然后我说了Nuwa有坑,有人就问Nuwa到底有哪些坑,这篇文章对自己在Nuwa上走过的坑做一个总结,如果你遇到了其他坑,欢迎留言,我会统一加到文章中去.当然有些也不算是Nuwa的坑,算是ClassLoade

Android热修复原理普及

Android热修复原理普及 这段时间比较难闲,就抽空研究一下Android热修复的原理.自从Android热修复这项技术出现之后,随之而现的是多种热修复方案的出现.前两天又看到一篇文章分析了几种热修复方案的比较. 原文地址是:[Android热修复] 技术方案的选型与验证 看完这篇文章,有点汗颜.有这么多的热修复方案,并且他们之间的实现原理也不一样,各有优缺点. 然后在尼古拉斯_赵四的博客中看到几篇关于热修复的文章,对着这几篇文章撸了一番.大概的了解了热修复一种原理,其思路和QQ空间提出的安卓

Android热修复学习之旅——HotFix完全解析

在上一篇博客Android热修复学习之旅开篇--热修复概述中,简单介绍了各个热修复框架的原理,本篇博客我将详细分析QQ空间热修复方案. Android dex分包原理介绍 QQ空间热修复方案基于Android dex分包基础之上,简单概述android dex分包的原理就是:就是把多个dex文件塞入到app的classloader之中,但是android dex拆包方案中的类是没有重复的,如果classes.dex和classes1.dex中有重复的类,当classes.dex和classes1

Android 热修复使用Gradle Plugin1.5改造Nuwa插件

随着谷歌的Gradle插件版本号的不断升级,Gradle插件如今最新的已经到了2.1.0-beta1,相应的依赖为com.android.tools.build:gradle:2.0.0-beta6,而Nuwa当时出来的时候,Gradle插件还仅仅是1.2.3版本号,相应的依赖为com.android.tools.build:gradle:1.2.3,当时的Nuwa是依据有无preDex这个Task进行hook做不同的逻辑处理,而随着Gradle插件版本号的不断增加,谷歌增加了一个新的接口能够用

Android热修复技术专题:来自微信、淘宝、支付宝、QQ空间的热修复方案

最近好多人都讨论关于热更新的话题,所以查询了一些资料看看 当一个App发布之后,突然发现了一个严重bug需要进行紧急修复,这时候公司各方就会忙得焦头烂额:重新打包App.测试.向各个应用市场和渠道换包.提示用户升级.用户下载.覆盖安装.有时候仅仅是为了修改了一行代码,也要付出巨大的成本进行换包和重新发布. 这时候就提出一个问题:有没有办法以补丁的方式动态修复紧急Bug,不再需要重新发布App,不再需要用户重新下载,覆盖安装?答案当然是有的,那就是最近涌现出来得热补丁方案,主要包括淘宝的Dexpo