Android Protobuf Datastore构建时出现重复类冲突问题求助
Android Protobuf Datastore 构建重复类问题解决方案
问题现象
构建项目时出现大量Duplicate class报错,示例如下:
Duplicate class com.google.protobuf.Field$Kind$KindVerifier found in modules jetified-protobuf-javalite-3.21.11 (com.google.protobuf:protobuf-javalite:3.21.11) and jetified-protobuf-kotlin-4.26.0 (com.google.protobuf:protobuf-kotlin:4.26.0) Duplicate class com.google.protobuf.FieldKt found in modules jetified-protobuf-kotlin-4.26.0 (com.google.protobuf:protobuf-kotlin:4.26.0) and jetified-protobuf-kotlin-lite-3.21.11 (com.google.protobuf:protobuf-kotlin-lite:3.21.11)
用户当前的Gradle配置:
plugins { id 'kotlinx-serialization' id "com.google.protobuf" version "0.8.17" } dependencies { implementation "androidx.datastore:datastore:1.1.0" implementation "com.google.protobuf:protobuf-javalite:3.19.4" implementation "com.google.protobuf:protobuf-kotlin-lite:3.21.11" } protobuf { protoc { artifact = "com.google.protobuf:protoc:3.19.4" } generateProtoTasks { all().each { task -> task.builtins { java { option 'lite' } kotlin { option 'lite' } } } } }
问题根源
- 版本不统一:protoc、protobuf-javalite、protobuf-kotlin-lite三者版本不一致,不同版本的库包含相同类但字节码不兼容,导致重复类冲突。
- 传递依赖引入冲突:Datastore或其他依赖可能自动引入了非lite版本的protobuf库,和手动添加的lite版本类重复。
- 代码生成冗余:同时生成Java和Kotlin的Lite代码,可能导致同一类被多次生成。
解决方案
1. 统一所有Protobuf相关版本
把protoc、protobuf-javalite、protobuf-kotlin-lite换成完全相同的稳定版本,同时更新protobuf插件到适配该版本的最新版。示例配置如下:
plugins { id 'kotlinx-serialization' id "com.google.protobuf" version "0.9.4" // 适配新版本的插件 } dependencies { implementation "androidx.datastore:datastore:1.1.0" implementation "com.google.protobuf:protobuf-javalite:3.25.3" implementation "com.google.protobuf:protobuf-kotlin-lite:3.25.3" } protobuf { protoc { artifact = "com.google.protobuf:protoc:3.25.3" // 和库版本严格一致 } generateProtoTasks { all().each { task -> task.builtins { // 用Kotlin开发的话,只保留Kotlin Lite代码生成即可 kotlin { option 'lite' } // 移除Java Lite配置,避免重复生成 java { remove() } } } } }
2. 排除冲突的传递依赖
如果统一版本后仍有冲突,检查依赖树,排除Datastore引入的非lite版本protobuf:
implementation "androidx.datastore:datastore:1.1.0" { exclude group: "com.google.protobuf", module: "protobuf-kotlin" }
3. 清理构建缓存
执行以下命令清理旧的编译产物和依赖缓存,确保新配置生效:
./gradlew clean ./gradlew build --refresh-dependencies
内容的提问来源于stack exchange,提问作者Seb
相关产品推荐
相关产品推荐

