类图

 

相关类介绍

BootClassLoader

调用流程
1、ZygoteInit的main方法
2、预加载常用类
3、读取预加载类名时获取BootClassLoader单例
4、调用classForName(C实现)获取结果

DexClassLoader

构造函数
public DexClassLoader (String dexPath, String dexOutputDir, String libPath, ClassLoader parent)
optimizedDirectory是用来缓存我们需要加载的dex文件的,并创建一个DexFile对象,如果它为null,那么会直接使用dex文件原有的路径来创建DexFile  
DexClassLoader可以指定自己的optimizedDirectory,所以它可以加载外部的dex,因为这个dex会被复制到内部路径的optimizedDirectory
注意:该加载器能够加载未安装的jar/apk/dex

PathClassLoader

构造函数
public PathClassLoader (String path, String libPath, ClassLoader parent)
调用流程
1、Zygote进程启动SyetemServer进程
2、ZygoteInit的startSystemServer方法
3、Zygote进程通过forkSystemServer方法fork自身创建子进程并且调用handleSystemServerProcess
4、 工厂方法创建PathClassLoader
注意:该加载器只能加载系统中已经安装过的apk

SecureClassLoader和URLClassLoader

SecureClassLoader类和JDK8中的SecureClassLoader类的代码是一样的,它继承了抽象类ClassLoader。SecureClassLoader并不是ClassLoader的实现类,而是拓展了ClassLoader类加入了权限方面的功能,加强了ClassLoader的安全性。
URLClassLoader类和JDK8中的URLClassLoader类的代码是一样的,它继承自SecureClassLoader,用来通过URl路径从jar文件和文件夹中加载类和资源。

InMemoryDexClassLoader

InMemoryDexClassLoader是Android8.0新增的类加载器,继承自BaseDexClassLoader,用于加载内存中的dex文件。

具体加载源码

  • 从已装载过的类中找

  • 如果从已装载过的列表中找不到,则从父类装载

  • 如果父类找不到,从子类装载

    protected Class<> loadClass(String className, boolean resolve) throws ClassNotFoundException {
    Class<> clazz = findLoadedClass(className);//从已装载过的类中找。

        if (clazz == null) {        ClassNotFoundException suppressed = null;        try {            clazz = parent.loadClass(className, false);//由父类装载        } catch (ClassNotFoundException e) {            suppressed = e;        }        if (clazz == null) {            try {                clazz = findClass(className);//由子类装载            } catch (ClassNotFoundException e) {                e.addSuppressed(suppressed);                throw e;            }        }    }    return clazz;}

    public Class findClass(String name, List suppressed) {
    for (Element element : dexElements) {//这里进行遍历查询
    DexFile dex = element.dexFile;

            if (dex != null) {           //从DexFile中试图加载Class,从这里看出,从第一个开始遍历,如果查到就返回,这就是热修复的基本原理。            Class clazz = dex.loadClassBinaryName(name, definingContext, suppressed);            if (clazz != null) {                return clazz;            }        }    }    //..    return null;}

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. 一款霸榜 GitHub 的开源 Linux 资源监视器!
  6. 使用Android(安卓)Studio进行cocos2d-x开发
  7. Android-显示传感器的值
  8. android 用ant打包apk
  9. Android(安卓)Frame动画

随机推荐

  1. android volley 发送 POST 请求
  2. Android Studio使用AIDL时无法找到自定义
  3. Android 编程下背景图片适配工具类
  4. 操作内存卡的常用代码
  5. android dpi DisplayMetrics
  6. 选择图文表
  7. Android 上下滚动的新闻效果
  8. [android]android自动化测试十之单元测试
  9. Android之十三图片2D翻转
  10. android 按钮的四种点击事件