美文网首页
入门ART虚拟机(3)——加载类和方法

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

作者: 十八垧 | 来源:发表于2017-07-08 08:48 被阅读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。

    下篇笔记继续。

    相关文章

      网友评论

          本文标题:入门ART虚拟机(3)——加载类和方法

          本文链接:https://www.haomeiwen.com/subject/dnsdhxtx.html