热修复是在Android上一种越来越流行的技术,需要对底层原理有比较清晰的了解。今天看下几种主流热修复方案分析:

  • 为什么使用热修复

  • 使用热修复后

  • 热修复的流派

  • 主流的热修复方案分析

  • 对比分析

为什么使用热修复

  • 重新发布版本代价太大

  • 用户下载安装成本太高

  • BUG修复不及时,用户体验太差

使用热修复后

  • 无需重新发版,实时高效热修复

  • 用户无感知修复,无需下载新的应用,代价小

  • 修复成功率高,把损失降到最低

热修复流派

1、底层替换方案
底层替换方案限制颇多,但时效性最好,加载轻快,立即见效。
代表:支付宝的Andfix
2、类加载方案
类加载方案时效性差,需要重新冷启动才能见效,但修复范围广,限制少。
百度实现的HotFix、QQ空间补丁技术、Qfix方案、微信的Tinker方案
3、融合方案
两种方案的结合,优势互补。
Sophix

Andfix

AndFix的思想是直接更改修复的方法,就是找到这个类中需要修复的函数然后调用replaceMethod方法。在Native层使用指针替换的方式替换bug方法,以达到修复bug的目的。

优点:

  • BUG修复的即时性

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

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

局限性:

  • 只能基于方法修复,而且对平台的兼容性不佳,

  • 不支持新增字段,以及修改

    方法,也不支持对资源的替换。

QQ空间超级补丁技术

超级补丁技术原理是基于Android Dex分包方案的,而Dex分包方案的关键就是Android的ClassLoader体系。
关键点:DexClassLoader可以用来执行没有安装的程序代码

除了类加载问题之外还存在CLASS_ISPREVERIFIED标记的问题:
只要在static方法,构造方法,private方法,override方法中直接引用了其他dex中的类,那么这个类就不会被打上CLASS_ISPREVERIFIED标记。

解决方案:在所有类的构造函数中插入这行代码 System.out.println(AntilazyLoad.class);

超级补丁技术原理是基于Android Dex分包方案的,而Dex分包方案的关键就是Android的ClassLoader体系。把多个dex文件塞入到app的classloader之中android加载的时候,如果有多个dex文件中有相同的类,就会加载前面的类,原理就是把有问题的类替换掉,把需要的类放到最前面,达到热补的目的。

优势:

  • 没有合成整包(和微信Tinker比起来),产物比较小,比较灵活

  • 可以实现类替换,兼容性高

不足:

  • 不支持即时生效,必须通过重启才能生效。

  • 在ART模式下,如果类修改了结构,就会出现内存错乱的问题。为了解决这个问题,就必须把所有相关的调用类、父类子类等等全部加载到patch.dex中,导致补丁包异常的大,进一步增加应用启动加载的时候,耗时更加严重。

Tinker

  • Tinker也是Dex加载原理, 不同是,Tinker 下发新旧DEX的差异包,优化了DexDiff算法实现dexPatch体积更小。然后将差异包和旧包合成新dex之后进行dex的全量替换,避免了QQ补丁中的插桩操作。

  • 全量合成新dex,消除重复class重复带来的冲突

优势:

  • 合成整包,不用在构造函数插入代码。

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

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

不足:

  • 不支持即时生效,必须通过重启应用的方式才能生效。

  • 开启新的进程才能进行合并,并且很容易因为内存消耗等原因合并失败。

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

Sophix

Sophix的代码修复同时涵盖底层替换方案和类加载方案。在补丁生成阶段,补丁工具会根据实际代码变动情况进行自动选择,针对小修改,在底层替换方案限制范围内的,就直接采用底层替换修复方案,而对于代码修改超出底层替换限制的,会使用类加载替换,此时及时性没那么好。
另外,运行时阶段,Sophix还会再判断所运行的机型是否支持热修复,这样即使补丁支持热修复,但由于机型底层虚拟机构造不支持,还是会走类加载修复,从而达到最好的兼容性。

Sophix资源修复方案,优越性超过了Google官方的Instant Run方案。整个资源替换的方案优势在于:

  1. 不修改AssetManager的引用处,替换更快更完全。(对比Instanat Run以及所有copycat的实现)

  2. 不必下发完整包,补丁包中只包含有变动的资源。(对比Instanat Run、Amigo等方式的实现)

  3. 不需要在运行时合成完整包。不占用运行时计算和内存资源。(对比Tinker的实现)

So修复:类似类修复反射注入方式。把补丁so库的路径插入到nativeLibraryDirectories数组的最前面,就能够达到加载so库的时候是补丁so库,而不是原来so库的目录,从而达到修复的目的。采用这种方案,完全由Sophix在启动期间反射注入patch中的so库

优点:
  1、Sophix集成简单,不需要配置繁琐的各种参数。
  2、Sophix支持即时生效(事实上我第一次运行first版本后,直接就弹出了toast,而此时后台数据显示设备加载成功数为1,设备推送成功数为0)。
  3、Sophix支持run instant,而tinker不支持。编译中不支持run instant,速度大大降低!
  4、Sophix的补丁是基于阿里自身的SophixPatchTool打包生成,不是在AS中生成的,有种解耦的感觉,而且不需要备份太多的版本。

缺点:
  处于公测阶段,可能面临收费

热修复框架对比

参考资料:

https://github.com/alibaba/AndFix
https://github.com/dodola/HotFix
https://github.com/Tencent/tinker
https://github.com/jasonross/Nuwa
https://github.com/bunnyblue/DroidFix
http://blog.csdn.net/u013795543/article/details/73250166

几种主流热修复方案分析相关推荐

  1. Android 热修复方案分析

    绝大部分的APP项目其实都需要一个动态化方案,来应对线上紧急bug修复发新版本的高成本.之前有利用加壳,分拆两个dex结合DexClassLoader实现了一套全量更新的热更方案.实现原理在Andro ...

  2. Android热更新五:四大热修复方案对比分析

    很早之前就想深入的研究和学习一下热修复,由于时间的原因一直拖着,现在才执笔弄起来. Android而更新系列: Android热更新一:JAVA的类加载机制 Android热更新二:理解Java反射 ...

  3. 干货满满,Android热修复方案介绍

    摘要:在云栖社区技术直播中,阿里云客户端工程师李亚洲(毕言)从技术原理层面解析和比较了业界几大热修复方案,揭开了Qxxx方案.Instant Run以及阿里Sophix等热修复方案的神秘面纱,帮助大家 ...

  4. 各大热补丁方案分析和比较

    markzhai's home 首页 分类 关于 归档 标签 各大热补丁方案分析和比较 发表于 2015-11-20   |   分类于 android   |   11条评论 最近开源界涌现了很多热 ...

  5. Android App 线上热修复方案

    热修复一词恐怕最早应用在微软.为了巩固其windows系统和office的市场占有率,微软开发并维护了一套线上修复方案,用于修复漏洞及特定问题(LDR),避免延续到发版解决(GDR),详见HotFix ...

  6. (4.2.32)各大热补丁方案分析和比较

    选自: [腾讯bugly干货分享]微信Android热补丁实践演进之路 各大热补丁方案分析和比较 继插件化后,热补丁技术在2015年开始爆发,目前已经是非常热门的Android开发技术.其中比较著名的 ...

  7. Robust热修复方案实现原理

    前言 本文旨在通过分析源码一步步分析Robust热修复的实现原理,前半部分首先分析一下Robust思路中运用到的技术方案:后半部分多为源码部分,即Robust对于技术方案的实现与运用. 1.关于Rob ...

  8. Android 热修复方案Tinker(五) SO补丁加载

    基于Tinker V1.7.5 Android 热修复方案Tinker(一) Application改造 Android 热修复方案Tinker(二) 补丁加载流程 Android 热修复方案Tink ...

  9. 【云栖风向标】VOL.5:横空出世!热修复方案Sophix

    摘要:业界首个非侵入式热修复方案重磅推出,颠覆移动端传统更新流程!阿里妈妈首次公开自研CTR预估核心算法MLR-更多新鲜云资讯,尽在云栖风向标! 本期目录 1. 业界首个非侵入式热修复方案Sophix ...

  10. Android App 线上热修复方案Xposed

    热修复一词恐怕最早应用在微软.为了巩固其windows系统和office的市场占有率,微软开发并维护了一套线上修复方案,用于修复漏洞及特定问题(LDR),避免延续到发版解决(GDR),详见HotFix ...

最新文章

  1. gym102443 D.Guess the Path
  2. 如何在centos7上网卡名称回归传统
  3. Sql Server系列:触发器
  4. Windows下phpStudy中的Apache无法启动的排查方法
  5. 成为Web开发大师你必须知道的7件事情
  6. 通过IP地址查计算机名
  7. 博士申请 | 哥本哈根大学招收机器学习和信息检索全奖博士生(年薪34万)
  8. [MEGA DEAL] 2020年完整的Java Master Class Bundle(96%)
  9. 启动文件、简单的消息框
  10. Vue调试工具 vue-devtools的安装
  11. 测试工程师应懂的Python知识
  12. 使用多进程、多线程、gevent完成http服务器
  13. 关于排队模型的一些名词解释(随笔)
  14. masquerade词根词缀_词根词缀总结
  15. 解密阿里云安全女程序员维棠 、牵尘代码诗! 1
  16. headfirst 笔记 第七章
  17. DataMatrix二维码识别 Halcon 同类软件 Malcon 机器视觉软件 案例讲解 FindDataCode2d
  18. 黑白照片修复彩色软件免费有哪些?分享这三个实用的软件给你
  19. 基于MPLS的虚拟专用网络 应用场景
  20. 大楼通信综合布线系统_认识一下综合布线系统工程常用的线材及设备,最全的综合布线...

热门文章

  1. Pannellum:实例之为全景图添加标题和作者
  2. C++_你真的知道++i 和 i++的区别吗?_左值/右值/右值引用
  3. 随手记_英语_学术写作_常用句型35个
  4. 数值分析(1)-绪论:误差
  5. 分布式存储系统学习笔记(二)—分布式文件系统(4)—内容分发网络(CDN)
  6. 神经网络模型参数的压缩
  7. 【bzoj2654】tree(二分+MST)
  8. 什么是shell? bash和shell有什么关系?
  9. ASP.net C# EVal关于前端绑定
  10. 智慧解析第19集:老子开导你