以前从来没有写笔记的习惯,导致每次看到都得去在线看源码,还是记录下以后需要的话比较省事。
总结:
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主要加载流程就结束了,排版和图片还是有点乱,以后慢慢改正