Android类加载模式

类图

 Android 类加载模式

创新互联-专业网站定制、快速模板网站建设、高性价比井陉网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式井陉网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖井陉地区。费用合理售后完善,十余年实体公司更值得信赖。

相关类介绍

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;
    }

当前标题:Android类加载模式
本文链接:https://www.cdcxhl.com/article36/pjopsg.html

成都网站建设公司_创新互联,为您提供品牌网站设计网站收录网站设计公司电子商务全网营销推广关键词优化

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都定制网站网页设计