InMemoryDexClassLoader加载流程

4 篇文章 0 订阅
2 篇文章 0 订阅

以前从来没有写笔记的习惯,导致每次看到都得去在线看源码,还是记录下以后需要的话比较省事。

总结:
8.0以后android新增InMemoryDexClassLoader,大致流程和DexClassLoader是差不多的,最主要的区别还是在于InMemoryDexClassLoader过程中并没有生成oat文件,流程中出现的dex文件的起止地址和大小都是可以进行dump的

开始分析:
路径:8.0.0_r4/xref/libcore/dalvik/src/main/java/dalvik/system/InMemoryDexClassLoader.java

在这里插入图片描述
可以看到和PathClassLoader、DexClassLoader一样,主要逻辑还是在父类BaseDexClassLoader,这里看到参数是ByteBuffer[],是可以加载多个dex的

路径:
8.0.0_r4/xref/libcore/dalvik/src/main/java/dalvik/system/BaseDexClassLoader.java

java层还是差不多的,首先对parent进行设置,然后继续跟进DexPathList
在这里插入图片描述

路径:
8.0.0_r4/xref/libcore/dalvik/src/main/java/dalvik/system/DexPathList.java

在这里插入图片描述
makeInMemoryDexElements对传入的dexFiles,也就是Bytebuffer[]数组进行遍历

在这里插入图片描述
跟进DexFile

在这里插入图片描述

跟进openInmemoryDexFile
在这里插入图片描述
在这里插入图片描述
返现调用的两个方法都是native方法。
跟进实现
路径:8.0.0_r4/xref/art/runtime/native/dalvik_system_DexFile.cc
第一个:这里Begin(), length就是dex的起始地址和大小,其实是可以dump的
在这里插入图片描述
第二个:其实和第一个基本一致,也是可以通过dex_mem_map获取begin,也是可以进行dump的

最终都调用了CreateSingleDexFileCookie
在这里插入图片描述
跟进CreateDexFile,调用了DexFile::open,继续跟进
在这里插入图片描述
在这里插入图片描述
这里调用了OpenCommon,可以看到这里主要进行了dexfile的校验,最主要的是new DexFile,继续跟进new DexFile
在这里插入图片描述
在这里插入图片描述
至此InMemoryDexClassLoader主要加载流程就结束了,排版和图片还是有点乱,以后慢慢改正

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值