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

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值