一个.dex文件的引用方法不能超过64k个。
一,关于 64K 限制
更早版本的错误是:
Conversion to Dalvik format failed:
Unable to execute dex: method ID not in [0, 0xffff]: 65536
还有一种表达:
trouble writing output:
Too many field references: 131000; max is 65536.
You may try using --multi-dex option.
64*1024=65536,同一个意思,都是方法超过了65536,包括自己写的方法,引用库的方法和安卓框架的方法。所以如果可以产生多个.dex文件就可以解决这个错误。
二,避免64K限制
在配置app解决问题前,可以先尝试以下方法:
1,减少依赖
2,配置ProGuard去掉没有使用到的方法。
以上方法可以减少引用并且减小apk的大小。
三,Gradle中配置Multidex
1,修改build.gradle文件如下:
android {
compileSdkVersion 21
buildToolsVersion "21.1.0"
defaultConfig {
...
minSdkVersion 14
targetSdkVersion 21
...
// Enabling multidex support.
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
2,在manifest文件中添加MultiDexApplication类,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.multidex.Myapplication">
<application
...
android:name="android.support.multidex.MultiDexApplication">
...
</application>
</manifest>
Myapplication要继承android.support.multidex.MultiDexApplication
四,multidex的弊端
1,如果发生了Application Not Responding(ANR)错误,还是需要使用ProGuard压缩代码。
2,如果你的目标API 小于14,可能运行不了,一定要测试,最好使用ProGuard压缩来避免方法大于64K个.
3,multidex配置要求内存分配较大,由于Dalvik linearAlloc限制,可能会导致崩溃,虽然Android4.0时容量加大了,但Android5.0前还是有可能达到限制。