Android中有哪几种ClassLoader?它们的作用和区别是什么?
BootClassLoader
BootClassLoader是ClassLoader内部类,是Android平台上所有ClassLoader的最终parent,这个内部类是包内可见,所以我们没法使用。
PathClassLoader
PathClassLoader只能加载已安装的apk的dex,用来加载Android系统类和应用的类,不建议开发者使用
DexClassLoader
DexClassLoader可以加载jar/apk/dex,也可以从SD卡中加载未安装的apk,动态加载、热修复等技术就是靠它来实现的.AndFix就是直接使用里面的DexFile直接加载dex文件
InMemoryDexClassLoader
Android O中新添加的,用来加载内存中的dex文件的
简述ClassLoader的双亲委托模型
如果一个类加载器收到了类加载的请求,他首先不会自己去尝试加
载这个类,而是把这个请求委托给自己的父加载器,每一层的类加
载器都是如此,因此所有的类加载请求最终都应该传送到顶层
Bootstrap ClassLoader中,只有当父加载器反馈自己无法完成加载
请求时,子加载器才会尝试自己加载。
双亲委托在热修复领域的应用
热修复可以利用BaseDexClassLoader中的pathList对象,pathList中
包含一个DexFile的集合dexElements,我们可以在这个dexElements
中去做一些事情,比如在这个数组的第一个元素放置我们的
patch.jar,里面包含修复过的类。这样的话,当遍历findClass的时
候,我们修复的类就会被查找到,由于双亲委托机制,先加载到修复过的类后,就不会加载有bug的类
网友评论