Android ClassLoader 的 loadClass 方法

Android安全交流群:478084054

Android ClassLoader的类继承关系:

Android ClassLoader 的 loadClass 方法_第1张图片

即:

Android ClassLoader 的 loadClass 方法_第2张图片

ClassLoader类有两个核心方法:loadClass和findClass。

Android ClassLoader 的 loadClass 方法_第3张图片

ClassLoader的各子孙类继承loadClass方法并且通常不会复写(Overriding),所以每个类加载器的loadClass方法都会先调用parent类加载器(各种类型的类加载器在构造时都会传入一个parent类加载器)的loadClass进行加载,失败之后才会调用本类的findClass进行加载,这种工作模式被称为“双亲委派模型”。

双亲委派模型的工作过程为:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父加载器去完成,每一个层次的加载器都是如此,因此所有的类加载请求都会传给顶层的启动类加载器,只有当父加载器反馈自己无法完成该加载请求(该加载器的搜索范围中没有找到对应的类)时,子加载器才会尝试自己去加载。

看一下ClassLoader的直接子类BaseDexClassLoader的findClass方法:

Android ClassLoader 的 loadClass 方法_第4张图片

调用成员变量pathList的findClass进行加载。

Android ClassLoader 的 loadClass 方法_第5张图片

成员变量pathList的类型为DexPathList,其findClass方法如下:

Android ClassLoader 的 loadClass 方法_第6张图片

依次尝试从dexPath路径下的每一个dex文件中进行加载(调用DexFile类的loadClassBinaryName方法)。

defineClass是DexFile类的静态方法:

Android ClassLoader 的 loadClass 方法_第7张图片

最终调用到native方法defineClassNative,具体实现在“/dalvik/vm/native/dalvik_system_DexFile.cpp”文件中:

Android ClassLoader 的 loadClass 方法_第8张图片

在这加一些log,能够看到所加载的类在哪一个dex或jar文件中定义,这对于dex脱壳很有帮助。

子类DexClassLoader没有复写父类BaseDexClassLoader的findClass方法,所以加载类的方式是一样的。

参考文章:

http://www.jianshu.com/p/a620e368389a

http://chenzhou123520.iteye.com/blog/1601319

你可能感兴趣的:(Android ClassLoader 的 loadClass 方法)