前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android类加载之双亲委派机制

Android类加载之双亲委派机制

作者头像
码农帮派
发布2021-02-25 11:51:49
1.6K0
发布2021-02-25 11:51:49
举报
文章被收录于专栏:码农帮派码农帮派

下图是Java类加载的流程图:

我们定义一个CustomClassLoader加载器,去加载String.class文件的流程如下:

  • 1. CustomClassLoader会判断自己是否已经加载String.class,要是已经加载过了,就直接返回,要是没有加载过,则会委托给自己的parentClassLoader(PathClassLoader)尝试加载;
  • 2. PathClassLoader同样会判断自己是否加载过String.class,要是加载过则直接返回,反之则委派给自己的parentClassLoader(BootClassLoader);
  • 3. BootClassLoader同样会首先判断自己是否加载过,要是加载过直接返回,反之调用findClass方法进行加载;
  • 4. 加载成功则返回,要是BootClassLoader加载失败了,就会将加载任务向下交还给PathClassLoader进行加载;
  • 5. PathClassLoader同样调用findClass加载,要是加载失败了,则会向下交还给CustomClassLoader进行加载;

【注意】需要注意的是,每一级的ClassLoader进行.class文件的加载,都是从系统指定的路径中findClass进行加载(BootClassLoader和PathClassLoader),一般来说ClassLoader加载失败是因为当前ClassLoader的指定目录下没有该.class文件存在。

双亲委派的作用

  • 1. 防止同一个.class文件重复加载;
  • 2. 对于任意一个类确保在JVM中的唯一性。一个类在JVM中的唯一性是由加载它的ClassLoader和这个类的全名共同确立的;
  • 3. 保证系统类.class文件不能被篡改,通过双亲委派机制可以保证系统类的加载逻辑不会被篡改。

Android中使用的类加载器主要包括PathClassLoader和DexClassLoader两个,这两个加载器在Android8以后已经完全一样了,他们都是继承自BaseClassLoader。

Android中进行类加载的时候,最终会首先将所有的.class文件按照dex文件加载到dexElements数组中,这里的dex文件可以理解为一个文件夹,每个dex文件中包含多个.class文件,关于dex文件的加载,我们需要知道:

1. 当ClassLoader要加载一个class的时候,会通过findClass遍历当前的class文件在哪个dex文件中,然后加载该dex文件。这样做的缺点是当一个class在后面的dex文件夹中的时候,遍历加载起来就比较耗时。所以App在启动优化的时候,会将所有主页面用到的类全部放到第一个dex文件中,这样就可以提高App启动的速度;

2. ClassLoader在加载class的时候,要是有两个dex中包含了相同的.class文件,ClassLoader会按照顺序优先的原则加载class,即真正被加载的class是位置在前面的那个dex中的class文件。基于这一点可以实现Android代码热修复,我们可以将需要修复的class文件整体打包成一个dex文件,并放置到dexElements数组的最前面,这样就实现了类的替换加载的功能。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农帮派 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档