引发原因
当您的应用及其引用的库包含的方法数量超过 65536 时,您会遇到一个构建错误,指明您的应用已达到 Android 构建架构规定的引用限制
异常抛出
trouble writing output: Too many field references: 131000; max is 65536. You may try using --multi-dex option.
较低版本的构建系统会报告一个不同的错误,但指示的是同一问题 Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536
关于 64K 引用限制
Android 应用 (APK) 文件包含 Dalvik Executable (DEX) 文件形式的可执行字节码文件,这些文件包含用来运行您的应用的已编译代码。Dalvik Executable 规范将可在单个 DEX 文件内引用的方法总数限制为 65536,其中包括 Android 框架方法、库方法以及您自己的代码中的方法。在计算机科学领域内,术语千(简称 K)表示 1024(即 2^10)。由于 65536 等于 64 X 1024,因此这一限制称为“64K 引用限制”。
解决办法
1.minSdkVersion >= 21时,则默认情况下启用多 dex 文件,并且您不需要多 dex 文件支持库
2.minSdkVersion < 21时,则必须使用多 dex 文件支持库并对应用项目进行以下修改:
2.1.配置module下build.gradle
android { defaultConfig { ... multiDexEnabled true } ... } dependencies { implementation 'com.android.support:multidex:1.0.3' //如果使用androidX 时使用如下配置 def multidex_version = "2.0.1" implementation 'androidx.multidex:multidex:$multidex_version' }
2.2.替换配置清单文件设置 <application>
标记中的 android:name属性如下:
2.2.1无需替换Application类时,直接使用默认配置:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp"> <application android:name="android.support.multidex.MultiDexApplication" > ... </application> </manifest>
2.2.2.替换Application类时,直接继承MultiDexApplication即可:
public class MyApplication extends MultiDexApplication { ... }
2.2.2.替换Application类且不继承MultiDexApplication时,需要执行如下操作:
public class MyApplication extends Application { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } }