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