Android开发中,热修复技术被越来越多的开发者使用,市面上也出现很多成熟的开源框架。但对大部分开发者来说,热修复依然是一个既熟悉又陌生的词。仅仅知道热修复的作用,会使用框架,那样意义并不大。我们还要知道热修复的原理,这样不管框架如何变化,只要基本原理不变,我们都可以快速掌握它,或者自己动手写一个适合项目的热修复框架。
热修复介绍
1.开发流程
![](https://img.haomeiwen.com/i17537001/2ce6678c793adb5c.png)
当项目出现紧急bug时,传统的开发流程是发布新版本,引导用户覆盖安装。抛开平台审核上线的时间不说,一天重复下载安装至少两次的用户体验是很差的。而热修复的出现完美解决了这个问题,用户在收到服务器推送过来的修复包后,在项目运行时进行修复。整个过程是在用户无感知状态下完成,也无需下载相对来说较大的安装包,代价小。
总结为两个优点:
- 无需重新发版,修复效率高
- 用户无感知,代价小
2.都能修复什么
- 资源修复
- 代码修复
- so库修复
3.代码修复技术分类
目前最主要有三种方案:
- 基于类加载与 Dex 分包方案,进行 Dex 插桩/替换
- Native Hook 进行底层替换
- Install Run 进行类的注入
由于国内手机厂商定制系统的多样,Dex 插桩/替换是我认为最适合的方案。
Dex插桩原理
ClassLoader 是通过调用 findClass 方法,在 pathList 对象中的 dexElements[] 中遍历dex文件寻找相关的类。由于靠前的dex会优先被系统调用,所以就有了插桩的概念。将修复好的 dex 插入到 dexElements[] 的最前方,这样系统就会调用修复好的插入类而不是靠后的 bug 类。
![](https://img.haomeiwen.com/i17537001/5041f91d3a85ede5.png)
上图中,patch.dex 是插入的 dex ,classes2.dex 是原有的 bug dex。ClassLoader 在遍历时优先获取了 patch.dex 中的 D.class ,所以 classes2.dex 中的 D.class 就不会被调用,这样就完成了对 D.class 的替换,修复了bug。
本文简单介绍了代码修复的技术原理,本文如果有出现错误的地方也请帮忙在评论区指出,共同学习进步,谢谢大家。
想学习更多Android知识,或者获取相关资料请加入Android开发交流群:1018342383。 有面试资源系统整理分享,Java语言进阶和Kotlin语言与Android相关技术内核,APP开发框架知识, 360°Android App全方位性能优化。Android前沿技术,高级UI、Gradle、RxJava、小程序、Hybrid、 移动架构师专题项目实战环节、React Native、等技术教程!架构师课程、NDK模块开发、 Flutter等全方面的 Android高级实践技术讲解。还有在线答疑
网友评论