Android热修复三部曲之动态加载补丁.dex文件
转载请标明出处:
http://blog.csdn.net/lisdye2/article/details/52119602
本文出自:【Alex_MaHao的博客】
项目中的源码已经共享到github,有需要者请移步【Alex_MaHao的github】
该篇作为Andriod热修复三部曲的最后一篇,本篇基于前两篇
在之前的博客中,我们将.java
文件打成了三个.dex
文件
- classes.dex
:程序必须启动的类,保证没问题的(Application
,MainActivity
)
- classes2.dex
:业务逻辑的类,如果出问题了可以动态替换。
- classes3.dex
:jar包的类,基本上不会出现问题。
那么我们实现热修复的原理:
- 修改好代码之后打出无bug版的
classes2.dex
。 - 从服务器下载到移动端。
- 动态加载
classes2.dex
,实现覆盖。
如何动态加载.dex文件
在java中,ClassLoader
负责加载.class
文件。那么在Android
中同样存在这样的类即BaseDexClassLoader
.
因为其实存在于系统源码中的,我们可以看他的源码,有一个关键字段
/**
* Base class for common functionality between various dex-based
* {@link ClassLoader} implementations.
*/
public class BaseDexClassLoader extends ClassLoader {
private final DexPathList pathList; // 关键字段
/**
* Constructs an instance.
*
* @param dexPath the list of jar/apk files containing classes and
* resources, delimited by {@code File.pathSeparator}, which
* defaults to {@code ":"} on Android
* @param optimizedDirectory directory where optimized dex files
* should be written; may be {@code null}
* @param libraryPath the list of directories containing native
* libraries, delimited by {@code File.pathSeparator}; may be
* {@code null}
* @param parent the parent class loader
*/
public BaseDexClassLoader(String dexPath, File optimizedDirectory,
String libraryPath, ClassLoader parent) {
super(parent);
this.pathList = new DexPathList(this, dexPath, libraryPath, optimizedDirectory);
}
//...
}
贴了一部分代码,在BaseDexClassLoader
中有着很关键的字段DexPathList
,从命名上就能看出,其是存放.dex
文件的集合。看一下他的源码