Android ClassLoader加载过程源码分析

本文深入探讨Android ClassLoader的加载过程,从findLoadedClass和findClass两个核心函数出发,分析类加载的详细步骤,包括在dex文件中查找类的实现。通过源码分析,帮助理解Android动态加载类的机制。

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

背景

Android开发过程中,开发的小伙伴对动态加载代码肯定不陌生,在使用各个开源框架的过程中都应该有接触。其主要原理离不开ClassLoader等相关的类。这里我们会从Android中ClassLoader等相关类的源码入手,更好的理解和学习动态加载类的原理。

详细分析ClassLoader加载原理

ClassLoader 的继承关系如下:

在这里插入图片描述

这里我们主要分析一下 BaseDexClassLoader.findClass()ClassLoader.loadClass()两个函数的在系统中是怎么进行查找class的过程。

我们看一下系统加载类ClassLoader.loadClass()函数实现代码,在ClassLoader.java中:

    protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
   
            // 首先 检测是否已经加载过
            Class<?> c = findLoadedClass(name);
            if (c == null) {
   
                try {
   
                    if (parent != null) {
   
                        //去调用父类的loadClass
                        c = parent.loadClass(name, false);
                    } else {
   
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
   
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }

                if (c == null) {
   
                    //未找到的情况下,使用findClass在当前dex查找
                    c = findClass(name);
                }
            }
            return c;
    }

    protected Class<?> findClass(String name) throws ClassNotFoundException {
   
        throw new ClassNotFoundException(name);
    }
  • 1, loadClass()先调用findLoadedClass()来判断当前类是否已加载;
  • 2, 未查找到递归去父类中查找是否加载到缓存;
  • 3, 均未缓存,去BootClassLoader中查找;
  • 4, 以上未发现,自顶级父类依次向下查找,调用findClass()查找当前dex。

findLoadedClass函数分析

下图为findLoadedClass()的调用流程;根据调用流程图配合源代码进行详细的分析原理。

在这里插入图片描述

下面介绍对应的源代码实现部分:

    protected final Class<?> findLoadedClass(String name) {
   
        ClassLoader loader;
        if (this == BootClassLoader.getInstance())
            loader = null;
        else
            loader = this;
        return VMClassLoader.findLoadedClass(loader, name);
    }

函数最终统一调用VMClassLoader.findLoadedClass()进行查找类。

native static Class findLoadedClass(ClassLoader cl, String name);

实现在java_lang_VMClassLoader.cc文件中。

static jclass VMClassLoader_findLoadedClass(JNIEnv* env, jclass, jobject javaLoader,jstring javaName) {
  ....
  ObjPtr<mirror::ClassLoader> loader = soa.Decode<mirror::ClassLoader>(javaLoader);
  ClassLinker* cl = Runtime::Current()->GetClassLinker();

  ObjPtr<mirror::Class> c = VMClassLoader::LookupClass(cl,
                                                       soa.Self(),
                                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值