Android 插件化分析(5)- 加载外部dex

本文探讨Android插件化的关键——如何使用DexClassLoader加载外部dex。讲解了ClassLoder、BaseDexClassLoader、PathClassLoader和DexClassLoader的区别,特别是optimizedDirectory参数的作用。DexPathList在类查找过程中的角色也被详细阐述,同时提到了热更新的基础,即通过调整Element数组顺序覆盖原有类。
摘要由CSDN通过智能技术生成

Android 插件化能从外部下载apk并加载主要依赖于ClassLoader。

ClassLoder是一个抽象类,其中最重要的是BaseDexClassLoader及其子类PathClassLoader和DexClassLoader.

    public DexClassLoader(String dexPath, String optimizedDirectory,
            String libraryPath, ClassLoader parent) {
        super(dexPath, new File(optimizedDirectory), libraryPath, parent);
    }

    public PathClassLoader(String dexPath, String librarySearchPath, ClassLoader parent) {
        super(dexPath, null, librarySearchPath, parent);
    }

构造函数一共涉及到四个parent参数

  • dexPath :需要加载的dex的路径
  • optimizedDirectory:缓存加载的dex文件
  • libraryPath: 加载的.so文件路径
  • parent:父类加载器. ClassLoader会优先去从父类加载器去查找类,如果已加载,则直接使用,不过没加载 ,再自己加载,提高了性能。

PathClassLoader和DexClassLoader很相似,区别在于构造函数DexClassLoader 多了一个optimizedDirectory参数,而PathClassLoader会直接传递null给父类。

optimizedDirectory是用来缓存加载的dex文件的,如果为null会直接使用dex原有的路径作为缓存目录。所以DexClassLoader可以缓存指定的路径的dex,而PathClassLoader通常是用来加载Android系统类和应用的类。

大部分逻辑都在他们的父类BaseDexClassLoader里,BaseDexClassLoader里维护了一个DexPathList,顾名思义是Dex的一个集合类,里面维护了一个Element的数组,Element是表示dex或者包含dex的目录。

public class BaseDexClassLoader extends
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值