You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确解决Android中Duplicate class依赖冲突错误?

解决Android依赖冲突:重复的ViewModelLazy和ViewTreeViewModelKt类

问题背景

添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:40:25