Gradle中AndroidSourceSet冲突导致Proto DataStore无法生成文件
Android Proto DataStore 生成文件失败,抛出AndroidSourceSet冲突异常
配置Proto DataStore时,无法从.proto文件生成任何代码,且抛出如下异常:
A problem occurred configuring project ':core:datastoreproto'.> org.gradle.api.InvalidUserDataException: Cannot add an AndroidSourceSet with name 'debug' as an AndroidSourceSet with that name already exists.
配置详情
版本信息
dataStore = "1.1.1" protobuf = "4.26.1" protobufPlugin = "0.9.4"
:core:datastoreproto模块的build.gradle.kts配置
plugins { alias(libs.plugins.medicineai.android.library) alias(libs.plugins.jetbrains.kotlin.android) alias(libs.plugins.protobuf) } android { namespace = "com.medicineai.core.datastoreproto" } // Setup protobuf configuration, generating lite Java and Kotlin classes protobuf { protoc { artifact = libs.protobuf.protoc.get().toString() } generateProtoTasks { all().forEach { task -> task.builtins { register("java") { option("lite") } register("kotlin") { option("lite") } } } } } androidComponents.beforeVariants { android.sourceSets.register(it.name) { val buildDir = layout.buildDirectory.get().asFile java.srcDir(buildDir.resolve("generated/source/proto/${it.name}/java")) kotlin.srcDir(buildDir.resolve("generated/source/proto/${it.name}/kotlin")) } } dependencies { api(libs.protobuf.kotlin.lite) }
auth_info.proto文件内容
syntax = "proto3"; option java_package = "com.medicineai.core.datastoreproto"; message AuthInfo { string accessToken = 1; string refreshToken = 2; string userId = 3; }
问题
不清楚导致AndroidSourceSet冲突的原因,求解决方案。
解决方案
问题根源在androidComponents.beforeVariants代码块:Android插件默认已经为每个变体(如debug、release)创建了对应的SourceSet,你重复注册同名SourceSet就会触发冲突异常。此外,protobuf插件已经自动将生成代码的目录添加到SourceSet中,无需手动配置。
修改步骤:
- 删除整个
androidComponents.beforeVariants代码块 - 补充DataStore的protobuf依赖(原配置遗漏)
修改后的build.gradle.kts核心配置:
plugins { alias(libs.plugins.medicineai.android.library) alias(libs.plugins.jetbrains.kotlin.android) alias(libs.plugins.protobuf) } android { namespace = "com.medicineai.core.datastoreproto" } protobuf { protoc { artifact = libs.protobuf.protoc.get().toString() } generateProtoTasks { all().forEach { task -> task.builtins { register("java") { option("lite") } register("kotlin") { option("lite") } } } } } dependencies { api(libs.protobuf.kotlin.lite) // 添加DataStore Proto依赖 implementation(libs.androidx.datastore.protobuf) }
验证方式:
- 执行
./gradlew :core:datastoreproto:generateDebugProto任务,检查build/generated/source/proto/debug目录是否生成Java和Kotlin代码 - 同步Gradle后,确认项目中可正常引用
AuthInfo类
内容的提问来源于stack exchange,提问作者Burak Karaduman
相关产品推荐
相关产品推荐

