Android热修复系列(二):代码热修复技术原理

上篇讲到代码修复技术分为两类:底层替换热修复类加载热修复
这篇主要是对这两者底层原理的学习。


一、底层替换热修复原理

1. 即时生效的Andfix

简单概括下Andfix:
众多热修复技术中,Andfix做到了非常炫酷的即时生效功能,无需重启应用就可以修复类中的方法,同时他也存在无法适配某些机型的缺点。

他的核心方法在于replaceMethod函数中:

我们来看一下Andfix热修复的大概流程:

上面能看到,对方法修改完全依赖于ArtMethod指针。而指针完全是通过对虚拟机底层的ArtMethod真实地址进行强转得到的。这造成了一个非常麻烦的问题。
Andfix底层强转使用的ArtMethod对象并不是真机中底层的ArtMethod类,而是根据Android开源的代码,自己写死的,和原生一模一样的类。
如果,厂商修改了底层的ArtMethod代码,两者就会不匹配,替换机制就会出现问题。

Andfix替换机制

Andfix的替换本质是对方法的逐一替换,并且只能平行替换,一旦虚拟机底层ArtMethod方法数产生改变,就会产生“错位”,无法进行热修复。
所以,Sophix为了解决这一问题,采用了将底层ArtMethod全部替换的方式。

Sophix替换机制

2. Sophix的化繁为简

Sophix将替换方法,浓缩成了下面一句话:
ArtMethod替换方法

这句话的意思是从dmeth(内存源地址)拷贝sizeof(ArtMethod)smeth(目标起始地址),显然搞定这句话的难点在于如何获取ArtMethod的大小。如果ArtMethod的size出现误差,热修复就肯定失败了,会出现不可预期的错误。

那么,如何在应用层获取ArtMethod的正确大小呢?

art初始化类时会给类中所有的方法分配空间

他的底层是一个数组,通过ptr指针给ArtMethod分配空间

由于ArtMethod在art中是紧密排列的,这样就能通过自己构建一个类,里面拥有两个静态方法,去计算两个静态方法之间的差值,从而获得ArtMethod的大小。

这样我们就能完美替换每个ArtMethod了。这种替换方式完全可以忽视各个厂商底层的差异,包括所有Android版本的差异,兼容和稳定性都非常好。但是同时也会引发一些问题。

  • 访问权限问题
  1. 方法调用时权限检查
    构造函数在调用同一个类的私有方法时,没有做任何检查,也就是说调换方法之后,只要确认两个方法属于同一个类,就不会产生权限问题。
  2. 同名包下的权限问题
    在替换类的时候,补丁包和原包所用的ClassLoader不是同一个ClassLoader,导致判别两者包名不一致,出现没有访问权限的问题。
    抛出异常:

    源码中的classLoader判断:

解决方法:将原包的ClassLoader赋值给补丁包的ClassLoader
  1. 反射调用非静态方法
    反射过程中,底层会调用InvokeMethod,在反射的过程中会去验证调用方法的对象方法所属的对象,如果其中有一项不匹配就会抛出异常

静态方法就不会出现类似问题,因为调用静态方法是不需要对象实例作为参数的。

目前,这种热修复引起的反射问题,只能通过冷启动修复解决。

3. 底层替换热修复的痛点

1)只能替换方法,对方法数有严格限制,替换类中对已经存在的方法不能增加或者减少。当然新添加类,不会产生问题。
2)修复后的类中方法,被反射调用。

二、冷启动修复原理

1.冷启动修复简述

冷启动修复很好的弥补了底层替换热修复的痛点,不仅替换类的方法数不受限制,同时反射也能正常调用非静态方法。很合适和底层替换热修复配合使用。

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

推荐阅读更多精彩内容