有对文件的校验
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