一:Android中有哪几种ClassLoader?他们的作用和区别是什么?
什么是ClassLoader
ClassLoader类加载器。每个java程序都是由class类组成的,只有把这些class类加载到JVM中,程序才能够运行。那么,用来加载这些类的就是ClassLoader类加载器。
Android中有哪几种ClassLoader?
ClassLoader直接实现的子类有BaseDexClassLoader和SecureClassLoader
[图片上传失败...(image-feb9a6-1573793119305)]
而BaseDexClassLoader的子类又有如下几个:
PathClassLoader、DexClassLoader、InMemoryDexClassLoader
SecureClassLoader有一个子类:URLClassLoader,只能用来加载jar文件(Android平台用不了?)
PathClassLoader
在应用启动时创建,用来加载app安装路径下的apk文件。
PathClassLoader有两个构造方法
对应参数的含义:
dexPath:String类型;代表包含dex的jar或者apk文件路径集
libraryPath:String类型;代表包含C、C++库的路经集合
parent:代表PathClassLoader的父类,遵从双亲委托模型
DexClassLoader
加载SD卡上的class.dex、jar、或apk文件。
DexClassLoader有一个构造方法:
对应参数的含义:
dexPath:String类型 ;包含class.dex、jar、apk的文件路径集
optimizedDirectory:String类型;用来缓存需要加载的dex文件,并创建一个DexFile对象,如果为null,会直接使用dex文件原有路径创建DexFile;
这个参数已经弃用,自API26起无效;
librarySearchPath:String类型;包含C、C++库,可以为空;
parent:DexClassLaoder的父类加载器,遵守双亲委托模型
InMemoryDexClassLoader
从内存中直接加载class
有两个构造函数
其中
dexBuffers: ByteBuffer数组;包含buffer.position 和 buffer.limit之间的dex文件缓存数组
dexBuffer:包含buffer.position 和 buffer.limit之间的dex文件
parent:其父类,遵守双亲委托机制
URLClassLoader
从指向JAR文件和目录的URL的搜索路径加载类和资源。
区别
PathClassLoader:只能加载系统中已经安装过的apk
DexClassLoader:能够加载未安装的jar/apk/dex
InMemoryDexClassLoader:加载缓存中的dex文件或文件集
URLClassLoader:从指向JAR文件和目录的URL的搜索路径加载类和资源。
二:双亲委托
通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。
那么我们使用双亲委托模式有什么好处呢?
1.因为这样可以避免重复加载,当父亲已经加载了该类的时候,就没有必要子ClassLoader再加载一次。
2.考虑到安全因素,我们试想一下,如果不使用这种委托模式,那我们就可以随时使用自定义的String来动态替代java核心api中定义类型,这样会存在非常大的安全隐患,而双亲委托的方式,就可以避免这种情况,因为String已经在启动时被加载,所以用户自定义类是无法加载一个自定义的ClassLoader。
三:热修复原理
简述双亲委托模型在热修复领域的应用
首先,什么是热修复?
热修复就是不卸载重新安装应用的情况下,神不知鬼不觉的修改好bug。
正经的,热修复框架核心技术有三类:
代码修复
资源修复
动态链接库修复
那么双亲委托模型在热修复领域主要是代码修复中的类加载修复方案。
假设现在用户的手机上apk中某一个类出现了问题,现在需要去修复,使用类加载方案让ClassLoader去重新加载新的类,主要加载到了一定会返回这个类,那么有问题的类就不会被加载。但是有一个需要注意的是,这个不能及时生效,需要重启App.