Android热修复【主流技术对比】

三分钟的介绍

热修复技术,可以看做是Android平台发展成熟至一定阶段的必然产物。热修复无疑是这2年较火的新技术,是作为安卓工程师必学的技能之一。在热修复出现之前,一个已经上线的app中如果出现了bug,即使是一个非常小的bug,不及时更新的话有可能存在风险,若要及时更新就得将app重新打包发布到应用市场后,让用户再一次下载,这样就大大降低了用户体验,当热修复出现之后,这样的问题就不再是问题了。

国内大部分成熟的主流APP都拥有自己的热更新技术,像手淘、支付宝、微信、QQ、饿了么、美团等。

先来看一下对比图


热修复对比

热修复技术实现的原理(AndFix)

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

AndFix

AndFix的原理就是方法的替换,把有bug的方法替换成补丁文件中的方法。在Native动态替换Java层的方法,通过Native层hook Java层的代码


AndFix使用

优点:
1.BUG修复的即时性
2.补丁包同样采用差量技术,生成的PATCH体积小
3.对应用无侵入,几乎无性能损耗

不足:
1.不支持新增字段,以及修改方法,也不支持对资源的替换。
2.由于厂商的自定义ROM,对少数机型暂不支持。兼容性差。

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

热修复技术实现的原理(Hotfix)

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

热修复技术实现的原理(Sophix)

阿里百川Hotfix其实是阿里手机淘宝根据对Andfix的使用,对相关业务解偶后推出的,所以Andfix的缺点它也有。而且阿里已经在此基础上推出了更好的替代方案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

阿里推出这个方案的同时出了本关于热修复的书,不止介绍了这个项目,而且介绍了很多热修复的原理,和在探索热修复时的一些思考,觉得还是值得好好看下的,地址在这里:
深入探索Android热修复技术原理

阿里系的热修复对比

热修复技术实现的原理(美团Robust)

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


Robust

美团的官方地址:
https://tech.meituan.com/2016/09/14/android-robust.html

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

热修复技术实现的原理(QQ空间)

QQ空间基于的是dex分包方案。把BUG方法修复以后,放到一个单独的dex补丁文件,让程序运行期间加载dex补丁,执行修复后的方法。如何做到这一点?

在Android中所有我们运行期间需要的类都是由ClassLoader(类加载器)进行加载。
因此让ClassLoader加载全新的类替换掉出现Bug的类即可完成热修复。

图片6.png

热修复技术实现的原理(Tinker)

重启生效、反射、类加载、DexDiff

项目官网:http://www.tinkerpatch.com/

Tinker 是开源项目Github的地址:https://github.com/Tencent/tinker
微信针对QQ空间超级补丁技术的不足提出了一个提供DEX差量包,整体替换DEX的方案。主要的原理是与QQ空间超级补丁技术基本相同,区别在于不再将patch.dex增加到elements数组中,而是差量的方式给出patch.dex,然后将patch.dex与应用的classes.dex合并,然后整体替换掉旧的DEX,达到修复的目的。(差分包,腾讯根据增量更新bspatch自己开发了一个dexdiff针对dex格式的,bsdiff算法计算差分与格式无关,基于二进制的,产物不稳定)跟QQ空间的区别主要在于补丁包的生成不一样,后面拿到补丁包后是一样的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容