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

如何在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")
                        }
                    }
                }
            }
        }
    }
}

三、关键问题解决说明

  1. sourceSets报错问题:
    不要在android块下配置proto源,KMP的通用proto文件默认放在src/commonMain/proto目录,插件会自动识别;同时要把生成的Kotlin代码目录加入到commonMain的kotlin源码路径中。

  2. option语法报错:
    原写法option 'lite'不符合gradle DSL语法,正确写法是在kotlin代码生成块中使用options { add("lite") }。

  3. 代码不生成问题:

    • 确保.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 11:45:45