Kotlin 2025–2026 客户端开发路线:语言升级 × 跨端落地 × AI Agent 入门
Kotlin 2025-2026 客户端开发路线聚焦三大方向:语言升级、跨端落地和AI Agent入门。Kotlin 2.x将保持每6个月的语言大版本更新节奏,K2编译器及IDE模式带来显著性能提升。跨端开发进入工程化阶段,KMP负责业务逻辑共享,Compose Multiplatform实现UI共享。JetBrains推出的Koog框架为端侧AI应用开发提供支持。文章详细解析了K2编译器的优势、
Kotlin 2025–2026 客户端开发路线:语言升级 × 跨端落地 × AI Agent 入门
结论(先把路标立住):
2025–2026 这条 Kotlin 技术线,客户端同学最值得投入的三件事是:
- 语言与工具链升级:围绕 Kotlin 2.x + K2 生态(IDE 的 K2 mode、编译器与插件能力)。Kotlin 官方明确了 语言大版本每 6 个月、其间穿插 tooling release 的节奏,并给出后续版本的大致计划。
- 跨端进入“可规模化工程化”的阶段:KMP 负责“业务逻辑共享”,Compose Multiplatform(CMP)负责“UI 共享”,平台覆盖已包含 Android/iOS/桌面/(部分场景)Web。
- AI 机会不再只属于服务端:JetBrains 推出了 Koog(Kotlin 的 agent 框架),强调 Kotlin DSL + KMP 多端部署(JVM/Android/iOS/JS/Wasm)。如果你要做“端上 AI 助手/自动化/工具调用”,它是很好的入门载体。
主要风险:跨端与 AI 都容易“Demo 很快、工程化很慢”。需要用 基建 checklist(构建/调试/发布/可观测) 把不确定性提前收敛(文末附可直接复用的清单)。
1. 先把 Kotlin 2.x 的发布节奏搞清楚:为什么你会频繁“被升级”
Kotlin 官方从 2.0 起把版本分成三类:
- Language release(2.x.0):语言级变化 + 工具链升级,每 6 个月一版。
- Tooling release(2.x.20):介于两次语言大版本之间(通常在对应语言版后约 3 个月),偏编译/IDE/性能/修复。
- Bugfix release(2.x.yz):不固定节奏,偏修 bug。
这对客户端意味着什么?
- 你不再是“几年升一次 Kotlin”,而是更像“跟着节奏吃版本红利”。
- 跨端项目(KMP/CMP)更依赖工具链匹配:Kotlin 版本、Compose 编译器插件、IDE 插件、Native toolchain 的组合要更谨慎(下面会给你“版本对齐原则”)。
2. K2 时代:你以为只是更快,其实是“IDE 体系重建”
2.0 科普:什么是 K2?它在哪里?
“K2”这个词在 Kotlin 语境下有两个含义,初学者容易混淆:
-
K2 编译器(Frontend):
- 是什么:Kotlin 团队重写的编译器前端(负责语法分析、语义检查、类型推断)。
- 在哪里:从 Kotlin 2.0 版本开始,它已经是默认编译器。只要你的
build.gradle里设置了kotlin("jvm") version "2.0.0"或更高,你就在用 K2 编译器了。不需要额外配置。 - 好处:编译速度更快,类型推断更智能(以前报错的代码现在可能编译通过)。
-
IDE 的 K2 Mode:
- 是什么:Android Studio / IntelliJ IDEA 用来支持代码高亮、补全、跳转的“大脑”。以前 IDE 用的是旧的一套分析逻辑(K1 Mode),现在 IDE 也换成了基于 K2 编译器架构的新分析引擎。
- 在哪里:在 Android Studio (Koala Feature Drop 或更高版本) 中,通常默认开启,或手动开启。
- 如何配置:
- 打开 Android Studio 设置:
Settings/Preferences->Languages & Frameworks->Kotlin。 - 勾选 “Enable K2 Mode” (如果可用)。
- 重启 IDE。
- 打开 Android Studio 设置:
简单总结:升级 Kotlin 2.0 版本,你就自动用上了 K2 编译器;升级 Android Studio 并开启设置,你就用上了 K2 IDE 体验。
很多同学把 K2 理解为“新编译器”,但对日常开发影响更大的是 IDE 的 K2 mode(新的分析引擎 + Analysis API):它直接决定了你写代码时的高亮、跳转、Find Usages、补全、inspection 的体验。
JetBrains 在 2025.3 宣布对 K1 mode 进行 deprecate,并披露了 K2 mode 的一些性能数据:
- 代码分析(code analysis)平均提升约 39%(区间 27–51%)
- Find Usages 平均提升约 34%
- 代码补全在 2025.3 的并行化改造后,相比上一版本约 26% 提升(注意:这是“对上一版本”,不是对 K1 的绝对对比)。
2.1 你该怎么“用好 K2”,而不是被它折腾
建议策略:先默认用 K2 mode,遇到极少数阻断再临时回退。
- K2 mode 已经是主流默认路径;JetBrains 也保留了 VM option 让你在特殊情况下回到 K1:
-Didea.kotlin.plugin.use.k1=true - 但回退要有边界:新语言特性、未来 IDE 特性会越来越偏向 K2(长期看躲不开)。
2.2 给初学者的“迁移避坑点”(很实用)
- 不要把“编译变慢”都怪 Kotlin:很多时候是 Gradle 配置、增量编译失效、或跨端产物(Kotlin/Native、Wasm)引入了新的 pipeline。
- IDE 卡顿/高亮慢:先确认是不是项目过大 + 生成代码过多 + 索引压力(比如
build/generated、protobuf、ksp 输出)。把大生成目录从 IDE 索引里排除,收益往往比“升级电脑”更明显。 - 插件/内部工具不兼容:真正难的不是 Kotlin 本身,而是你们公司内部插件依赖了旧 Kotlin Plugin API / 旧分析接口。
3. 跨端第一性原理:KMP 负责“共享逻辑”,CMP 负责“共享 UI”
把跨端拆成两层,你就不会一上来被吓住:
- KMP(Kotlin Multiplatform):共享数据模型、网络、存储、领域逻辑、业务流程、埋点口径、规则引擎……
- CMP(Compose Multiplatform):共享 UI(页面结构、状态管理、交互逻辑),并在各平台做少量“原生能力嵌入”。
JetBrains 在 2025/08 的 roadmap update 里强调了未来 6–12 个月的重点:
- iOS 目标的开发体验(特别是 build speed)
- Web targets(Kotlin/Wasm、Compose for Web Beta、JS export 能力增强)
- IDE 体验(含 Windows/Linux 的 KMP 插件、Swift 集成等)
3.1 一个你能直接照抄的 KMP 工程骨架(Gradle Kotlin DSL)
目标:Android + iOS(先跑通“共享逻辑”),后续再加桌面/鸿蒙/JS/Wasm 都更顺。
// build.gradle.kts (shared module)
plugins {
kotlin("multiplatform") version "2.3.0" // 示例:版本以 kotlinlang releases 为准
}
kotlin {
androidTarget()
iosX64()
iosArm64()
iosSimulatorArm64()
sourceSets {
val commonMain by getting {
dependencies {
// 放:协程、序列化、网络、日志、DI 等“可共享”库
// implementation(libs.kotlinx.coroutines.core)
// implementation(libs.kotlinx.serialization.json)
}
}
val commonTest by getting
val androidMain by getting
val iosMain by creating {
dependsOn(commonMain)
}
val iosX64Main by getting { dependsOn(iosMain) }
val iosArm64Main by getting { dependsOn(iosMain) }
val iosSimulatorArm64Main by getting { dependsOn(iosMain) }
}
}
Kotlin 官方 releases 页会告诉你“当前最新稳定/规划版本”,以及语言版、tooling 版的节奏。
3.2 “expect/actual” 入门:把平台差异控制在最小边界
跨端最容易翻车的点是:你把平台差异写散了,最后维护成本比双端还高。
正确姿势:公共模块只声明接口(expect),各平台用 actual 实现。
// commonMain
expect class PlatformLogger() {
fun d(tag: String, msg: String)
}
// androidMain
actual class PlatformLogger {
actual fun d(tag: String, msg: String) {
android.util.Log.d(tag, msg)
}
}
// iosMain
actual class PlatformLogger {
actual fun d(tag: String, msg: String) {
println("[$tag] $msg")
}
}
这段代码的意义不是“打日志”,而是告诉你:
- 平台差异必须被收敛到“少数几个锚点”(log/日志、storage/存储、crypto/加解密、permission/权限、webview、media/多媒体…)
💡 解释:什么是“收敛到锚点”?
想象你的共享代码是一块纯净的积木(CommonMain),它不应该知道自己跑在 Android 还是 iOS 上。
只有在必须用到系统能力时,才开一个“接口口子”(即锚点)。- 反例(错误做法):在业务逻辑里到处写
if (isAndroid) { ... } else { ... },或者把 View 传到 Presenter 里。 - 正例(正确做法):定义一个
KVStorage接口(锚点),业务层只调接口。Android 实现用SharedPreferences,iOS 实现用NSUserDefaults。
这样,90% 的业务代码都不包含平台差异,只有这 10% 的“锚点”接口需要分别实现。
- 反例(错误做法):在业务逻辑里到处写
- 共享层保持纯净,后期才有“80% 复用率”的可能。
3.3 编译与多端集成:让代码跑在别人的地盘上
写完了 KMP 代码,怎么把它塞进 Android、iOS 甚至鸿蒙工程里?
1. 常用编译命令(Gradle Tasks)
在项目根目录下,你可以使用以下命令生成产物:
# 1. 检查所有 target 是否配置正确
./gradlew tasks --group="build"
# 2. 编译 Android 库(生成 .aar)
./gradlew :shared:assembleDebug
# 3. 编译 iOS Framework(生成 .framework)
# 注意:取决于你的 Gradle 配置是 Cocoapods 还是 XCFramework
./gradlew :shared:linkDebugFrameworkIosArm64
# 或者如果是 XCFramework
./gradlew :shared:assembleXCFramework
2. 各平台集成方式
A. Android 集成(最简单)
直接在主 App 的 build.gradle.kts 里引用:
dependencies {
implementation(project(":shared"))
// 或者如果发布到了 Maven
// implementation("com.example:shared:1.0.0")
}
B. iOS 集成(两种主流方式)
-
方式一:CocoaPods(推荐,自动化程度高)
在shared/build.gradle.kts中配置cocoapods { ... }插件。Gradle 会自动生成.podspec文件。
iOS 开发者只需要在Podfile里写:pod 'Shared', :path => '../shared'然后
pod install,像用普通第三方库一样调用 Kotlin 代码。 -
方式二:XCFramework(更纯净,适合 SDK 交付)
配置生成 XCFramework,手动将产物拖入 Xcode 项目的 “Frameworks, Libraries, and Embedded Content” 中。
C. 鸿蒙 (HarmonyOS Next) 集成(现状与挑战)
鸿蒙系统使用 ArkTS 开发,底层支持 C/C++。目前 KMP 没有官方的 harmonyTarget(),但我们可以通过“曲线救国”的方式集成:
- 编译为 C 静态库/动态库:
配置 Kotlin/Native 编译出.so(Linux ARM64) 或.a静态库。 - NAPI 桥接(胶水层):
鸿蒙的 ArkTS 无法直接调用 Kotlin 函数,需要你写一层 C++ 代码(NAPI)作为中间人。- ArkTS 调用 NAPI 接口。
- NAPI 接口内部调用 Kotlin 导出的 C 函数。
- 未来展望:
社区正在探索直接生成 ArkTS 绑定的编译器插件,但目前阶段,“KMP -> C Interop -> NAPI -> ArkTS” 是最稳妥的工程化路径。
4. CMP 入门:一套 Compose 写到多端,但要先认清边界
Kotlin 官方文档明确了 Compose Multiplatform 的平台支持与最低版本,例如 CMP 1.10.0 支持 Android/iOS/macOS/Windows/Linux/Web(Web 依赖 WasmGC)。
同时它还提到两个关键事实:
- CMP 的发布节奏与 Kotlin 分离,但最新 CMP 总是兼容最新 Kotlin(不用手动对齐版本)。
- CMP 从 1.8.0 起 UI 框架已全面转向 K2,因此项目 Kotlin 版本要满足要求。
4.1 共享 UI 的最小闭环:一个“列表 + 详情”的状态流
// commonMain (UI 层也能放 common,但你要控制边界)
data class Article(val id: String, val title: String)
sealed interface UiState {
data object Loading : UiState
data class Data(val list: List<Article>) : UiState
data class Error(val msg: String) : UiState
}
class ArticlePresenter(
private val repo: ArticleRepo,
) {
suspend fun load(): UiState = runCatching {
UiState.Data(repo.fetch())
}.getOrElse { UiState.Error(it.message ?: "unknown") }
}
然后在 Compose 里用协程拉数据:
@Composable
fun ArticleListScreen(presenter: ArticlePresenter, onClick: (Article) -> Unit) {
var state by remember { mutableStateOf<UiState>(UiState.Loading) }
LaunchedEffect(Unit) {
state = presenter.load()
}
when (val s = state) {
UiState.Loading -> Text("Loading...")
is UiState.Error -> Text("Error: ${s.msg}")
is UiState.Data -> LazyColumn {
items(s.list) { a ->
Text(a.title, modifier = Modifier.clickable { onClick(a) })
}
}
}
}
初学者注意:跨端 UI 的关键不是“能跑”,而是状态与副作用(LaunchedEffect/DisposableEffect)要写对,否则多端行为不一致、性能也容易崩。
4.2 路由与生命周期:不要死磕“某个现成组件一定能用”
跨端经常遇到“某平台缺一个 Jetpack 组件”的情况。工程化解法是:
- 路由:自己做一个
remember管理栈 的轻路由(适合小项目/组件库场景) - ViewModel:用
remember+DisposableEffect去绑定生命周期(或者上成熟的跨端状态容器)
你可以从最小实现开始:
sealed class Page {
data object Home : Page()
data class Detail(val id: String) : Page()
}
@Composable
fun AppRoot() {
val stack = remember { mutableStateListOf<Page>(Page.Home) }
val top = stack.last()
when (top) {
Page.Home -> ArticleListScreen(presenter = /*...*/) { a ->
stack.add(Page.Detail(a.id))
}
is Page.Detail -> DetailScreen(id = top.id, onBack = { stack.removeLast() })
}
}
这类写法的价值是:
- 你把“路由”从某个平台特定库中抽离出来
- 在跨端早期阶段能极大降低阻力(后续再替换成更完整的方案)
5. AI 机遇:用 Koog 把“端上 AI/自动化”做成工程,而不是脚本
Koog 是 JetBrains 开源的 Kotlin AI agent 框架,主打 类型安全 DSL、模块化能力、以及 KMP 多端部署(JVM/Android/iOS/JS/Wasm)。它也提供了与 MCP(Model Context Protocol)生态结合的示例,比如 Playwright MCP。
5.1 一个“最小可用”的 agent 形态(概念先行)
你可以把 agent 拆成三块:
- Model:接哪个 LLM(OpenAI/本地/企业模型网关)
- Prompt/Policy:角色与边界(比如“只输出 JSON”“不泄露隐私”)
- Tools:能做什么(打开网页、读本地文件、调用 App 内能力)
端侧落地时,真正难的是 Tools:你要把“原生能力”包装成可调用工具,并做好权限与审计。
5.2 Playwright MCP 示例:为什么它对客户端同学有启发
Koog 文档给了 Playwright MCP 的例子,本质是在说:Agent 不需要你手写 DOM 解析/流程脚本,而是通过工具协议去做浏览器自动化。
客户端映射一下:
- Playwright MCP ≈ 你的“App 自动化工具层 / 原生能力桥接层”
- agent 输出动作 ≈ 你定义的“可控指令集”(埋点、跳转、抓取、回放、调试)
结尾:给初学者的“最短学习闭环”
- 先在单端项目里把 Kotlin 2.x + K2 mode 用顺(你会立刻感知到 IDE 体验变化)。
- 再用 KMP 做一个“共享 repo + 数据模型 + 网络层”的小试点(只共享逻辑,不共享 UI)。
- 有余力再上 CMP,共享一个非核心页面。
- 最后把 AI 当成“工具层 + 编排层”的工程问题,用 Koog 把 agent 做成可监控、可控、可回滚的能力。
如果你愿意,我也可以基于你们现有的客户端架构(模块拆分、网络层、埋点、灰度体系)把上面的 Pro 方案 细化成一份“试点 PRD + 技术方案 + 里程碑拆解(含验收指标)”。
更多推荐



所有评论(0)