给公司的老项目做开发可能都会见到这个问题:

出现这个问题的原因是由于在编译时,一个项目的class文件会被全部打包为一个classes.dex文件(玩过反编译的同学应该心有所感,哈哈),它会为每个方法赋予一个id而这个id的范围在0~0xffff,所以一个app的方法数最多为65536个,超过这个数就会出现传说中的65k错误。
那如何解决呢?
Google官方已经给出了一个很好的解决方案,就是分割dex文件,这样就不会超过限制了(怎么感觉官方也是治标不治本呢)。
好了,下面进入正题。首先,我们需要引入Google提供的multiDex支持库,在build.gradle中加入:1
2
3
4
5
6
7
8
9
10
11
12
13
14//默认配置
defaultConfig {
...
//开启多Dex支持
multiDexEnabled true
...
}
...
//支持库依赖
dependencies {
...
compile 'com.android.support:multidex:1.0.1'
...
}
之后进入选择模式:1
2
3
4
5
6
7
8if(没有自己的Application类){
在AndroidManifest.xml的application中声明android.support.multidex.MultiDexApplication:
android:name="android.support.multidex.MultiDexApplication"
}else if(你的Application类已经继承其他类){
重写attachBaseContext()
}else{
你的Application类继承MultiDexApplication
}
其实继承MultiDexApplication和直接重写attachBaseContext()没什么区别,MultiDexApplication内部也是重写了attachBaseContext()。
MultiDexApplication源码如下:

重写的内容:1
2
3
4
5
6
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
OK。问题解决了,现在你的项目已经支持dex分割了!
最后,还是建议大家尽量别引入太多的外部框架和sdk,尽量精简程序。