尝试了一下oneNote的导出功能,貌似并不是很好,所以只能改用markdown了。
muLtidex 的加载,实在attachBaseContext的时候调用Multidex.install(this) 就可以了Install 实现比较简单
1 | 158 File dexDir = new File(applicationInfo.dataDir, SECONDARY_FOLDER_NAME); |
最重要的是MultiDexExtractor.load 调用了两次,然后调用installSecondaryDexes 进行安装
1 |
|
首先是一个判断,看是不是强制,还有就是有没有修改过apk,没有的话就直接用已经存在的,loadExistingExtractions 找了zip文件进行加载
Perform 做的事就是把apk里的其他dex文件放到一个zip文件中,这样,以后加载就直接加载zip文件,看了其他版本的代码,加载的流程有些不一样,不过并不影响
1 | 179 ZipEntry dexFile = apk.getEntry(DEX_PREFIX + secondaryNumber + DEX_SUFFIX); |
接着把文件相关信息写到一个shared_pref文件中
完事以后呢,就调用 installSecondaryDexes 进行正式的安装
1 | 237 private static void installSecondaryDexes(ClassLoader loader, File dexDir, List<File> files) |
根据不同版本进行不同的安装
从代码上看,其实都是去反射调用了DexPathList ,然后再调用这个对象的makeDexElements , 看到这个makeDexELements,基本上就知道要完事了,这个就和DexClassLoader加载过程差不多了。用来做不落地加载好像也是可以的
1 | 417 private static Object[] makeDexElements( |
1 | 328 private static void expandFieldArray(Object instance, String fieldName, |
这个expand也是个反射调用,把优化后的dex文件加到数组里
分析到这里基本就结束了,其实主要就是把multidex过一遍