第一章:介绍
什么是 Kotlin 多平台(Kotlin Multiplatform)?
Kotlin是一种现代化的类型安全编程语言。它具备空值安全特性,能有效预防多年来困扰程序开发的空指针异常问题。该语言还拥有多项创新功能——包括数据类与密封类、允许在类外部扩展函数的扩展功能、变量延迟加载等众多特性。
正如其名所示,Kotlin多平台技术基于Kotlin编程语言并支持跨平台运行。Kotlin本身已兼容所有支持Java虚拟机(JVM)的平台,并通过Kotlin Native技术适配非JVM平台:该技术将Kotlin代码编译为可在苹果操作系统、Windows和Linux系统上直接运行的原生字节码。对于Web环境,KMP(Kotlin多平台)则会将Kotlin编译为JavaScript和HTML代码。
KMP 支持下列平台:
- Android
- iOS
- macOS
- watchOS
- tvOS
- Windows
- Linux
- Web 对于很多平台的支持,比如 Web 目前还不稳定
跨平台技术演进史
自iOS与Android设备并存以来,开发者始终追寻着"一套代码多端运行"的终极目标。诸多框架曾尝试实现跨平台开发,包括:
- PhoneGap:最早期的框架之一,允许使用HTML5/CSS3/JavaScript开发移动应用,已于2020年停止维护
- Apache Cordova:PhoneGap的开源分支版本
- Ionic:基于Angular/React/Vue等UI框架构建
- Appcelerator Titanium:支持iOS/Android/Windows/Blackberry的JavaScript SDK,2022年停止维护后开源
上述框架通过Web技术渲染原生控件或仿原生控件,但存在JavaScript与原生通信延迟问题,且需随原生平台更新而持续适配。
- Xamarin:微软旗下的C#开发框架,内置.NET运行时。iOS端采用编译执行(性能优于Android端),Android端使用即时编译
- React Native:Facebook基于React web框架开发的移动方案,采用Web+JavaScript技术栈,同样存在原生与Web通信瓶颈
- Flutter:新兴的全平台框架,主要优势在于UI代码高度复用(约90%UI可跨平台)。但平台差异仍需特殊处理(如桌面端无需工具栏),其采用Dart语言(开发者普及度低)的劣势明显:空安全特性近期才引入,大量依赖需手动代码生成
目前基于Web技术的框架逐渐式微,Flutter虽保持发展势头,但Dart语言的应用价值仍存争议。
Kotlin发展简史
Kotlin于2011年7月正式问世,JetBrains公司在2016年2月15日发布1.0稳定版。2017年谷歌I/O大会宣布其成为Android一级开发语言。JetBrains创造Kotlin的初衷是当时主流语言无法满足其开发需求,如今该语言已成为公司所有新项目的首选开发工具——正在逐步取代Java的地位。
为什么选择Kotlin?
因为它是极少数能同时编译为JVM字节码和原生代码的语言,可跨iOS、桌面端及Web平台运行。
Kotlin同样是服务端开发的理想选择:借助Ktor库可轻松实现网络通信,编写通用业务逻辑能确保全平台行为一致性,实现一次测试多方生效。其跨平台代码复用机制显著降低错误率并加速开发进程,各团队可自由选择共享代码的比例——既可在现有项目中逐步迁移,也可直接在新项目中全量采用。
iOS开发者对Swift语言驾轻就熟,而Kotlin与Swift高度相似(学习成本极低)。虽然UI层仍需使用Swift,但iOS开发者同样能参与Kotlin业务逻辑的开发。由于iOS开发工作量依然庞大,iOS开发者将全程参与跨平台项目的所有环节。
代码共享程度由团队自主决策。现有应用可逐步迁移业务逻辑,最终形成可一次性测试的共享代码库。
KMP对应用体积的影响微乎其微:标准库体积小巧且支持按需引入。目前应用商店中已有大量应用采用该技术,众多企业实践证明——将业务逻辑从iOS/Android双端重复编写改为一次开发,能为团队节省大量时间。原生UI架构让移动开发者得心应手,用户也能获得流畅的原生体验。
Kotlin多平台(KMP)的边界界定
虽然KMP提供统一的Kotlin编程语言,但并未强制规定UI实现方案。开发者可自主选择各平台UI框架:
- Android端:可采用原生代码或新一代Jetpack Compose框架
- iOS端:支持UIKit、新兴SwiftUI框架或Alpha阶段的Compose Multiplatform
- 桌面端:可选Desktop Compose或Java Swing
这种设计被广泛视为优势——UI始终保持原生特性,彻底规避基于Web技术的框架存在的通信桥性能瓶颈。
Kotlin多平台(KMP)的适用场景
KMP的优势在于支持渐进式采用——您可以根据需求自由决定使用范围。对于现有项目,您可以选择:
- 仅为新功能引入KMP
- 逐步用KMP重构现有功能
若从应用底层开始集成,可实现全平台代码复用: - 使用SQLDelight仅用一套代码完成多端数据库操作
- 编写一次业务逻辑即适配所有平台
- 开发网络API访问模块时实现跨平台通用
分层架构
大多数应用采用分层架构,通常包含:
- 网络层
- 数据库层(按需配置)
- 与数据库交互的存储层
- 业务逻辑层(非必需)
- UI呈现层
需特别说明的是:KMP不提供UI层解决方案,开发者需使用各平台原生UI框架实现界面交互。
业务逻辑
当前多数企业分别设有iOS和Android开发团队。各团队根据同一份需求说明书,采用不同代码实现相同功能。测试阶段需确保双平台逻辑行为一致性——但两套独立代码如何保证所有边界情况处理方式完全相同?
采用统一业务逻辑代码库后:
- 双团队可共同评审代码,确保逻辑严格符合需求说明
- 从根本上保证iOS与Android平台行为一致性
- 可采用两种协作模式:双团队协同开发或设立专职业务逻辑团队
数据库
通过SQLDelight库,您可使用同一套代码实现移动端与桌面端的SQLite数据库操作。该多平台库专为全平台兼容设计,这意味着:
- 只需编写一次底层SQL数据库的增删改查操作
- 仓储层同样实现一次编码多方复用
- 借助SQL语句自动生成代码机制
- 所有数据库逻辑仅需一次测试即可覆盖全平台
UI
鉴于KMP不提供UI层方案,开发者可自主选用各平台UI框架:
- iOS端:开发者正转向SwiftUI——这是一套优雅的声明式UI工具包,能轻松构建精美界面。同时可选用Alpha阶段的Compose Multiplatform,以便复用Comose技术积累
- Android端:随着Jetpack Compose稳定版发布,开发者可正式采用该现代UI框架
- 桌面端:跨平台桌面UI长期被忽视。Swing虽曾是标准方案但已陈旧失维护。JetBrains正通过Compose for Desktop实现替代,该框架底层复用Android Jetpack Compose技术,并封装了桌面专用代码层
是否真正原生?
最常被追问的问题是:它使用原生控件吗?答案是肯定的。由于KMP不提供UI层,所有界面均通过原生方式绘制:
- Android端:可采用内置View系统或新兴Jetpack Compose库
- iOS端:支持内置原生UI、新式SwiftUI或Compose Multiplatform
- 桌面端:可选传统Java Swing或现代Desktop Compose
- Mac端:额外支持SwiftUI/AppKit/Compose Multiplatform
技术实现层面:
- Android代码生成Java类文件
- iOS通过LLVM编译为原生代码并生成Xcode框架库
Hello Word 程序
准备
- IntellJ IDEA 社区版
- 安装 Kotlin Multiplatform 插件
- 一个稳定的 VPN,用于下载依赖
创建项目
配置 Gradle Wrapper 的下载源
修改 gradle/wrapper/gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.14.3-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
点击项目根目录下的 build.gradle.kts 触发 IDE 下载依赖,初始化项目。