简述插件化类加载原理 ?
参考答案:
插件化类加载原理主要是基于动态加载和Java虚拟机中的内存存储机制。在插件化开发中,宿主模块和插件模块可以分开进行编译,二者之间互不影响,各个模块可以并发进行开发。宿主模块可以动态更新插件,这种动态加载是插件化开发的核心。
在Java虚拟机中,通过ClassLoader可以动态地加载类。类加载器之间存在继承关系,一般宿主apk通过PathClassLoader进行加载,插件apk通过DexClassLoader进行加载。当宿主apk启动时,类加载顺序最终会调用到宿主dexElements。为了实现插件化,我们使用DexClassLoader加载插件apk后,利用反射获取插件的dexElements,然后拷贝到宿主的dexElements。这样,宿主apk就具有了插件apk的dexElements信息,也就可以在宿主apk内利用反射调用到插件的类、方法等。
在类加载过程中,宿主程序的ClassLoader最终继承自BaseDexClassLoader,BaseDexClassLoader通过DexPathList进行类的查找过程。这个查找过程是通过遍历一个dexElements的数组完成的。我们把插件dex添加进这个数组,从而让宿主ClassLoader获取了加载插件类的能力。
总的来说,插件化类加载原理是通过动态加载和类加载器的继承关系,将插件apk的dexElements信息合并到宿主apk的dexElements中,从而实现宿主apk对插件apk的类、方法等的动态调用。