<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Compose Multiplatform on lategege 的技术博客</title><link>https://lategege.com/tags/compose-multiplatform/</link><description>Recent content in Compose Multiplatform on lategege 的技术博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 23 Jul 2026 18:50:00 +0800</lastBuildDate><atom:link href="https://lategege.com/tags/compose-multiplatform/index.xml" rel="self" type="application/rss+xml"/><item><title>Kotlin Multiplatform 跨平台开发指南：Android / iOS / 鸿蒙 / Web / 桌面（2026 学习路线）</title><link>https://lategege.com/p/kotlin-multiplatform-cross-platform-guide/</link><pubDate>Thu, 23 Jul 2026 18:50:00 +0800</pubDate><guid>https://lategege.com/p/kotlin-multiplatform-cross-platform-guide/</guid><description>&lt;img src="https://lategege.com/" alt="Featured image of post Kotlin Multiplatform 跨平台开发指南：Android / iOS / 鸿蒙 / Web / 桌面（2026 学习路线）" /&gt;&lt;p&gt;如果你打算用 &lt;strong&gt;一套 Kotlin 业务代码&lt;/strong&gt; 覆盖 Android、iOS、桌面、Web，甚至把逻辑延伸到鸿蒙，&lt;strong&gt;Kotlin Multiplatform（KMP）&lt;/strong&gt; 是目前最值得认真投入的技术路线之一。&lt;/p&gt;
&lt;p&gt;本文按 &lt;strong&gt;2026 年现状&lt;/strong&gt;（Kotlin 约 2.4.x 文档代）整理：先讲清心智模型，再拆项目结构、expect/actual、Compose Multiplatform、各端落地、鸿蒙现实路径，最后给可执行的 8 周学习计划。目标是让你 &lt;strong&gt;能学、能建、能避坑&lt;/strong&gt;，而不是只收藏一堆链接。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;官方入口：&lt;a class="link" href="https://kotlinlang.org/docs/multiplatform/get-started.html" target="_blank" rel="noopener"
 &gt;Get started with Kotlin Multiplatform&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="写在前面先别被全平台吓到"&gt;写在前面：先别被「全平台」吓到
&lt;/h2&gt;&lt;p&gt;KMP 不是 Flutter 那种「一个渲染引擎包打天下」的叙事，也不是「写一次 UI 永远不用管平台」。&lt;/p&gt;
&lt;p&gt;更准确的说法是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;业务逻辑可以高度共享&lt;/strong&gt;（网络、存储、领域模型、用例、状态机）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UI 可以选择共享，也可以选择原生&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;平台能力必须被隔离&lt;/strong&gt;（文件、相机、推送、权限、系统 UI）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;鸿蒙目前不是 JetBrains 官方一等 target&lt;/strong&gt;，要单独评估&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;先接受这四点，后面的学习路径会顺很多。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一kmp-到底是什么"&gt;一、KMP 到底是什么
&lt;/h2&gt;&lt;h3 id="11-一句话定义"&gt;1.1 一句话定义
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Kotlin Multiplatform&lt;/strong&gt; 让同一份 Kotlin 源码，按目标平台编译成不同产物：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;编译后端&lt;/th&gt;
 &lt;th&gt;典型产物&lt;/th&gt;
 &lt;th&gt;常见用途&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Kotlin/JVM&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;.class&lt;/code&gt; / APK / 桌面应用&lt;/td&gt;
 &lt;td&gt;Android、Desktop&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Kotlin/Native&lt;/td&gt;
 &lt;td&gt;Framework / &lt;code&gt;.so&lt;/code&gt; / 可执行文件&lt;/td&gt;
 &lt;td&gt;iOS、macOS 等&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Kotlin/JS&lt;/td&gt;
 &lt;td&gt;JS bundle&lt;/td&gt;
 &lt;td&gt;浏览器 / Node（兼容路径）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Kotlin/Wasm&lt;/td&gt;
 &lt;td&gt;Wasm + JS glue&lt;/td&gt;
 &lt;td&gt;现代 Web 主推方向&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="12-两个关键抽象"&gt;1.2 两个关键抽象
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Target（目标）&lt;/strong&gt;：告诉 Kotlin「为谁编译」。例如 &lt;code&gt;android&lt;/code&gt;、&lt;code&gt;jvm&lt;/code&gt;、&lt;code&gt;iosArm64&lt;/code&gt;、&lt;code&gt;wasmJs&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Source Set（源集）&lt;/strong&gt;：一组源码 + 依赖 + 编译选项。最常见的是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;commonMain&lt;/code&gt;：所有平台共享&lt;/li&gt;
&lt;li&gt;&lt;code&gt;androidMain&lt;/code&gt; / &lt;code&gt;iosMain&lt;/code&gt; / &lt;code&gt;jvmMain&lt;/code&gt; / &lt;code&gt;jsMain&lt;/code&gt; / &lt;code&gt;wasmJsMain&lt;/code&gt;：平台专用&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;编译某个平台时，Kotlin 会把 &lt;strong&gt;common + 该平台相关 source set&lt;/strong&gt; 一起编进去。&lt;/p&gt;
&lt;h3 id="13-产品路线只有两条先选对"&gt;1.3 产品路线只有两条（先选对）
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;路线 A：只共享逻辑，UI 各自原生（更稳，大厂常见）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;shared：网络、DB、业务、状态&lt;/li&gt;
&lt;li&gt;Android UI：Jetpack Compose / View&lt;/li&gt;
&lt;li&gt;iOS UI：SwiftUI / UIKit&lt;/li&gt;
&lt;li&gt;鸿蒙 UI：ArkUI（ArkTS）&lt;/li&gt;
&lt;li&gt;Web：React/Vue 等，或 shared 编译为 JS/Wasm 供前端调用&lt;/li&gt;
&lt;li&gt;桌面：Compose Desktop 或原生&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;路线 B：逻辑 + UI 都共享（Compose Multiplatform）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一套 Compose UI 可覆盖：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Android&lt;/li&gt;
&lt;li&gt;iOS&lt;/li&gt;
&lt;li&gt;Desktop（JVM）&lt;/li&gt;
&lt;li&gt;Web（Wasm/JS）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;鸿蒙不在这条官方主路上。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;建议：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先学路线 A，搞懂 source set / expect-actual / 依赖分层&lt;/li&gt;
&lt;li&gt;再学 Compose Multiplatform&lt;/li&gt;
&lt;li&gt;最后做鸿蒙 spike（实验/社区方案）&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="二你要学的知识地图"&gt;二、你要学的知识地图
&lt;/h2&gt;&lt;h3 id="阶段-1kotlin-语言12-周"&gt;阶段 1：Kotlin 语言（1–2 周）
&lt;/h3&gt;&lt;p&gt;必须扎实：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;空安全、&lt;code&gt;data class&lt;/code&gt;、&lt;code&gt;sealed class/interface&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;集合、高阶函数、扩展函数&lt;/li&gt;
&lt;li&gt;协程：&lt;code&gt;suspend&lt;/code&gt;、&lt;code&gt;Flow&lt;/code&gt;、结构化并发&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kotlinx.serialization&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;模块与包结构&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="阶段-2kmp-核心1-周"&gt;阶段 2：KMP 核心（1 周）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Target / Source Set&lt;/li&gt;
&lt;li&gt;Default Hierarchy Template（默认层级）&lt;/li&gt;
&lt;li&gt;expect / actual&lt;/li&gt;
&lt;li&gt;common 与 platform 依赖&lt;/li&gt;
&lt;li&gt;产物形态：AAR、iOS Framework、JVM、Wasm/JS&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="阶段-3工程与生态23-周"&gt;阶段 3：工程与生态（2–3 周）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Gradle Version Catalog&lt;/li&gt;
&lt;li&gt;Ktor Client&lt;/li&gt;
&lt;li&gt;SQLDelight&lt;/li&gt;
&lt;li&gt;Koin（DI）&lt;/li&gt;
&lt;li&gt;Coil（图片，CMP 生态）&lt;/li&gt;
&lt;li&gt;Navigation / ViewModel 的多平台化&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="阶段-4各端落地持续"&gt;阶段 4：各端落地（持续）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Android 打包与权限&lt;/li&gt;
&lt;li&gt;iOS Framework 集成（Xcode / SPM / CocoaPods）&lt;/li&gt;
&lt;li&gt;Desktop 分发&lt;/li&gt;
&lt;li&gt;Web 打包与浏览器兼容&lt;/li&gt;
&lt;li&gt;鸿蒙：共享逻辑桥接到 ArkTS（实验）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="三环境搭建2026-实用清单"&gt;三、环境搭建（2026 实用清单）
&lt;/h2&gt;&lt;h3 id="31-通用工具"&gt;3.1 通用工具
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;JDK 17 或 21（Temurin / JetBrains Runtime 均可）&lt;/li&gt;
&lt;li&gt;IntelliJ IDEA + &lt;strong&gt;Kotlin Multiplatform IDE Plugin&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;或 Android Studio（偏移动端）&lt;/li&gt;
&lt;li&gt;Git&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当前官方文档侧 Kotlin 版本大约在 &lt;strong&gt;2.4.x&lt;/strong&gt;（页面可见 2.4.10 一类版本）。&lt;br&gt;
特别注意：&lt;strong&gt;KMP 与最新 AGP 不一定同步兼容&lt;/strong&gt;，不要无点升级 Android Gradle Plugin。&lt;/p&gt;
&lt;p&gt;兼容关系以官方为准：&lt;br&gt;
&lt;a class="link" href="https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-compatibility-guide.html" target="_blank" rel="noopener"
 &gt;Compatibility guide for Kotlin Multiplatform&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="32-按端额外要求"&gt;3.2 按端额外要求
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;平台&lt;/th&gt;
 &lt;th&gt;额外要求&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Android&lt;/td&gt;
 &lt;td&gt;Android SDK、模拟器或真机&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;iOS&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;macOS + Xcode&lt;/strong&gt;（硬性）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Desktop&lt;/td&gt;
 &lt;td&gt;无硬性额外依赖；分发包可用 jpackage&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Web&lt;/td&gt;
 &lt;td&gt;现代浏览器；调试用 Chrome DevTools&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;鸿蒙&lt;/td&gt;
 &lt;td&gt;DevEco Studio + HarmonyOS SDK；KMP 需社区/定制链&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="33-最快起步"&gt;3.3 最快起步
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;打开 &lt;a class="link" href="https://kotlinlang.org/docs/multiplatform/get-started.html" target="_blank" rel="noopener"
 &gt;KMP Get Started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;IDEA：&lt;code&gt;File → New → Project → Kotlin Multiplatform&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;初学建议先勾 &lt;strong&gt;Android + Desktop&lt;/strong&gt;，跑通后再加 iOS / Web&lt;/li&gt;
&lt;li&gt;若要四端共享 UI，可按官方教程创建 CMP 应用：&lt;br&gt;
&lt;a class="link" href="https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-multiplatform-create-first-app.html" target="_blank" rel="noopener"
 &gt;Create your Compose Multiplatform app&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="四项目结构你必须能看懂的骨架"&gt;四、项目结构：你必须能看懂的骨架
&lt;/h2&gt;&lt;p&gt;以 Compose Multiplatform 四端项目为例：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ComposeDemo/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── shared/ # 共享模块（逻辑 + 可选 UI）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── src/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── commonMain/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── androidMain/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── iosMain/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── jvmMain/ # 桌面
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── jsMain/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── wasmJsMain/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── *Test/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── androidApp/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── iosApp/ # Xcode 工程
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── desktopApp/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── webApp/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── gradle/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── libs.versions.toml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── settings.gradle.kts
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="41-target-声明概念示例"&gt;4.1 Target 声明（概念示例）
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// shared/build.gradle.kts
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;plugins&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;kotlin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;multiplatform&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// android / compose 插件按官方模板添加
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;kotlin&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;android&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;jvm&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;js&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;wasmJs&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;listOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;iosX64&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;iosArm64&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;iosSimulatorArm64&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;forEach&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;iosTarget&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;iosTarget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;binaries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;baseName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Shared&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;isStatic&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sourceSets&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;commonMain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dependencies&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 共享依赖
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;DSL 参考：&lt;br&gt;
&lt;a class="link" href="https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-dsl-reference.html" target="_blank" rel="noopener"
 &gt;Multiplatform Gradle DSL reference&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="42-source-set-层级hierarchy"&gt;4.2 Source Set 层级（Hierarchy）
&lt;/h3&gt;&lt;p&gt;声明多个相关 target 后，Gradle 插件会按默认模板自动创建中间层，例如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;commonMain
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── androidMain
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── jvmMain
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── nativeMain
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └── appleMain
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └── iosMain
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ├── iosArm64Main
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └── iosSimulatorArm64Main
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── jsMain
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── wasmJsMain
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;好处：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;iosMain&lt;/code&gt; 写一次，多个 iOS 目标共用&lt;/li&gt;
&lt;li&gt;编译器保证：某 source set 只能使用 &lt;strong&gt;其所有目标都具备&lt;/strong&gt; 的 API&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;文档：&lt;br&gt;
&lt;a class="link" href="https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-hierarchy.html" target="_blank" rel="noopener"
 &gt;Hierarchical project structure&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="五核心机制expect--actual"&gt;五、核心机制：expect / actual
&lt;/h2&gt;&lt;h3 id="51-规则"&gt;5.1 规则
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;在 &lt;code&gt;commonMain&lt;/code&gt; 用 &lt;code&gt;expect&lt;/code&gt; 声明（无实现）&lt;/li&gt;
&lt;li&gt;在各平台 source set 用 &lt;code&gt;actual&lt;/code&gt; 实现&lt;/li&gt;
&lt;li&gt;包名、签名必须一致&lt;/li&gt;
&lt;li&gt;编译期按目标合并&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;文档：&lt;br&gt;
&lt;a class="link" href="https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-expect-actual.html" target="_blank" rel="noopener"
 &gt;Expected and actual declarations&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="52-最小例子"&gt;5.2 最小例子
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// commonMain
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;expect&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;platformName&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// androidMain
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;actual&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;platformName&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Android &lt;/span&gt;&lt;span class="si"&gt;${android.os.Build.VERSION.SDK_INT}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// iosMain
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;platform.UIKit.UIDevice&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;actual&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;platformName&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nc"&gt;UIDevice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;currentDevice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;systemName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nc"&gt;UIDevice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;currentDevice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;systemVersion&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// jvmMain（Desktop）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;actual&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;platformName&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Desktop JVM &lt;/span&gt;&lt;span class="si"&gt;${System.getProperty(&amp;#34;os.name&amp;#34;)}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// wasmJsMain / jsMain
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;actual&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;platformName&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Web&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="53-生产建议少用-expect多用接口--di"&gt;5.3 生产建议：少用 expect，多用接口 + DI
&lt;/h3&gt;&lt;p&gt;expect/actual 适合薄桥接。业务扩大后，更推荐：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;FileStorage&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;suspend&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ByteArray&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NoteRepository&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;val&lt;/span&gt; &lt;span class="py"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;FileStorage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Android / iOS / Desktop 各自实现 &lt;code&gt;FileStorage&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;用 Koin 在入口注入&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;expect/actual 留给：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;极薄的平台工厂&lt;/li&gt;
&lt;li&gt;路径/时钟/设备信息&lt;/li&gt;
&lt;li&gt;无法用接口优雅表达的边界&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="六各平台落地"&gt;六、各平台落地
&lt;/h2&gt;&lt;h3 id="61-android最成熟"&gt;6.1 Android（最成熟）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Target：&lt;code&gt;android&lt;/code&gt;（JVM）&lt;/li&gt;
&lt;li&gt;UI：共享 CMP，或原生 Jetpack Compose&lt;/li&gt;
&lt;li&gt;App 模块：&lt;code&gt;implementation(project(&amp;quot;:shared&amp;quot;))&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;你会用到：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Application / Activity 入口&lt;/li&gt;
&lt;li&gt;权限、后台、通知&lt;/li&gt;
&lt;li&gt;签名与 flavor&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;严格跟随 KMP 与 AGP 兼容表&lt;/li&gt;
&lt;li&gt;库模块可关注 Google 的 &lt;code&gt;com.android.kotlin.multiplatform.library&lt;/code&gt; 演进&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="62-ios成熟但工具链更重"&gt;6.2 iOS（成熟，但工具链更重）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Target：&lt;code&gt;iosArm64&lt;/code&gt; / &lt;code&gt;iosSimulatorArm64&lt;/code&gt; 等&lt;/li&gt;
&lt;li&gt;shared 编译为 Framework，由 Xcode 链接&lt;/li&gt;
&lt;li&gt;UI：
&lt;ul&gt;
&lt;li&gt;Share UI：Compose Multiplatform&lt;/li&gt;
&lt;li&gt;Native UI：SwiftUI 调 Kotlin 业务&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;集成方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本地直接依赖（模板默认）&lt;/li&gt;
&lt;li&gt;CocoaPods&lt;/li&gt;
&lt;li&gt;Swift Package Manager&lt;/li&gt;
&lt;li&gt;远程预编译 Framework（CI 发布）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;文档入口：&lt;br&gt;
&lt;a class="link" href="https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-project-configuration.html" target="_blank" rel="noopener"
 &gt;Choosing a configuration for your KMP project&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Swift 互操作要点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;suspend&lt;/code&gt; 到 Swift 的桥接要设计清楚&lt;/li&gt;
&lt;li&gt;空安全与集合映射&lt;/li&gt;
&lt;li&gt;对外暴露精简的 &lt;code&gt;SharedSdk&lt;/code&gt; API，不要把整个内部对象图甩给 Swift&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;硬性限制：&lt;strong&gt;编译/签名 iOS 必须 macOS + Xcode。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="63-desktop最适合当学习主场"&gt;6.3 Desktop（最适合当学习主场）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Target：&lt;code&gt;jvm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;UI：Compose Multiplatform Desktop&lt;/li&gt;
&lt;li&gt;打包：jpackage 等&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;优势：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;调试快&lt;/li&gt;
&lt;li&gt;可先在 Desktop 把业务和 UI 跑通，再补移动端&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文件路径、剪贴板、多窗口是桌面特有问题&lt;/li&gt;
&lt;li&gt;分发体积（自带运行时）要提前规划&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="64-webjs--wasm"&gt;6.4 Web（JS / Wasm）
&lt;/h3&gt;&lt;p&gt;现状要点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Compose Multiplatform Web 主推 &lt;strong&gt;Kotlin/Wasm（wasmJs）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;js { browser() }&lt;/code&gt; 仍可用于兼容与部分生态&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;常见挑战：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;启动体积与下载&lt;/li&gt;
&lt;li&gt;浏览器线程模型&lt;/li&gt;
&lt;li&gt;资源加载差异&lt;/li&gt;
&lt;li&gt;SEO 不适合重客户端应用&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;适合：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;管理后台、工具站、与 App 同业务的 Web 客户端&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不适合：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;强 SEO 的内容官网（官网仍建议静态站）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="65-鸿蒙-harmonyos--openharmony关键现实"&gt;6.5 鸿蒙 HarmonyOS / OpenHarmony（关键现实）
&lt;/h3&gt;&lt;p&gt;必须说清楚：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;官方 KMP / Compose Multiplatform 目标列表是 Android、iOS、Desktop、Web（JS/Wasm）等，没有官方 &lt;code&gt;ohos&lt;/code&gt; / HarmonyOS target。&lt;/strong&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;鸿蒙要用 KMP，现实路径是 &lt;strong&gt;社区 / 厂商定制&lt;/strong&gt;：&lt;/p&gt;
&lt;h4 id="路径-1只共享逻辑务实首选"&gt;路径 1：只共享逻辑（务实首选）
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;KMP shared（common 业务）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Kotlin/Native（社区 OHOS target / .so）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ArkTS UI 通过 NAPI / 桥接层调用
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;社区参考：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/zxystd/Kotlin-OHOS" target="_blank" rel="noopener"
 &gt;zxystd/Kotlin-OHOS&lt;/a&gt;&lt;br&gt;
为 OpenHarmony / HarmonyOS 适配 Kotlin/Native target，覆盖 stdlib、coroutines、serialization 等；&lt;strong&gt;实验性&lt;/strong&gt;，对主机架构和 SDK 版本绑定较强。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="路径-2腾讯-kuikly更偏产品级跨端-ui"&gt;路径 2：腾讯 Kuikly（更偏产品级跨端 UI）
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/Tencent-TDS/KuiklyUI" target="_blank" rel="noopener"
 &gt;Tencent-TDS/KuiklyUI&lt;/a&gt;&lt;br&gt;
Kotlin Multiplatform UI 框架，常配合定制 Kotlin 版本与 knoi（Kotlin ↔ ArkTS 桥）&lt;/li&gt;
&lt;li&gt;探索示例：&lt;a class="link" href="https://github.com/OMGCA/Sakiko" target="_blank" rel="noopener"
 &gt;OMGCA/Sakiko&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="路径-3鸿蒙原生为主kmp-只做算法协议库"&gt;路径 3：鸿蒙原生为主，KMP 只做算法/协议库
&lt;/h4&gt;&lt;p&gt;商业上通常最稳：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;核心算法、协议、校验 → KMP&lt;/li&gt;
&lt;li&gt;系统能力、UI、账号、推送 → ArkTS&lt;/li&gt;
&lt;li&gt;通过最小 API 表面暴露给鸿蒙&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;学习建议：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;前两个月不要把鸿蒙当主战场&lt;/li&gt;
&lt;li&gt;先打通 Android + iOS + Desktop（+ Web）&lt;/li&gt;
&lt;li&gt;再单独做「shared 被 ArkTS 调用」的 Hello World spike&lt;/li&gt;
&lt;li&gt;若目标是上架，工期评估要以 &lt;strong&gt;ArkUI 原生 + 共享逻辑&lt;/strong&gt; 为默认，而不是默认 CMP 能直接跑鸿蒙&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="七ui-层compose-multiplatform"&gt;七、UI 层：Compose Multiplatform
&lt;/h2&gt;&lt;h3 id="71-和-jetpack-compose-的关系"&gt;7.1 和 Jetpack Compose 的关系
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;同一套心智：&lt;code&gt;@Composable&lt;/code&gt;、&lt;code&gt;remember&lt;/code&gt;、&lt;code&gt;State&lt;/code&gt;、&lt;code&gt;Modifier&lt;/code&gt;、Material3&lt;/li&gt;
&lt;li&gt;Android 目标实际使用 Google 的 Jetpack 产物&lt;/li&gt;
&lt;li&gt;其他平台使用 JetBrains 的 multiplatform 工件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;文档：&lt;br&gt;
&lt;a class="link" href="https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-multiplatform-and-jetpack-compose.html" target="_blank" rel="noopener"
 &gt;Relationship between Compose Multiplatform and Jetpack Compose&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="72-最小-ui"&gt;7.2 最小 UI
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Composable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;MaterialTheme&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="py"&gt;text&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;remember&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;mutableStateOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Hello KMP&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Modifier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;onClick&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Clicked on &lt;/span&gt;&lt;span class="si"&gt;${platformName()}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Click&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="73-资源"&gt;7.3 资源
&lt;/h3&gt;&lt;p&gt;使用 &lt;strong&gt;compose multiplatform resources&lt;/strong&gt;（生成 &lt;code&gt;Res&lt;/code&gt; 访问器），不要假设 Android 的 &lt;code&gt;R&lt;/code&gt; 能在 common 使用。&lt;br&gt;
&lt;a class="link" href="https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-multiplatform-resources.html" target="_blank" rel="noopener"
 &gt;Resources overview&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="74-平台差异清单建议单独做笔记"&gt;7.4 平台差异清单（建议单独做笔记）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;系统返回 / 手势返回&lt;/li&gt;
&lt;li&gt;状态栏与安全区&lt;/li&gt;
&lt;li&gt;权限弹窗与文件选择&lt;/li&gt;
&lt;li&gt;键盘与焦点&lt;/li&gt;
&lt;li&gt;滚动手感&lt;/li&gt;
&lt;li&gt;桌面快捷键与窗口&lt;/li&gt;
&lt;li&gt;Web 路由与浏览器历史&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;共享 UI 的正确目标不是「100% 长得一样」，而是「业务一致、体验平台化」。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="八业务层推荐架构"&gt;八、业务层推荐架构
&lt;/h2&gt;&lt;p&gt;推荐简洁的分层 + 单向数据流：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;commonMain
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── domain/ # 实体、用例、仓库接口
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── data/ # repository 实现、DTO、mapper
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── network/ # Ktor
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── db/ # SQLDelight
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── presentation/ # ViewModel / Store / UiState
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── di/ # Koin modules
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="81-网络ktor-client"&gt;8.1 网络：Ktor Client
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;val&lt;/span&gt; &lt;span class="py"&gt;client&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HttpClient&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ContentNegotiation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Json&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;ignoreUnknownKeys&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;各端 engine 不同：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Android：CIO / OkHttp / Android&lt;/li&gt;
&lt;li&gt;iOS：Darwin&lt;/li&gt;
&lt;li&gt;JVM：CIO / OkHttp&lt;/li&gt;
&lt;li&gt;JS/Wasm：对应 JS 引擎&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;官方相关教程：&lt;br&gt;
&lt;a class="link" href="https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-ktor-sqldelight.html" target="_blank" rel="noopener"
 &gt;Create a multiplatform app using Ktor and SQLDelight&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="82-数据库sqldelight"&gt;8.2 数据库：SQLDelight
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;common 写 &lt;code&gt;.sq&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;各端 driver 不同&lt;/li&gt;
&lt;li&gt;类型安全 SQL，很适合 KMP&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="83-异步与状态"&gt;8.3 异步与状态
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Repository 返回 &lt;code&gt;Flow&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;ViewModel 暴露 &lt;code&gt;StateFlow&amp;lt;UiState&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;UI 收集状态并渲染&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="84-序列化"&gt;8.4 序列化
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;优先 &lt;code&gt;kotlinx.serialization&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;避免在 common 使用偏 JVM 的 Gson / Moshi&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="九测试策略"&gt;九、测试策略
&lt;/h2&gt;&lt;h3 id="91-优先-commontest"&gt;9.1 优先 commonTest
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;依赖 &lt;code&gt;kotlin.test&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;领域逻辑、mapper、纯函数必须有测试&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="92-平台测试补边界"&gt;9.2 平台测试补边界
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Android 仪器测试 / JVM 测试&lt;/li&gt;
&lt;li&gt;iOS Kotlin/Native tests 或上层 XCTest&lt;/li&gt;
&lt;li&gt;Desktop/JVM 用常规单元测试&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;教程：&lt;br&gt;
&lt;a class="link" href="https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-run-tests.html" target="_blank" rel="noopener"
 &gt;Test your multiplatform app&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;原则：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;能在 commonTest 测的，绝不拖到 UI 测。&lt;br&gt;
跨端 bug 大多来自「平台 API 误入 common」和「协程/状态竞态」。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="十依赖与版本管理"&gt;十、依赖与版本管理
&lt;/h2&gt;&lt;h3 id="101-version-catalog-思路"&gt;10.1 Version Catalog 思路
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;gradle/libs.versions.toml&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;versions&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;kotlin&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2.4.10&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;coroutines&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;1.10.x&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;ktor&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;3.x&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;serialization&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;1.x&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;sqldelight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2.x&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;koin&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;4.x&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;libraries&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;kotlinx-coroutines-core&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;module&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;org.jetbrains.kotlinx:kotlinx-coroutines-core&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;version&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ref&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;coroutines&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;ktor-client-core&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;module&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;io.ktor:ktor-client-core&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;version&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ref&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ktor&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;kotlinMultiplatform&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;org.jetbrains.kotlin.multiplatform&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;version&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ref&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;kotlin&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;版本号请以你创建项目时的官方模板与兼容表为准，不要死抄过期数字。&lt;/p&gt;
&lt;h3 id="102-找库"&gt;10.2 找库
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://klibs.io" target="_blank" rel="noopener"
 &gt;klibs.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;引入前先确认支持哪些 target（「有 Android 无 iOS」很常见）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="103-升级原则"&gt;10.3 升级原则
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;先升 Kotlin，再升 Compose Multiplatform，再升 Ktor&lt;/li&gt;
&lt;li&gt;一次只动一个大版本&lt;/li&gt;
&lt;li&gt;看 changelog 与兼容表&lt;/li&gt;
&lt;li&gt;iOS 模拟器 + 真机都打一遍&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="十一8-周可执行学习计划"&gt;十一、8 周可执行学习计划
&lt;/h2&gt;&lt;h3 id="第-12-周kotlin--第一个-kmp"&gt;第 1–2 周：Kotlin + 第一个 KMP
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Kotlin 语法与协程过一遍&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 新建 Android + Desktop 项目&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; common 写 &lt;code&gt;Greeting&lt;/code&gt; + expect &lt;code&gt;platformName&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 两端都跑通&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="第-3-周网络与数据"&gt;第 3 周：网络与数据
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Ktor GET 公开 API&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; serialization 解析 JSON&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; SQLDelight 本地缓存&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Repository + UiState&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="第-4-周compose-multiplatform-ui"&gt;第 4 周：Compose Multiplatform UI
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 列表页 + 详情页&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 主题与资源&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 加载 / 空 / 错误态&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Desktop 上高效迭代&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="第-5-周上-ios"&gt;第 5 周：上 iOS
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 配置 Xcode&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Framework 集成&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 模拟器运行&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 至少解决一次签名/配置问题&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="第-6-周web"&gt;第 6 周：Web
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 启用 wasmJs&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 浏览器跑同一套 UI&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 观察包体与启动时间&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="第-7-周架构升级"&gt;第 7 周：架构升级
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 多 module：&lt;code&gt;core&lt;/code&gt; / &lt;code&gt;feature-home&lt;/code&gt; / &lt;code&gt;feature-settings&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Koin DI&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 日志与崩溃上报抽象&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; CI 编译 Android + Desktop + 单测&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="第-8-周鸿蒙-spike可选"&gt;第 8 周：鸿蒙 Spike（可选）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 阅读 Kotlin-OHOS / Kuikly 文档&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 只做：common 函数被 ArkTS 调用&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 记录：不可用库、构建成本、API 暴露方式&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 决定产品是否真要上鸿蒙共享&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="十二第一个真实小项目选题"&gt;十二、第一个真实小项目选题
&lt;/h2&gt;&lt;p&gt;做一个多端 &lt;strong&gt;「收藏夹 / 稍后读」&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;功能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;假登录或本地用户&lt;/li&gt;
&lt;li&gt;列表、搜索、标签&lt;/li&gt;
&lt;li&gt;网络拉取 + 本地缓存&lt;/li&gt;
&lt;li&gt;设置页（主题、清理缓存）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;平台推进顺序：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Desktop（开发主场）&lt;/li&gt;
&lt;li&gt;Android&lt;/li&gt;
&lt;li&gt;iOS&lt;/li&gt;
&lt;li&gt;Web&lt;/li&gt;
&lt;li&gt;鸿蒙只接 shared 逻辑（可选）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这个题目刚好覆盖网络、DB、状态、导航、资源、平台文件清理。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="十三常见坑"&gt;十三、常见坑
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;把 &lt;code&gt;java.io.File&lt;/code&gt; 写进 &lt;code&gt;commonMain&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;乱升 AGP / Xcode / Kotlin&lt;/li&gt;
&lt;li&gt;iOS 只测模拟器，真机再爆&lt;/li&gt;
&lt;li&gt;共享 UI 追求像素级一致，反而体验差&lt;/li&gt;
&lt;li&gt;expect/actual 滥用，不抽接口&lt;/li&gt;
&lt;li&gt;单模块 shared 无限膨胀，编译变慢&lt;/li&gt;
&lt;li&gt;协程作用域泄漏&lt;/li&gt;
&lt;li&gt;默认以为鸿蒙能在向导里直接勾选&lt;/li&gt;
&lt;li&gt;把 Web 当成 SEO 官网技术方案&lt;/li&gt;
&lt;li&gt;忽略 iOS framework / Wasm / Desktop 运行时体积&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="十四官方与扩展资源"&gt;十四、官方与扩展资源
&lt;/h2&gt;&lt;h3 id="官方必读"&gt;官方必读
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kotlinlang.org/docs/multiplatform/get-started.html" target="_blank" rel="noopener"
 &gt;KMP Get Started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-multiplatform-create-first-app.html" target="_blank" rel="noopener"
 &gt;Create your Compose Multiplatform app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-discover-project.html" target="_blank" rel="noopener"
 &gt;The basics of Kotlin Multiplatform project structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-expect-actual.html" target="_blank" rel="noopener"
 &gt;Expected and actual declarations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-hierarchy.html" target="_blank" rel="noopener"
 &gt;Hierarchical project structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-compatibility-guide.html" target="_blank" rel="noopener"
 &gt;Compatibility guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-ktor-sqldelight.html" target="_blank" rel="noopener"
 &gt;Ktor + SQLDelight tutorial&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="鸿蒙相关社区--厂商"&gt;鸿蒙相关（社区 / 厂商）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/zxystd/Kotlin-OHOS" target="_blank" rel="noopener"
 &gt;zxystd/Kotlin-OHOS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/Tencent-TDS/KuiklyUI" target="_blank" rel="noopener"
 &gt;Tencent-TDS/KuiklyUI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="十五立项时怎么选"&gt;十五、立项时怎么选
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;需求&lt;/th&gt;
 &lt;th&gt;建议&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Android + iOS，要极致原生体验&lt;/td&gt;
 &lt;td&gt;KMP 共享逻辑 + 双端原生 UI&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Android + iOS + Desktop 快速出货&lt;/td&gt;
 &lt;td&gt;KMP + Compose Multiplatform&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;还要 Web 管理端&lt;/td&gt;
 &lt;td&gt;CMP + wasmJs（接受 App 式 Web）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;必须鸿蒙上架且工期紧&lt;/td&gt;
 &lt;td&gt;ArkUI 原生为主；KMP 只共享非 UI 核心&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;强图形 / 游戏&lt;/td&gt;
 &lt;td&gt;别硬上 CMP&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;已有大型 Android 应用&lt;/td&gt;
 &lt;td&gt;渐进抽取 shared 模块&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;团队 Kotlin 薄弱&lt;/td&gt;
 &lt;td&gt;先补 Kotlin，再上 KMP&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="十六今天就能做的-6-步"&gt;十六、今天就能做的 6 步
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;安装 IDEA + KMP 插件 + JDK 17/21&lt;/li&gt;
&lt;li&gt;用向导创建项目：Android + Desktop&lt;/li&gt;
&lt;li&gt;跑通按钮点击显示 &lt;code&gt;platformName()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;接入 Ktor 调一个公开 JSON API&lt;/li&gt;
&lt;li&gt;SQLDelight 缓存并展示列表&lt;/li&gt;
&lt;li&gt;成功后再加 iOS，再加 Web，鸿蒙最后做 spike&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="结语"&gt;结语
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;KMP 的胜负手是共享业务，不是盲目共享一切 UI。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Android / iOS / Desktop / Web&lt;/strong&gt; 是官方主航道。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;鸿蒙&lt;/strong&gt; 可做，但目前是 &lt;strong&gt;社区/定制链&lt;/strong&gt;，优先「共享逻辑 + ArkUI」。&lt;/li&gt;
&lt;li&gt;学习顺序建议：&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;Kotlin → 工程结构 → expect/actual → 数据层 → Compose Multiplatform → iOS → Web → 鸿蒙 spike&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;如果你正在把 Android 工程迁到 KMP，或准备用 Compose Multiplatform 做首个四端 Demo，可以从「只加 Desktop 调试面」开始——这通常是投入产出比最高的第一步。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;版本说明：本文基于 2026 年公开文档与生态现状整理，具体版本号请以创建工程时的官方模板和兼容表为准。鸿蒙相关方案演进较快，落地前务必复核社区仓库与 SDK 版本。&lt;/em&gt;&lt;/p&gt;</description></item></channel></rss>