Android的classLoader

Android的classLoader


1、BootClassLoader和java中的boostrap相似 用来加载Android framework层class字节码文件

2、PathClassLoader和java中的APPclassLoader相似,已经安装到系统的apk文件中的class文件。

3、DexClassLoader和java中customclassLoader相似,用来加载指定路径下class字节码文件

4、BaseDexClassLoader是我们一个父类classLoader,像我们的pathClassLoader和dexClassloader都是继承BaseDexClassLoader。

一个APP运行的话至少需要BootClassLoader、PathClassLoader两个classLoader。

classLoader加载特点:

1、双亲代理模式:classLoader在加载字节码的时候首先会询问当前的classLoader是否加载过此类,如果已经加载过就直接返回,不再重复去加载;如果没有的话,它会查询它的parent是否加载过此类,如果已经加载过就直接返回parent加载过的字节码文件;

而在整个继承路线上classLoader都没有加载过呢最终才又它的子classLoader去加载。

如果一个类被位于树中的任意一个节点加载过,这个类都不会被重新加载,大大提高了加载类的一个效率。

2、类加载共享:我们的framework底层类,一旦被我们的顶层classLoader加载过,那么他就会缓存在内存当中,以后我们任何地方用到,都不需要重新加载了。

3、类加载隔离:不同继承路线的classLoader加载的类肯定不是同一个类。

源码类的查找过程总结:首先我们类的load都是在我们classLoader的loadclass方法中完成的,在loadclass中它会首先判断这个是否被我们自己或者双亲已经在加载过了,如果已经加载过,那么我们就直接使用这个类,如果没有加载过它会调用loadclass的findclass方法去寻找这个类,它会最终调用BaseDexClassLoader这个方法去完成我们的寻找,而BaseDexClassLoader这个方法呢其实又是调用DexPathList这个类的findClass方法,而且我们DexPathList除了可以提供findClass这个方法以外,它还完成了一个非常重要的一个工作,就是将所有的dex文件转化成dexFile,并且通过makedexElement这个方法呢把它转化成一个element数组,有了这个所有dex文件的数组呢,它的findclass就可以遍历这个数组找到其中的每一个dexFile,然后最终调用每一个dexFile中的loadClassBinaryName方法去完成我们每一个class的一个寻找。而我们loadClassBinaryName最终又是通过defineClassNative这个native方法去完成我们真正的一个类的查找,这就是我们整个classLoader类的查找的一个过程。

ClassLoader:loadClass()

||

BaseDexClassLoader:findClass()

||

DexPathList:findClass()

||

DexFile:loadClassBinaryNative()

发布了36 篇原创文章 · 获赞 19 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/j18874964028sss/article/details/78534440
今日推荐