如何在Android/iOS Kotlin Multiplatform项目中配置Protobuf
如何在Kotlin Multiplatform(Android/iOS)项目中正确配置Protobuf
首次接入Protobuf到KMP的Android/iOS共享模块时,常会遇到代码生成失败、配置语法报错的问题,以下是完整的正确配置方案:
一、项目级build.gradle调整
确保protobuf插件版本与现有gradle、kotlin版本兼容,统一配置如下:
plugins { id 'com.android.application' version '7.3.1' apply false id 'com.android.library' version '7.3.1' apply false id 'org.jetbrains.kotlin.android' version '1.7.20' apply false id 'com.google.protobuf' version '0.9.1' apply false } buildscript { dependencies { classpath 'com.google.protobuf:protobuf-gradle-plugin:0.9.1' } }
二、shared模块级build.gradle核心配置
这是配置重点,需要同时处理KMP多平台sourceSets、protobuf代码生成规则和依赖:
plugins { kotlin("multiplatform") id("com.android.library") id("com.google.protobuf") } kotlin { android() listOf( iosX64(), iosArm64(), iosSimulatorArm64() ).forEach { it.binaries.framework { baseName = "shared" } } sourceSets { val commonMain by getting { dependencies { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4") // 通用模块添加Kotlin Protobuf Lite依赖 implementation("com.google.protobuf:protobuf-kotlin-lite:3.21.9") } // 将生成的Kotlin代码目录加入源码路径 kotlin.srcDir("build/generated/source/proto/main/kotlin") } val commonTest by getting { dependencies { implementation(kotlin("test")) } } val androidMain by getting { dependencies { // Android端单独引入javalite依赖 implementation("com.google.protobuf:protobuf-javalite:3.21.9") } } val androidTest by getting val iosX64Main by getting val iosArm64Main by getting val iosSimulatorArm64Main by getting val iosMain by creating { dependsOn(commonMain) iosX64Main.dependsOn(this) iosArm64Main.dependsOn(this) iosSimulatorArm64Main.dependsOn(this) } val iosX64Test by getting val iosArm64Test by getting val iosSimulatorArm64Test by getting val iosTest by creating { dependsOn(commonTest) iosX64Test.dependsOn(this) iosArm64Test.dependsOn(this) iosSimulatorArm64Test.dependsOn(this) } } } android { namespace = "com.example.someproject" compileSdk = 33 defaultConfig { minSdk = 21 targetSdk = 33 } protobuf { protoc { artifact = "com.google.protobuf:protoc:3.21.9" } generateProtoTasks { all().forEach { task -> task.builtins { // 关闭Java代码生成(仅保留Kotlin) java { enabled = false } kotlin { // 正确配置lite选项的语法 options { add("lite") } } } } } } }
三、关键问题解决说明
sourceSets报错问题:
不要在android块下配置proto源,KMP的通用proto文件默认放在src/commonMain/proto目录,插件会自动识别;同时要把生成的Kotlin代码目录加入到commonMain的kotlin源码路径中。option语法报错:
原写法option 'lite'不符合gradle DSL语法,正确写法是在kotlin代码生成块中使用options { add("lite") }。代码不生成问题:
- 确保
.proto文件放在src/commonMain/proto目录(自定义路径需在commonMain中额外配置srcDir) - 开启kotlin代码生成并指定lite选项
- 依赖对应:通用模块用
protobuf-kotlin-lite,Android端用protobuf-javalite
- 确保
四、目录结构参考
shared/ ├── src/ │ ├── commonMain/ │ │ ├── kotlin/ │ │ └── proto/ # 存放你的.proto文件 │ ├── androidMain/ │ ├── iosMain/ │ └── ...其他平台目录
内容的提问来源于stack exchange,提问作者Denys Voronets
相关产品推荐
相关产品推荐

