入门ART虚拟机(3)——加载类和方法

Android安全交流群:478084054

还是以Android-6.0.1源码为例,从BaseDexClassLoader的findClass开始跟踪一些源码。

入门ART虚拟机(3)——加载类和方法_第1张图片

调用成员变量pathList的findClass方法来查找类。

入门ART虚拟机(3)——加载类和方法_第2张图片

在DexPathList类的findClass方法中,遍历dexElements数组的每一个成员(前面笔记提到过,每一个Element对象里面封装着一个DexFile),然后调用DexFile的loadClassBinaryName方法来加载类。

入门ART虚拟机(3)——加载类和方法_第3张图片

loadClassBinaryName又调用了defineClass。

入门ART虚拟机(3)——加载类和方法_第4张图片

defineClass又调用了native方法defineClassNative。

defineClassNative对应art/runtime/native/dalvik_system_DexFile.cc中的DexFile_defineClassNative方法。

入门ART虚拟机(3)——加载类和方法_第5张图片

这里还是只抓主干,不过多关注一些旁枝末节。在DexFile_defineClassNative方法中,调用class_linker对象的DefineClass来加载类。(在创建ART虚拟机的过程中,会创建一个ClassLinker对象,用于加载类和链接类方法)

入门ART虚拟机(3)——加载类和方法_第6张图片

ClassLinker方法的内容比较多,只关注其中最关键的几步。先调用InsertClass将新类添加到已加载类的列表中。再调用LoadClass和LinkClass来加载和链接类。

入门ART虚拟机(3)——加载类和方法_第7张图片

调用FindOatClass查找与被加载类对应的OatClass,然后调用LoadClassMembers加载类的成员。

入门ART虚拟机(3)——加载类和方法_第8张图片

前面笔记中做过一种假设,就是DEX加固壳阻止了指定DEX生成OAT文件的过程,这种情况下传给LoadClassMembers方法的oat_class参数为nullptr。

下篇笔记继续。

你可能感兴趣的:(入门ART虚拟机(3)——加载类和方法)