跨平台开发 (KMP)
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 CoreGraphicsSwift 导出优化 (Swift Export)
Kotlin 2.3.0 进一步增强了将 Kotlin 代码导出为 Swift 模块的能力:
- 更自然的命名: 通过
@SwiftName(未来特性预览) 可以控制导出到 Swift 侧的函数名。 - Swift 6 适配: 改进了对 Swift 严格并发模型 (Strict Concurrency) 的支持。
- 集合类映射:
List、Map等类型在导出时能更好地映射为 Swift 的原生集合。
开发提示
直接导入 C/Obj-C 库的功能不仅提升了开发速度,还通过更精确的类型映射减少了手动编写转换代码(Glue Code)的需求。