MultiDex过程

有对文件的校验

MultiDex.install()
1、
根据Sp读取APK中非主Dex的个数 和 check是否为合法apk文件,并提取到
"code_cache" + File.separator + "secondary-dexes"目录下重命名为String fileName = extractedFilePrefix + secondaryNumber + ".zip";

MultiDex的sp
SharedPreferences prefs = getMultiDexPreferences(context);
int totalDexNumber = getMultiDexPreferences(context).getInt("dex.number", 1);

private static boolean isModified(Context context, File archive, long currentCrc) {
    SharedPreferences prefs = getMultiDexPreferences(context);
    return prefs.getLong("timestamp", -1L) != getTimeStamp(archive) || prefs.getLong("crc", -1L) != currentCrc;
}

2、
交给dexPathList 的 makeDexElements方法 将 ZIP文件 处理为Odex文件

3、
将处理后的OdexList 赋值给 dexPathList的dexElements属性

所以是可以处理将耗时的优化Dex 和 新增Dex到dexElements中 分开处理的。

——/data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes2.zip——extractedFile——Multidex工作过程中,
提取APK中的子dex,并生成包含子dex的压缩文件com.pitaya.buckettool-1.apk.classes2.zip,注意:每个子dex对应一个压缩文件。压缩文件内的dex名字被替换为了classes.dex,
为什么要这样做?因DexPathList.java底层是根据"classes.dex"字符串来匹配文件的,不符合的不处理。

——/data/data/com.pitaya.buckettool/code_cache/secondary-dexes/com.pitaya.buckettool-1.apk.classes2.dex——被dexOpt优化后生成的odex文件,可提高Dalvik执行效率,文件对比如下:
                -rw-r--r-- u0_a52   u0_a52     440576 2017-10-26 10:53 com.pitaya.buckettool-1.apk.classes2.dex
                -rw------- u0_a52   u0_a52     158841 2017-10-26 10:53 com.pitaya.buckettool-1.apk.classes2.zip

https://android.googlesource.com/platform/libcore-snapshot/+/ics-mr1/dalvik/src/main/java/dalvik/system/DexPathList.java

https://android.googlesource.com/platform/libcore-snapshot/+/ics-mr1/dalvik/src/main/java/dalvik/system/BaseDexClassLoader.java

你可能感兴趣的:(MultiDex过程)