./gradlew app:checkDebugDuplicateClasses --stacktrace可直接定位重复类名及冲突模块坐标,如Duplicate class okhttp3.Address found in modules jetified-QiyouNetSdk_20241121_105026-runtime and jetified-okhttp-4.9.1,配合grep -i "duplicate"过滤输出,精准识别来源。

checkDebugDuplicateClasses 任务失败,说明 Gradle 已明确检测到重复类——这不是警告,是构建中断信号。必须定位并移除冲突来源,不能靠清理或重试绕过。
怎么快速定位是哪个类、来自哪两个模块?
别猜,用 Gradle 自带诊断命令:./gradlew app:checkDebugDuplicateClasses --stacktrace
失败时会直接列出所有冲突项,例如:Duplicate class okhttp3.Address found in modules jetified-QiyouNetSdk_20241121_105026-runtime and jetified-okhttp-4.9.1
这行就告诉你三件事:重复类全名、冲突的两个模块坐标(含版本)、是否已被 jetifier 处理过。
如果输出太长,加管道过滤:./gradlew app:checkDebugDuplicateClasses 2>&1 | grep -i "duplicate"
- 务必在
app模块下执行,不是项目根目录 - 用
checkDebugDuplicateClasses,不是checkReleaseDuplicateClasses—— debug 构建更快,错误更早暴露 - 避免在 Android Studio GUI 里点 “Sync” 或 “Rebuild”,它不显示完整冲突路径
常见冲突类型和对应排除写法
根据错误日志中的类路径,基本能归为三类:
AndroidX 与 support 库混用(如 android.support.v4.app.INotificationSideChannel 和 androidx.core:core 同时出现):
这是迁移残留,不是版本差异问题。必须停用所有 com.android.support,并在 gradle.properties 中确认:android.useAndroidX=trueandroid.enableJetifier=true
然后全局搜索项目,删掉任何 implementation 'com.android.support:...'。
Kotlin 标准库版本分裂(如 kotlin.collections.jdk8.CollectionsJDK8Kt 来自 kotlin-stdlib-1.8.10 和 kotlin-stdlib-jdk8-1.7.20):
不要手动添加 kotlin-stdlib-jdk7/8,它们在 Kotlin 1.8+ 中已废弃。统一用 resolutionStrategy 强制对齐:configurations.all { resolutionStrategy { eachDependency { if (requested.group == "org.jetbrains.kotlin" && requested.name.startsWith("kotlin-stdlib")) { useVersion("1.9.20") } } } }
第三方 SDK 自带内部依赖(如 com.google.zxing.* 或 okhttp3.* 被多个 AAR 同时打包):
典型场景是 zxing-android-embedded 和显式引入的 com.google.zxing:core;或某家 SDK(如 QiyouNetSdk)自己打包了 okhttp。
写法示例:implementation('com.journeyapps:zxing-android-embedded:4.3.0') { exclude group: 'com.google.zxing', module: 'core' }implementation('com.example:qiyou-sdk:20241121') { exclude group: 'com.squareup.okhttp3', module: 'okhttp' }
exclude 写错会导致什么?
exclude 是声明式剔除,不是删除文件。它只影响依赖图谱,不修改原始 AAR/JAR 内容。
- group 和 module 名必须完全匹配错误日志里的坐标,大小写敏感,比如
module: 'okhttp'不是'okhttp3' - 写成
exclude group: 'com.squareup'(漏 module)会误删整个命名空间,可能破坏功能 - 如果一个 AAR 里有多个冲突 jar(如同时含
okhttp和okio),要分别 exclude,不能只写一个 - exclude 后若运行时报
NoClassDefFoundError,说明你剔除了真正需要的类——这时应升级 SDK 版本,而非回退 exclude
Unity Android 构建特别要注意什么?
Unity 的 maintemplate.gradle 是自动生成的,你改了也会被覆盖。所有 exclude 必须通过插件的 dependencies.xml 或 Android Resolver 的 Force Resolve 注入,不能直接编辑模板。
常见踩坑点:
• Firebase BOM v32+ 和 JPush 4.8+ 都自带 androidx.core:core,但版本不同(如 1.9.0 vs 1.10.1)→ 必须用 force 统一版本
• androidx.core:core-ktx 和 androidx.core:core 被视为不同模块,但类路径重叠 → 排除 core-ktx 更安全,因 core 是基础依赖
• Unity 2022.3+ 默认启用 AGP 8.3+,checkDuplicateClasses 是默认开启任务,无法关闭,只能解决
真正难处理的是那些不公开依赖树的闭源 AAR——它们把 okhttp、gson 等直接打进了 classes.jar。这种情况下,exclude 无效,只能联系 SDK 提供方更新,或用 pickFirsts 临时兜底(仅限调试,上架前必须根治)。


















