入门ART虚拟机(1)——加载DEX文件

以Android-6.0.1为例,从BaseDexClassLoader开始跟踪一些源码,只关心感兴趣的部分。

在构造函数中,new了一个DexPathList对象,赋值给成员变量pathList。(BaseDexClassLoader的findClass方法就是调用pathList.findClass来查找类的)

在DexPathList的构造函数中,调用makePathElements生成一个Element数组,赋值给dexElements。

每一个Element对象中封装着一个DexFile:

这个数组里面每一个Element中的dexFile成员,是在makePathElements函数中调用loadDexFile加载的。

loadDexFile是DexPathList的一个静态成员方法。

在loadDexFile中调用DexFile类的loadDex静态方法加载DEX。

loadDex直接new了一个DexFile对象。

在DexFile的构造函数中,调用openDexFile来加载DEX。

openDexFile又调用了openDexFileNative。

这是一个native方法,对应art/runtime/native/dalivk_system_DexFile.cc中的DexFile_openDexFileNative静态方法。

下一篇笔记再继续看DexFile_openDexFileNative源码,预留一个问题:假设要动态加载DEX文件,一些核心class的方法指令被抽走加密或虚拟化,在运行时再还原或解释执行。DexFile_openDexFileNative在加载DEX时,会有一个dex2opt的过程,通常壳代码会HOOK execv函数,阻止dex2opt对指定DEX文件的优化,那么这会对DexFile_openDexFileNative的执行产生哪些影响?进一步的,如果没有生成对应的OAT文件,那么在ART加载一个类方法时,在LinkCode时会有什么影响?



作者:十八垧
链接:https://www.jianshu.com/p/20dcfcf27004
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值