一个.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前还是有可能达到限制。