Android类加载

本文详细探讨了Android中PathClassLoader的加载过程,从双亲委托模式到BootClassLoader,再到DexPathList和DexFile的使用,深入源码剖析了类加载的实现细节,包括在C++层的dalvik_system_DexFile.cpp和dalvik/vm/oo/Class.cpp中的关键步骤。

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

以下的源码是基于 Android4.4.2
PathClassLoader.java|DexClassLoader.java|BaseDexClassLoader.java|DexPathList.java|DexFile.java
都在 4.4.2/442/libcore/dalvik/src/main/java/dalvik/system目录下
ClassLoader.java|VMClassLoader.java
都在 4.4.2/442/libcore/libdvm/src/main/java/java/lang目录下

一、已安装的apk:
PathClassLoader.loadClass(String name,boolean resolve)<没有实现>->
BaseClassLoader.loadClass(String name,boolean resolve)<没有实现>->
ClassLoader.loadClass(String name,boolean resolve)-> 

发现采用了双亲委托模式,这接下去我们
通过打印双亲类加载器log可知最后所有的双亲类加载器都是BootClassLoader(该类定义在ClassLoader.java中)
所以跟踪到如下图代码 



其中关键的语句是:
clazz = findClass(className); 

继续去找 VMClassLoader

最终在 4.4.2/442/dalvik/vm/native/java_lang_VMClassLoader.cpp 找到了方法的实现

关键代码:
clazz = dvmFindClassByName(nameObj, NULL, resolve);
最终在 4.4.2/442/dalvik/vm/native/InternalNative.cpp这里找到方法的实现
有兴趣的可以继续跟踪


如果上面找不到类,则会轮到PathClassLoader去寻找,它的超类BaseClassLoader实现了 Class<?> findClass(String name)这个方法
我们回头看看它的具体实现 

其中关键的语句是:
pathList.findClass(name, suppressedExceptions);
其中pathList是类 DexPathList的实例
那让我们来看看DexPathList的Class findClass(String name, List<Throwable> suppressed)方法的实现 

其中关键语句是:
Class class = dex.loadClassBinaryName(name, definingContext, suppressed);
继续查找 DexFile的Class loadClassBinaryName(String name, ClassLoader loader, List<Throwable> suppressed)方法 



跟踪到了native Class defineClassNative(String name, ClassLoader loader, int cookie)这个本地方法
发现具体实现又是在c++层,这里找下去会有2个分支,一个是art,一个是dalvik
我们选择dalvik分支可以在 4.4.2/442/dalvik/vm/native/dalvik_system_DexFile.cpp 找到方法的实现: 

关键语句:
clazz = dvmDefineClass(pDvmDex, descriptor, loader);
4.4.2/442/dalvik/vm/oo/Class.cpp 中找到方法的实现 


有兴趣的可以继续跟踪下去 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值