美文网首页
Android的classLoader

Android的classLoader

作者: 蒋帅Android | 来源:发表于2017-12-01 21:25 被阅读0次

    image
    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()

    相关文章

      网友评论

          本文标题:Android的classLoader

          本文链接:https://www.haomeiwen.com/subject/ztcgbxtx.html