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

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'
                }
            }
        }
    }
}

问题根源

  1. 版本不统一:protoc、protobuf-javalite、protobuf-kotlin-lite三者版本不一致,不同版本的库包含相同类但字节码不兼容,导致重复类冲突。
  2. 传递依赖引入冲突:Datastore或其他依赖可能自动引入了非lite版本的protobuf库,和手动添加的lite版本类重复。
  3. 代码生成冗余:同时生成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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 22:43:10