文章写了很久很久,今天再次看到一个相关的项目的Android-Easy-MultiDex,那么我也把自己的方案分享一下,代码地址在文末。
技术交流可加 QQ : 1831594078
Multidex背景
官方文档已经对这个做了比较详述的说明。
简单总结就是:早期dex执行文件的方法数限制在65536范围之内,如果超出这个限制,构建就会失败。
然而,为什么会构建失败,这个65536限制究竟是在哪里?既然dex文件构建失败,首先想到肯定就是去dx.jar找原因。
构建失败一般会有以下的日志:
UNEXPECTED TOP-LEVEL EXCEPTION: java.lang.IllegalArgumentException: method ID not in [0, 0xffff]: 65536
at com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:501)
at com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:276)
at com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:490)
at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:167)
at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
at com.android.dx.command.dexer.Main.run(Main.java:230)
at com.android.dx.command.dexer.Main.main(Main.java:199)
at com.android.dx.command.Main.main(Main.java:103):Derp:dexDerpDebug FAILED
那么就去搜索“method ID not in”和根据错误信息提示的堆栈,果然在DexMerger的方法:
中搜索到这段。然后顺藤摸瓜,找到调用栈:
最后红框的就是dx.jar的入口main函数,而且也和错误日志是一致的。