你遇到的是 Android 经典的 「64 K 方法数限制」 错误:
Cannot fit requested classes in a single dex file (# methods: 93 047 > 65 536)
一、为什么会爆掉
- 一个
.dex
文件最多只能引用 65 536 个方法(包括 Android Framework、三方库、你自己写的代码)。 - 你的 APK 打包后整个工程引用了 93 047 个方法,超过了上限,编译器拒绝生成单 dex。
二、官方解决方案:启用 Multidex(多 dex)
1. 在 build.gradle
里打开 multidex 支持
android {
compileSdk 34
defaultConfig {
...
minSdk 21 // 若 minSdk ≥ 21 只需这一步
multiDexEnabled true
}
}
dependencies {
// minSdk < 21 时还需要支持库
implementation 'androidx.multidex:multidex:2.0.1'
}
2. 让 Application 类继承 MultiDexApplication
- 如果你没有自定义 Application,直接在
AndroidManifest.xml
写:
<application
android:name="androidx.multidex.MultiDexApplication"
... >
- 如果已经自定义了 Application,重写
attachBaseContext()
:
public class MyApp extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
androidx.multidex.MultiDex.install(this);
}
}
3. 重新构建
./gradlew clean assembleDebug
此时 Gradle 会生成 classes.dex
、classes2.dex
、classes3.dex
… 自动把 93k 方法拆到多个 dex,安装时系统会一起加载。
三、可选的“瘦身”手段(减少方法数)
Multidex 只是“拆包”,不会减少方法数;如果后续方法继续膨胀,安装/冷启动会变慢,建议顺便瘦身:
手段 | 示例 |
---|---|
去冗余库 | 把 com.google.android.gms:play-services 全部换成按需依赖,如 play-services-location |
启用 R8/ProGuard | minifyEnabled true + 自定义 proguard-rules.pro ,删除无用代码 |
使用 AndroidX | 旧支持库方法数巨大,AndroidX 粒度更细 |
WebP 替代 PNG | 与 dex 无关,但同步减小 APK 体积 |
动态交付 (Android App Bundle) | 让 Google Play 按设备下发最小 APK,间接缓解 multidex 带来的体积问题 |
四、快速自检脚本
想知道是谁占方法最多:
./gradlew app:assembleDebug
cd app/build/outputs/mapping/debug
dexcount-debug.txt # 若用 DexCount 插件
或用开源插件:
plugins {
id "com.getkeepsafe.dexcount" version "3.1.0"
}
构建完后在 build/outputs/dexcount/
看到各库方法占比,按需精简。
五、一句话总结
minSdk ≥ 21:只要 multiDexEnabled true
+ 继承 MultiDexApplication
即可;
minSdk < 21:再加上 androidx.multidex:multidex
依赖并手动 MultiDex.install(this)
;
后续想根治就“拆包+瘦身”双管齐下。祝你编译成功!