Android开发中,热修复技术被越来越多的开发者使用,市面上也出现很多成熟的开源框架。但对大部分开发者来说,热修复依然是一个既熟悉又陌生的词。仅仅知道热修复的作用,会使用框架,那样意义并不大。我们还要知道热修复的原理,这样不管框架如何变化,只要基本原理不变,我们都可以快速掌握它,或者自己动手写一个适合项目的热修复框架。
热修复介绍
1.开发流程
当项目出现紧急bug时,传统的开发流程是发布新版本,引导用户覆盖安装。抛开平台审核上线的时间不说,一天重复下载安装至少两次的用户体验是很差的。而热修复的出现完美解决了这个问题,用户在收到服务器推送过来的修复包后,在项目运行时进行修复。整个过程是在用户无感知状态下完成,也无需下载相对来说较大的安装包,代价小。
总结为两个优点:
- 无需重新发版,修复效率高
- 用户无感知,代价小
2.都能修复什么
- 资源修复
- 代码修复
- so库修复
3.代码修复技术分类
目前最主要有三种方案:
- 基于类加载与 Dex 分包方案,进行 Dex 插桩/替换
- Native Hook 进行底层替换
- Install Run 进行类的注入
由于国内手机厂商定制系统的多样,Dex 插桩/替换是我认为最适合的方案。
Dex插桩原理
ClassLoader 是通过调用 findClass 方法,在 pathList 对象中的 dexElements[] 中遍历dex文件寻找相关的类。由于靠前的dex会优先被系统调用,所以就有了插桩的概念。将修复好的 dex 插入到 dexElements[] 的最前方,这样系统就会调用修复好的插入类而不是靠后的 bug 类。
上图中,patch.dex 是插入的 dex ,classes2.dex 是原有的 bug dex。ClassLoader 在遍历时优先获取了 patch.dex 中的 D.class ,所以 classes2.dex 中的 D.class 就不会被调用,这样就完成了对 D.class 的替换,修复了bug。
本文简单介绍了代码修复的技术原理,下篇文章将从系统源码入手,结合我自己封装的代码修复开源框架Fettler,详细解读代码修复的每一个过程。本文如果有出现错误的地方也请帮忙在评论区指出,共同学习进步,谢谢大家。