如何正确解决Android中Duplicate class依赖冲突错误?
问题背景
添加implementation 'androidx.preference:preference:1.2.0'后,编译时出现重复类错误:
A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable
Duplicate class androidx.lifecycle.ViewModelLazy found in modules jetified-lifecycle-viewmodel-ktx-2.3.1-runtime (androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1) and lifecycle-viewmodel-2.5.0-runtime (androidx.lifecycle:lifecycle-viewmodel:2.5.0)
Duplicate class androidx.lifecycle.ViewTreeViewModelKt found in modules jetified-lifecycle-viewmodel-ktx-2.3.1-runtime (androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1) and lifecycle-viewmodel-2.5.0-runtime (androidx.lifecycle:lifecycle-viewmodel:2.5.0)
当前通过显式声明高版本Lifecycle依赖解决,但希望更优方案。
更优解法
1. 全局强制统一Lifecycle版本
通过Gradle的版本约束,确保所有模块的Lifecycle相关依赖都使用同一版本,无需在每个模块重复声明:
// 根目录build.gradle的allprojects块中 allprojects { configurations.all { resolutionStrategy { force "androidx.lifecycle:lifecycle-viewmodel:2.5.1" force "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" } } }
如果使用Version Catalog(Android Studio Arctic Fox及以上推荐),可在gradle/libs.versions.toml中定义版本:
[versions] lifecycle = "2.5.1" [libraries] lifecycle-viewmodel = { group = "androidx.lifecycle", name = "lifecycle-viewmodel", version.ref = "lifecycle" } lifecycle-viewmodel-ktx = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-ktx", version.ref = "lifecycle" }
然后在app模块的build.gradle中添加约束(无需显式声明依赖,自动统一版本):
dependencies { implementation 'androidx.preference:preference:1.2.0' constraints { implementation("androidx.lifecycle:lifecycle-viewmodel") { version.strictly libs.versions.lifecycle.get() } implementation("androidx.lifecycle:lifecycle-viewmodel-ktx") { version.strictly libs.versions.lifecycle.get() } } }
2. 升级Preference到兼容高版本Lifecycle的版本
androidx.preference:preference:1.2.0依赖的是旧版Lifecycle(2.3.1),升级到最新稳定版(如1.2.1),新版本通常会依赖更兼容的Lifecycle版本,自动解决冲突:
implementation 'androidx.preference:preference:1.2.1'
3. 排除Preference中的旧版Lifecycle依赖
在添加Preference依赖时,直接排除它自带的旧版lifecycle-viewmodel-ktx,让项目复用已有的高版本依赖:
implementation('androidx.preference:preference:1.2.0') { exclude group: 'androidx.lifecycle', module: 'lifecycle-viewmodel-ktx' }
注意:使用此方法前需确认项目中已存在兼容的高版本Lifecycle依赖,避免出现缺失类错误。
方案对比
- 原显式声明依赖:有效但冗余,多模块项目需重复声明;
- 全局版本约束:最优雅,统一管控所有依赖版本,适合多模块场景;
- 升级Preference:从根源解决依赖版本不兼容问题,推荐优先尝试;
- 排除依赖:精准解决单个依赖冲突,适合无法升级Preference的场景。
内容的提问来源于stack exchange,提问作者Eldestornillador

