文章目录
一、不同版本的 DEX 加载
1、Android 8.0 版本 DEX 加载分析
2、Android 6.0 版本 DEX 加载分析
3、Android 5.0 版本 DEX 加载分析
一、不同版本的 DEX 加载
不同 Android 版本 DexPathList 中的 Element[] dexElements 成员如何创建 ;
1、Android 8.0 版本 DEX 加载分析
Android 8.0 8.08.0 版本 DEX 加载分析 :
在 DexPathList 中 , Element[] dexElements 成员创建是调用 makePathElements 方法 生成上述 DEX 数组 ; makeDexElements 方法有 4 44 个参数 ;
8.0 8.08.0 系统 Element[] dexElements 生成 代码示例如下 : ( 只展示相关源码 )
/*package*/ final class DexPathList { /** * dex/resource (class path) 元素集合. * 应该调用 pathElements , 但是 Facebook 应用通过反射修改 dexElements . */ private final Element[] dexElements; public DexPathList(ClassLoader definingContext, String dexPath, String libraryPath, File optimizedDirectory) { // save dexPath for BaseDexClassLoader this.dexElements = makeDexElements(splitDexPath(dexPath), optimizedDirectory, suppressedExceptions, definingContext); } }
参考源码地址 : 8.0.0_r4/xref/libcore/dalvik/src/main/java/dalvik/system/DexPathList.java
2、Android 6.0 版本 DEX 加载分析
Android 6.0 6.06.0 版本 DEX 加载分析 :
在 DexPathList 中 , Element[] dexElements 成员创建是调用 makePathElements 方法 生成上述 DEX 数组 ;
6.0 6.06.0 系统 Element[] dexElements 生成 代码示例如下 : ( 只展示相关源码 )
/*package*/ final class DexPathList { /** * dex/resource (class path) 元素集合. * 应该调用 pathElements , 但是 Facebook 应用通过反射修改 dexElements . */ private final Element[] dexElements; public DexPathList(ClassLoader definingContext, String dexPath, String libraryPath, File optimizedDirectory) { // save dexPath for BaseDexClassLoader this.dexElements = makePathElements(splitDexPath(dexPath), optimizedDirectory, suppressedExceptions); } }
参考源码地址 : 6.0.1_r16/xref/libcore/dalvik/src/main/java/dalvik/system/DexPathList.java
3、Android 5.0 版本 DEX 加载分析
Android 5.0 5.05.0 版本 DEX 加载分析 :
在 DexPathList 中 , Element[] dexElements 成员创建是调用 makeDexElements 方法 生成上述 DEX 数组 ; makeDexElements 方法有 3 33 个参数 ;
5.0 5.05.0 系统 Element[] dexElements 生成 代码示例如下 : ( 只展示相关源码 )
/*package*/ final class DexPathList { /** * dex/resource (class path) 元素集合. * 应该调用 pathElements , 但是 Facebook 应用通过反射修改 dexElements . */ private final Element[] dexElements; public DexPathList(ClassLoader definingContext, String dexPath, String libraryPath, File optimizedDirectory) { this.dexElements = makeDexElements(splitDexPath(dexPath), optimizedDirectory, suppressedExceptions); } }
参考源代码 : 5.1.0_r3/xref/libcore/dalvik/src/main/java/dalvik/system/DexPathList.java
分析上面 3 33 个版本的 DEX 加载源码 , 发现每个版本加载方法不同 , 这样在开发多 DEX 加载时 , 就需要做相应的兼容 ;