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

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。

下篇笔记继续。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容