Skip to content

跨平台开发 (KMP)

源:Kotlin Multiplatform 官方文档

KMP 的核心愿景是:共享逻辑,保留原生体验。这与 Flutter 的“自带渲染引擎”路线完全不同。

快速上手 (Gradle 配置)

shared 模块中配置 KMP 插件及源集(Source Sets):

kotlin
plugins {
    kotlin("multiplatform")
}

kotlin {
    // 目标平台
    androidTarget()
    iosSimulatorArm64() 
    iosArm64()

    sourceSets {
        commonMain.dependencies {
            // 共享库依赖
            implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")
        }
        androidMain.dependencies {
            // Android 特有依赖
        }
        iosMain.dependencies {
            // iOS 特有依赖
        }
    }
}

编译契约:expect / actual

这是 KMP 的魔法核心。

  • commonMain: 定义 expect 规则。
  • androidMain/iosMain: 提供 actual 实现。
kotlin
// commonMain
expect fun getPlatformName(): String

// androidMain
actual fun getPlatformName(): String = "Android ${Build.VERSION.SDK_INT}"

// iosMain
actual fun getPlatformName(): String = UIDevice.currentDevice.systemName() + 
                                       " " + 
                                       UIDevice.currentDevice.systemVersion

内存管理革命 (New Memory Manager)

在 Kotlin 1.9 之前,Native 端的对象模型非常痛苦(需要 freeze() 冻结对象才能跨线程)。 现状:现代 KMP 默认启用了新内存管理器

  • 完全线程共享: 不再需要 freeze()
  • 泄漏检测: 提供了类似 Java 的垃圾回收体验。

架构分层

mermaid
graph TD
    Common[commonMain] --> Apple[appleMain (Shared iOS/macOS)]
    Common --> Android[androidMain]
    Apple --> iOS[iosMain]
    Apple --> Mac[macosMain]

通过中间层 appleMain,你可以编写一次代码,同时运行在 iPhone 和 MacBook 上,极大复用了 Apple 生态的逻辑。

原生互操作:C 与 Objective-C 库导入 Kotlin 2.3.0 Beta

在 Kotlin 2.3.0 中,C 和 Objective-C 库的直接导入功能正式进入 Beta 阶段。这意味着开发者可以更稳定、更高效地在 Kotlin 代码中调用底层系统库或 Apple 特有的 Framework。

cinterop 的简化

以前,导入复杂的 Apple Framework 需要编写冗长的 .def 文件。现在,Kotlin 编译器能够更好地处理这些元数据。

kotlin
kotlin {
    iosArm64() {
        compilations.getByName("main") {
            val myInterop by cinterops.creating {
                // 指向自定义的 .def 文件
                definitionFile.set(project.file("src/nativeInterop/cinterop/mylib.def"))
                
                // 也可以直接通过 compilerOpts 传递头文件路径
                compilerOpts("-I/usr/local/include")
            }
        }
    }
}
text
headers = my_c_header.h
package = com.example.native
# 直接链接系统 Framework
linkerOpts = -framework CoreGraphics

Swift 导出优化 (Swift Export)

Kotlin 2.3.0 进一步增强了将 Kotlin 代码导出为 Swift 模块的能力:

  • 更自然的命名: 通过 @SwiftName (未来特性预览) 可以控制导出到 Swift 侧的函数名。
  • Swift 6 适配: 改进了对 Swift 严格并发模型 (Strict Concurrency) 的支持。
  • 集合类映射: ListMap 等类型在导出时能更好地映射为 Swift 的原生集合。

开发提示

直接导入 C/Obj-C 库的功能不仅提升了开发速度,还通过更精确的类型映射减少了手动编写转换代码(Glue Code)的需求。