Android中有哪几种ClassLoader?它们的作用和区别是什么?
- BootClassLoader
BootClassLoader是ClassLoader内部类,是Android平台上所有ClassLoader的最终parent,这个内部类是包内可见,所以我们没法使用。 - PathClassLoader
PathClassLoader只能加载已安装的apk的dex,用来加载Android系统类和应用的类,不建议开发者使用 - DexClassLoader
DexClassLoader可以加载jar/apk/dex,也可以从SD卡中加载未安装的apk,动态加载、热修复等技术就是靠它来实现的
简述ClassLoader的双亲委托模型
某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。
双亲委托模型的好处是防止内存中出现多份同样的字节码,避免重复加载,比较安全
简述双亲委托模型在热修复领域的应用
一个ClassLoader可以包含多个dex文件,每个dex文件是一个Element,多个dex文件排列成一个有序的数组dexElements,ClassLoader会按照顺序依次遍历数组加载类,根据双亲委托模型,若一个dex已经被加载过,则不会再加载之后重复的dex,因此,只要把有问题的类修复后,放到一个单独的dex,通过反射插入到dexElements数组的最前面,这样在ClassLoader加载的时候会先加载已经修复好的dex,后面有bug的dex就不会被加载了
网友评论