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

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

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

InMemoryDexClassLoader加载流程
可以看到和PathClassLoader、DexClassLoader一样,主要逻辑还是在父类BaseDexClassLoader,这里看到参数是ByteBuffer[],是可以加载多个dex的

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

java层还是差不多的,首先对parent进行设置,然后继续跟进DexPathList
InMemoryDexClassLoader加载流程

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

InMemoryDexClassLoader加载流程
makeInMemoryDexElements对传入的dexFiles,也就是Bytebuffer[]数组进行遍历

InMemoryDexClassLoader加载流程
跟进DexFile

InMemoryDexClassLoader加载流程

跟进openInmemoryDexFile
InMemoryDexClassLoader加载流程
InMemoryDexClassLoader加载流程
返现调用的两个方法都是native方法。
跟进实现
路径:8.0.0_r4/xref/art/runtime/native/dalvik_system_DexFile.cc
第一个:这里Begin(), length就是dex的起始地址和大小,其实是可以dump的
InMemoryDexClassLoader加载流程
第二个:其实和第一个基本一致,也是可以通过dex_mem_map获取begin,也是可以进行dump的
InMemoryDexClassLoader加载流程
最终都调用了CreateSingleDexFileCookie
InMemoryDexClassLoader加载流程
跟进CreateDexFile,调用了DexFile::open,继续跟进
InMemoryDexClassLoader加载流程
InMemoryDexClassLoader加载流程
这里调用了OpenCommon,可以看到这里主要进行了dexfile的校验,最主要的是new DexFile,继续跟进new DexFile
InMemoryDexClassLoader加载流程
InMemoryDexClassLoader加载流程
至此InMemoryDexClassLoader主要加载流程就结束了,排版和图片还是有点乱,以后慢慢改正

相关文章:

  • 2021-12-10
  • 2021-11-24
  • 2021-09-08
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-04
猜你喜欢
  • 2021-12-13
  • 2021-09-09
  • 2021-09-26
  • 2021-11-06
  • 2021-07-27
  • 2021-09-24
  • 2021-06-08
相关资源
相似解决方案