Android的ClassLoader与java的ClassLoader有些差异,
ClassLoader.png
双亲委托机制
某个类加载器在加载类时,首先将加载任务委托给父 - 类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务或者没有父类加载器时,才自己去加载。
image.png
好处是:
1、避免重复加载,当父加载器已经加载了该类的时候,就没有必要子ClassLoader再加载一次。
2、安全性考虑,防止核心API库被随意篡改。
类查找流程.png
热修复流程.png
1、获取到当前应用的PathClassloader;
2、反射获取到DexPathList属性对象pathList;
3、反射修改pathList的dexElements
1)把补丁包patch.dex转化为Element[] (patch)
2)获得pathList的dexElements属性(old)
3)patch+old合并,并反射赋值给pathList的dexElements
image.png
在不同的版本中可能不是makePathElement,或者参数会不同,需要适配!
image.png
网友评论