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