编译后安卓的方法都存放在dex文件里,dex会被DexOpt这个程序odex化。dexopt会把dex里的每个方法的id保存到一个链表中,而这个链表的长度却是用short类型保存的。这样的话,方法的ID就最多只能有66535个了,项目大了就可能会不够用
当Android工程方法数大于66535时,就会报错:
- 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:282)
- 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)
我们可以通过谷歌官方推荐的MultiDexApplication解决
Gradle 配置:
defaultConfig {
applicationId "XXX"
minSdkVersion 14
targetSdkVersion 23
multiDexEnabled true
}
dependencies {
compile 'com.android.support:multidex:1.0.0'
}
Application 类重写方法:
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}