Android热修复主流框架调研

实际需求

  1. 能解决大部分紧急修复场景。
  2. 用户无感知。冷/热启动,生效所耗时长及资源(性能),patch体积。
  3. apk无感知。对原有项目侵入性低。

以下是目前流行的四个方案:Tinker/Andfix/Robust/QQ空间

1. 微信Tinker

  • 优点
  1. 支持布局及资源文件的修改
  2. 可修改类的private方法及变量
  3. 官方称成功率挺高
  4. 可设置一些Log/reporter/exceptionHandler进行补丁加载结果的干预。定制化程度高。
  5. 支持混淆及多渠道打包
  6. Dalvik全量合成新的Dex,那样既不出现Art地址错乱的问题,在Dalvik也无须插桩,解决了插桩带来的性能损耗;Art平台合成small dex,解决了全量合成方案占用Rom体积大, OTA升级以及Android N的问题;有效防止了qq空间导致的加载效率下降问题,但是打开时很耗资源。
  7. 大部分情况下补丁仅仅1-20K,解决由于补丁包可能过大的问题;
  8. Tinker目前维护团队是3人,一直有更新。Andfix从去年年底没更新过。
  • 缺点
  1. 不支持即时生效;
  2. 需要给应用开启新的进程才能进行合并,并且很容易因为内存消耗等原因合并失败;
  3. 合并时占用额外磁盘空间,对于多DEX的应用来说,如果修改了多个DEX文件,就需要下发多个patch.dex与对应的classes.dex进行合并操作时,这种情况会更严重。
  • 不足
  1. Tinker库中不能修改的类一共有26个,即com.tencent.tinker.loader.*类。加上Appliction类,只有26个类是无法通过Tinker来修改的。支持ApplicationLike代理类的修改。
  2. 生效时间需要13秒左右(估计是合成dex的时间),第一次加载成功后可选择是否立即自动杀掉应用。

官方说法
由于原理与系统限制,Tinker有以下已知问题:
1.Tinker不支持修改AndroidManifest.xml,Tinker不支持新增四大组件;
2.由于Google Play的开发者条款限制,不建议在GP渠道动态更新代码;
3.在Android N上,补丁对应用启动时间有轻微的影响;
4.不支持部分三星android-21机型,加载补丁时会主动抛出"TinkerRuntimeException:checkDexInstall failed";
5.对于资源替换,不支持修改remoteView。例如transition动画,notification icon以及桌面图标。

  • 使用提示
  1. 补丁升级

    补丁升级
    补丁升级

  2. 优化冷启动的体验
    为了加快补丁应用同时保持用户体验,在SampleResultService.java在应用退入后台或手机灭屏时,才杀掉进程。你也可以在杀掉进程前,直接通过发送broadcast或serviceIntent的方式尽快的重启进程。

2. 阿里andfix

  • 优点
  1. 即时生效;
  2. 不侵入打包, 性能无损耗;
  3. 应用广,兼容性问题不大。
  • 缺点
  1. 成功率在50%左右。
  2. 不支持新增类方法/字段,以及修改<init>方法,也不支持对资源的替换。
  3. 未来维护性低。
  • 原理
    底层替换方案是在已经加载了的类中直接替换掉原有方法,是在原有类的基础上进行修改的。因而无法实现对原有类进行方法和字段的增减,这样将破坏原有类的结构。
    主要是修改虚拟机方法实体的具体字段,运行时在Native修改Filed指针的方式,实现方法的替换

  • 流程
    1.app初始化时加载当前版本下的所有apatch文件。
    2.通过注解获取到补丁文件的补丁方法。
    3.通过反射获取对应的bugMethd.
    4.通过c++层,拿到库文件句柄,并得到对应文件的class对象,得到新旧方法的指针,最后将新方法指针指向目标方。
    备注: 在加载类时跳过了类装载过程直接设置为初始化完毕,所以不支持新增静态变量和方法。

  • 使用说明
    如果之前版本存在bug,并且添加过对应的bug补丁的,再次升级的需要把bug修复,此时需要将init中对应的版本号也需要升级,不然会加载之前存放在data中的补丁文件。

  • 修复能力

  • 补丁注意事项
    1.如果之前版本存在bug,并且添加过对应的bug补丁的,再次升级的需要把bug修复,此时需要将init中对应的版本号也需要升级,不然会加载之前存放在data中的补丁文件。
    2.一个补丁文件可以修复多个bug。
    3.如果一个版本第一次加载了补丁,第二次修改另外一个bug,补丁仍然是相同的名字,那么此次新添加的补丁将无效就需要删除之前的补丁。但是可以同时存在多个不一样名字的补丁,并且加载按照时间顺序来加载。

3. 美团Robust

  • 优点
    兼容性高,未反射注入,实时生效。

  • 缺点

  1. 原来能被ProGuard内联的函数不能被内联了,所以可能导致方法数的增加,原来没超过65536但是后面可能就操作了65536限制,同时apk的体积也会一定程度的增大;
  2. so和资源的替换暂时不支持;
  3. 侵入式打包。在编译阶段有插件侵入了产品代码,对运行效率、方法数、包体积还是产生了一些副作用。这也是我们下一步努力的方向。

4. QQ空间

  • 优点
    兼容性高。实现更加友好的类替换。(不太懂实现手段)

  • 缺点

  1. 不支持实时生效;
  2. davilk下类加载性能问题;
  3. art下补丁包包很大;
  4. 侵入式打包。采用插桩的方式给所有类插入不会真正运行的代码,防止类打上 preverify 标志。

Sophix及热修复原理可查阅
Sophix及热修复原理介绍

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

推荐阅读更多精彩内容