升级androidx.appcompat:appcompat:1.5.0遇重复类错误,求解决方案
问题场景
使用Android Studio Chipmunk | 2021.2.1 Patch 2,将项目中的androidx.appcompat:appcompat从1.4.2升级到1.5.0时,触发以下编译错误:
Duplicate class androidx.lifecycle.ViewModelLazy found in modules lifecycle-viewmodel-2.5.0-runtime(androidx.lifecycle:lifecycle-viewmodel:2.5.0)和lifecycle-viewmodel-ktx-2.3.1-runtime(androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1);Duplicate class androidx.lifecycle.ViewTreeViewModelKt found in modules lifecycle-viewmodel-2.5.0-runtime(androidx.lifecycle:lifecycle-viewmodel:2.5.0)和lifecycle-viewmodel-ktx-2.3.1-runtime(androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1)
回退到1.4.2版本后项目可正常编译,当前项目build.gradle配置如下:
plugins { id 'com.android.application' id 'kotlin-android' id 'kotlin-kapt' } android { compileSdk 32 defaultConfig { applicationId "com.halil.ozel.darkmode" minSdk 28 targetSdk 32 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } buildFeatures { dataBinding true } } dependencies { implementation 'androidx.core:core-ktx:1.8.0' implementation 'androidx.appcompat:appcompat:1.4.2' implementation 'com.google.android.material:material:1.6.1' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' // Preference implementation "androidx.preference:preference-ktx:1.2.0" }
问题原因
androidx.appcompat:appcompat:1.5.0内部依赖了androidx.lifecycle:lifecycle-viewmodel:2.5.0- 项目中的
androidx.preference:preference-ktx:1.2.0依赖了旧版本的androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1 - 两个版本的Lifecycle库包含相同类的定义,导致编译时冲突
解决方案
方案1:强制统一Lifecycle依赖版本
在app模块的build.gradle中,添加版本强制策略,让所有依赖使用同一个Lifecycle版本:
// 添加在dependencies块上方 configurations.all { resolutionStrategy { force 'androidx.lifecycle:lifecycle-viewmodel:2.5.0' force 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0' } } dependencies { // 升级appcompat到1.5.0 implementation 'androidx.appcompat:appcompat:1.5.0' // 其他依赖保持不变 implementation 'androidx.core:core-ktx:1.8.0' implementation 'com.google.android.material:material:1.6.1' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation "androidx.preference:preference-ktx:1.2.0" }
方案2:升级冲突的依赖到兼容版本
将androidx.preference:preference-ktx升级到依赖Lifecycle 2.5.0的版本(比如1.3.0),这样依赖版本自然对齐:
dependencies { implementation 'androidx.appcompat:appcompat:1.5.0' implementation 'androidx.core:core-ktx:1.8.0' implementation 'com.google.android.material:material:1.6.1' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' // 升级preference-ktx到1.3.0 implementation "androidx.preference:preference-ktx:1.3.0" }
方案3:排除冲突依赖(不推荐)
如果暂时无法升级其他依赖,可以在引入appcompat时排除自带的Lifecycle依赖,手动指定旧版本:
dependencies { implementation('androidx.appcompat:appcompat:1.5.0') { exclude group: 'androidx.lifecycle', module: 'lifecycle-viewmodel' } implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1' // 其他依赖保持不变 implementation 'androidx.core:core-ktx:1.8.0' implementation 'com.google.android.material:material:1.6.1' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation "androidx.preference:preference-ktx:1.2.0" }
注意:此方案可能引发appcompat与旧版本Lifecycle的兼容性问题,仅作为临时 workaround 使用。
验证方法
执行./gradlew app:dependencies(或在Android Studio的Gradle面板中选择app > Tasks > android > androidDependencies)查看依赖树,确认所有Lifecycle相关依赖版本统一后,重新编译项目即可。
内容的提问来源于stack exchange,提问作者Halil Ozel

