集成play-services-auth触发单dex方法数超65536报错如何解决
问题原因
报错Cannot fit requested classes in a single dex file (# methods: 65978 > 65536)是单Dex方法数上限触发的编译错误:Android平台单个Dex文件的方法索引最大容量为65536,引入com.google.android.gms:play-services-auth:20.1.0后,项目自身代码+所有依赖的总方法数达到65978,超出阈值,因此编译失败。移除依赖后总方法数跌回阈值内,所以可以正常运行。
解决方法
1. 开启Multidex支持(通用方案,全版本兼容)
这是目前解决该问题最常用的方案,配置步骤如下:
- 打开app模块下的
build.gradle文件,在android.defaultConfig配置块中添加Multidex开关:
android { defaultConfig { // 保留原有applicationId、minSdk、targetSdk、versionCode等配置 multiDexEnabled true } }
- 如果项目的
minSdkVersion小于21,需要在dependencies块中添加Multidex依赖,minSdk>=21时系统原生支持Multidex,不需要额外加依赖:
dependencies { // AndroidX项目用这个依赖 implementation 'androidx.multidex:multidex:2.0.1' // 未迁移AndroidX、仍使用support库的项目用下面的依赖 // implementation 'com.android.support:multidex:1.0.3' }
- 完成Application类适配:
- 没有自定义Application类的话,直接在
AndroidManifest.xml的<application>标签中添加配置android:name="androidx.multidex.MultiDexApplication"即可 - 已有自定义Application类的,要么将Application的继承类改为
MultiDexApplication,要么重写attachBaseContext方法添加Multidex初始化逻辑:
- 没有自定义Application类的话,直接在
// Kotlin写法 override fun attachBaseContext(base: Context?) { super.attachBaseContext(base) MultiDex.install(this) }
// Java写法 @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); }
2. 依赖裁剪优化(可选,降低方法数占用)
如果不想开启Multidex(不推荐,当前绝大多数商用App都默认开启Multidex),可以通过以下方式压缩总方法数:
- 检查项目中其他Google服务依赖,不要引入
com.google.android.gms:play-services:xx.x.x这种全量包,全量包会包含所有Google服务模块,会带来巨量无用方法,只按需引入对应拆分后的模块即可(比如你当前引入的play-services-auth就是拆分后的认证模块,本身方法数并不高) - 开启代码混淆与资源压缩,release构建时R8会自动移除未被调用的类、方法和无用资源,大幅降低方法数。配置方式是在app模块的
build.gradle中添加:
android { buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } }
注意:debug构建默认不会开启代码混淆,因此debug编译阶段仍可能触发Dex方法数超限,这种场景下直接开启Multidex是成本最低的解决方案。
内容的提问来源于stack exchange,提问作者kamal douma
相关产品推荐
相关产品推荐

