跳转到正文
YGJoon
返回

Android Kotlin Multiplatform 入门

编辑文章

为什么选择 KMM

工程结构

project/
├── androidApp/             # Android 原生应用
├── iosApp/                 # iOS 应用(SwiftUI 或 UIKit)
└── shared/
    ├── src/commonMain/     # 共享代码(Kotlin)
    ├── src/androidMain/    # Android 专用实现
    ├── src/iosMain/        # iOS 专用实现
    └── build.gradle.kts

Gradle 配置核心

kotlin {
    androidTarget()
    iosX64()
    iosArm64()

    sourceSets {
        val commonMain by getting {
            dependencies {
                implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1")
                implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3")
            }
        }
        val androidMain by getting {
            dependencies {
                implementation("androidx.core:core-ktx:1.13.1")
            }
        }
    }
}

与 Android 工程集成

  1. 在 settings.gradle 中引入 include(":shared")。
  2. Android 模块依赖:implementation(project(":shared"))。
  3. 通过 SharedModule().createService() 获取共享逻辑。
class Greeting(private val platform: Platform) {
    fun greet(): String = "Hello, ${platform.name}!"
}

expect class Platform()

actual class Platform actual constructor() {
    actual val name: String = "Android ${Build.VERSION.SDK_INT}"
}

网络层示例

class HttpClientProvider {
    val httpClient = HttpClient {
        install(ContentNegotiation) {
            json(Json { ignoreUnknownKeys = true })
        }
        install(Logging) {
            logger = Logger.DEFAULT
        }
    }
}

class ArticleRepository(private val client: HttpClient) {
    suspend fun fetchArticles(): List<Article> = client.get("/articles").body()
}

Android 端注入:

val client = HttpClientProvider().httpClient
val repository = ArticleRepository(client)

测试策略

class GreetingTest {
    @Test
    fun testGreeting() {
        val greeting = Greeting(Platform())
        assertTrue(greeting.greet().contains("Android"))
    }
}

发布与依赖管理

常见问题

问题原因解决方案
CocoaPods 集成失败Pod 版本过旧升级 CocoaPods,执行 pod repo update
iOS 编译缓慢重复编译启用 Xcode incremental build
API 差异处理麻烦平台特性不一致通过 expect/actual 或接口注入适配

总结

  1. KMM 适合在保证原生体验的前提下复用核心逻辑。
  2. Android 集成只需引用 shared 模块,并处理平台差异。
  3. 梳理团队协作流程(共享代码合并、测试、发布)是成功落地 KMM 的关键。

编辑文章
分享这篇文章:

上一篇
Android Kotlin KSP 编译期代码生成
下一篇
Android Kotlin Jetpack Compose 实战指南