以下的源码是基于
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 中找到方法的实现
有兴趣的可以继续跟踪下去