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

2017-07-08  本文已影响753人  十八垧

Android安全交流群:478084054

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

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

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

loadClassBinaryName又调用了defineClass。

defineClass又调用了native方法defineClassNative。

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

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

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

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

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

下篇笔记继续。

上一篇下一篇

猜你喜欢

热点阅读