Android中的ClassLoader 和 热修复

本文详细介绍了Android中的五种ClassLoader:BootClassLoader、UrlClassLoader、PathClassLoader、DexClassLoader和InMemoryDexClassLoader。解释了每种类加载器的作用、区别及其实现原理,并探讨了双亲委托模型的工作机制及其在热修复领域的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、Android中有哪几种ClassLoader?它们的作用和区别是什么?

是什么:

ClassLoader是用来加载dex文件到DVM、ART虚拟机中


Android 中 ClassLoader 一共有5种 分别为BootClassLoader ,UrlClassLoader, PathClassLoader, DexClassLoader,InMemoryDexClassLoader。

其中 BootClassLoader,BeseDexClassLoader,SecureClassLoader 继承自 ClassLoader。

UrlClassLoader继承自SecureClassLoader

InmemoryDexClassLoader,PathClassLoader,DexClassLoader继承自 BaseDexClassLoader


  1. ClassLoader是一个抽象类,定义了ClassLoader的主要功能
  2. BootClassLoader是ClassLoader的内部类,也继承自ClassLoader,我们在应用程序中不能直接调用
  3. SecureClassLoader 他继承了ClassLoader ,但并不是ClassLoader的实现类,而是拓展了ClassLoader类,加入了权限方面的声明。加强了ClassLoader的安全性
  4. UrlClassLoader 继承自 SecureClassLoader 通过URI路径从jar文件或文件夹中加载类和资源
  5. InMemoryClassLoader 是android 8.0 新增的类加载器,继承自BaseDexClassLoader,用于加载内存中的dex文件
  6. BaseDexClassLoader是继承自ClassLoader ,是ClassLoader的具体实现,PathClassLoader和DexClassLoader都是继承自他
    [html] view plain copy
    1. public class DexClassLoader extends BaseDexClassLoader {
    2. public DexClassLoader(String dexPath, String optimizedDirectory,
    3. String librarySearchPath, ClassLoader parent) {
    4. super(dexPath, new File(optimizedDirectory), librarySearchPath, parent);
    5. }
    6. }
  7. DexClassLoader 可以加载dex文件以及包含dex的压缩文件(apk和jar文件),不管加载那种文件,最终都是要加载dex文件,DexClassLoader构造方法有4个参数
  • dexPath :dex相关文件路径集合,多个文件用文件分隔符分割,默认文件分隔符为“:”
  • optimizedDirectory:解压的dex文件存储路径,这个路径必须是内部储存路径,一般情况下应用当前程序的私有路径/data/data/<Package Name>/...
  • librarySearchPath:包含C、C++库的路径集合,多个路径用文件分隔符分割,可以为null
  • parent:父加载器
  • DexClassLoader继承自BaseDexClassLoader 所有实现都在BaseDexClassLoader中

8 PathClassLoader:系统用PathClassLoader加载系统类和应用类

PathClassLoader 构造方法中没有optimizedDirectory参数,因为PathClassLoader已经默认optimizedDirectory为/data/dalvik-cache,很明显PathClassLoader不能定义解压后的dex文件储存路径,因此PathClassLoader通常用来加载已经安装的apk的dex文件(安装的apk,dex文件会在/data/dalvik-cache中)

[html] view plain copy
  1. public class PathClassLoader extends BaseDexClassLoader {
  2. public PathClassLoader(String dexPath, ClassLoader parent) {
  3. super(dexPath, null, null, parent);
  4. }
  5. public PathClassLoader(String dexPath, String librarySearchPath, ClassLoader parent) {
  6. super(dexPath, null, librarySearchPath, parent);
  7. }
  8. }



2、简述ClassLoader的双亲委托模型

首选判断dex是否已经加载,如果没有加载,不是自身去查找而是委托给父加载器去查找,一直这样递归直到最顶层的BootClassLoader,如果BootClassLoader查找到,就直接返回,如果没有查找到,就一次向下查找,如果还没有查找到就自身去查找

双亲委托的好处:

1 避免重复加载,如果已经加载过一次class,就不需要再次加载,直接从缓存中读取

2 更加安全,如果不使用双亲委托模式,就可以自定义一个String类替代系统的String类,这显然会造成安全隐患,采用双亲委托模式String类始终是根类加载器加载,就避免这种错误

3、简述双亲委托模型在热修复领域的应用

一个ClassLoader可以有多个dex文件,每一个dex文件是一个Element,多个dex文件排成一个有序数组dexElements,当找类的时候,会按照顺序遍历dex数组,然后在遍历的dex文件中找类,由于双亲委托模型机制,只要找到就会停止并返回,如果找不到就下一个dex文件继续找,只要我们把修复好的dex文件放在数组第一个位置,就不会再加载有bug的dex文件


参考:http://liuwangshu.cn/application/classloader/1-java-classloader-.html 刘望舒大神和 星球精选


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值