整理丨诺亚
出品 | 51CTO技术栈(微信号:blog51cto)
近来,传闻中一直在和谷歌“搞事”的JetBrains为跨平台领域带来了一个突破性的消息:发布了Kotlin Multiplatform的第一个稳定版本,支持跨 iOS、Android、桌面、Web 和服务器共享代码。
提到跨平台开发,大家比较熟悉的可能是Flutter、React Native等知名框架。这个新生代又是何方神圣?
其实有熟悉Android开发的朋友可能了解过Kotlin Multiplatform Mobile(KMM)。它是Kotlin Multiplatform(KMP)的组成部分,在2020年就基于Kotlin 1.4发布了第一个版本,但由于一直处在实验阶段,因此了解和使用的人都比较少。如今在JetBrains和谷歌的合力支持下,Kotlin Multiplatform终于开始在跨平台领域崭露头角。
Netflix开发者David Henry和Mel Yahya表示,“不同的技术有时会针对特定平台的应用开发进行抽象化或完全取代,而Kotlin Multiplatform则为现有的特定平台提供了有力的技术补充,同时能够取代与平台无关的业务逻辑。对我们而言,Kotlin Multiplatform是一款工具箱中的新工具,并非会取代整个工具箱。”
图源:JetBrains官方网站
1、放弃Java,选择Kotlin
Kotlin Multiplatform顾名思义,主要基于Kotlin语言。Kotlin是由JetBrains开发的一种JVM(Java 虚拟机)语言,并被谷歌采用作为Android开发的主要语言。既然Java已经是为跨平台代码而设计的,那么Kotlin Multiplatform增加了什么?
答案是Kotlin不仅仅是一种JVM语言。Kotlin/Native使用MinGW (Windows的GCC工具链)和Android NDK,编译为macOS、iOS、Linux、Windows的自包含可执行文件。Kotlin/JS将Kotlin转换为JavaScript。Kotlin Wasm仍处于实验阶段,可编译为WebAssembly。
使用Kotlin而不是Java的另一个原因是它的语言特性,包括lambda表达式、扩展函数、类型推断、空安全等。Kotlin没有checked异常,因为这些不会提高生产力或代码质量。
Kotlin Multiplatform是一种跨多平台共享非GUI代码的技术。它解决了代码共享的两个常见问题,一则需要在项目中包含的一些平台之间共享某些代码,二则需要访问特定平台的API。这也成就了Kotlin Multiplatform的一大亮点:在多平台之间高效重用代码的同时保留原生编程的优势。
图片
Kotlin Multiplatform 中的 Expect 和 Actual,满足了调用原生平台 API 的需求
API 问题通过Expect和Actual声明机制得到解决。expect 关键字用于定义一个多平台通用的声明,即该声明在所有平台上都可用,并且需要在特定平台上实现。actual 关键字通常与 expect 关键字配合使用,用于定义多平台通用的接口和函数,从而允许在不同的平台上使用相同的 API。JetBrains建议只对平台API使用expect/actual,否则使用普通接口。
2022 年的一项调查显示,Kotlin 多平台应用程序的代码共享率高达 63%
2、逻辑和UI共享均实现,与Flutter竞争加剧
Kotlin Multiplatform用于非GUI代码,但有一个相关的项目Compose Multiplatform,用于创建共享的UI。
Compose Multiplatform是基于谷歌的Jetpack Compose的跨平台共享UI声明式框架。据悉,通过将Kotlin Multiplatform与Compose Multiplatform相结合,开发者不仅将获得更高的自由度,还可以在Kotlin中实现高达100%的代码库共享。
此前KMM主要实现的是共享逻辑,UI层的实现还是建议平台各自去处理,而在Compose Multiplatform加入后,成为了逻辑和UI都可以实现共享的结果。再加上有Android官方推荐的Buff加身,发布稳定版后与Flutter的竞争必然会加剧。
当前Compose Multiplatform在桌面平台、macOS、Linux和Windows上也很稳定,但在iOS上是Alpha版本,在Web上是实验性的。
如果Compose Multiplatform尚未准备就绪,开发者如何支持iOS呢?这可以通过使用SwiftUI实现,SwiftUI是苹果的官方UI设计语言,它基于声明性代码。有一些代码示例正是采用了这种方法。
JetBrains还表示,他们的目标是在2024年发布面向iOS的Compose Multiplatform测试版,Kotlin/Wasm也在积极开发中。目前Kotlin Multiplatform和Compose Multiplatform均可免费使用。
3、全球大厂纷纷拥抱:KMM好用在哪里
面向日趋上升的跨平台开发需求,Kotlin Multiplatform稳定版的首发无疑是一个好消息。保持代码共享的同时又保留了一定的原生灵活性,允许根据特定平台的需求进行定制和扩展,这让KMP成为了一个极有潜力的开发框架,为开发者提供了更多的选择空间。
根据JetBrains官方页面,Kotlin Multiplatform已经被麦当劳、Netflix和VMWare等公司使用。
今年5月,麦当劳全球移动应用平台技术主管Ryan Sander和首席 Android 开发人员Austin Keith甚至专门撰写了一篇技术博客来解释为什么他们在诸多解决方案中选择了Kotlin Multiplatform Mobile(KMM)。
在团队选型开始,麦当劳移动技术团队想要的就是“一个响应迅速的原生 UI,与平台保持同步,并避免重复开发业务逻辑”。
“在决定是否在软件堆栈中使用KMM时,你应该考虑开发阶段以及应用程序遵循或将要遵循的设计范式。如果你的应用程序是围绕依赖注入设计或使用干净的体系结构设计的,那么KMM将非常适合,因为它可以被视为另一个领域层,具有两个平台共享的优势。”
在实践过程中,他们发现KMM的主要优势集中在以下几点:
- 为业务逻辑和共享功能(如网络、存储和分析)提供单一代码库。
- 平台的业务逻辑可以在一个位置处理,从而减轻开发人员的测试负担,因为可以同时处理两个平台的单元测试。
- 对于集成/插桩测试,Android和iOS 项目可以与KMM模块一起包含在内,从而允许通过代码库中的本机仿真、仿真或硬件来测试数据库和网络。
不过在集成KMM的过程中,他们也面临一些挑战。
其一,iOS开发人员可能会发现在KMM环境中工作很困难,因为它需要Kotlin语言的知识。不过,如果你有其他语言的开发基础,比如Java、OC、Swift,你可以用一周的时间学习熟悉Kotlin语法并开始项目实战。
其二,并非所有库都有基于Kotlin的等效项,但这可以通过使用expect/actual代码范式的特定平台的代码来解决。
其三,使用常用第三方库的Kotlin版本时,可能会缺少功能。毕竟这还是一门新技术,随着技术发展渐趋成熟,这个问题可能会得到解决。
其四,使用协程/异步方法调用的库可能会由于旧Kotlin内存模型的问题而崩溃。在大多数情况下,更新到最新版本的Kotlin可以防止这种情况发生。
4、写在最后:开发者又多了一个理想之选
Kotlin Multiplatform 的首次用户调查结果显示,有Android背景的开发人员在使用Kotlin Multiplatform的开发人员中占绝大多数,8%的受访者来自iOS背景,61.4%的受访者有5年以上的开发经验。比较出人意料的是,有16.3%的开发者使用这项技术来覆盖全平台,目的就是使其代码尽可能通用。
随着Kotlin Multiplatform进入稳定版本,开发者必然会更有信心将其应用于生产项目。JetBrains依然在进一步增强Kotlin Multiplatform、Compose Multiplatform以及相关工具功能,以支持这一技术组合成为在不同平台之间共享代码的理想之选。对开发者而言,工具箱中有了更多备选,或许会加速创意付诸现实的叙事节奏。
参考链接:
https://devclass.com/2023/11/01/jetbrains-offers-first-stable-release-of-kotlin-multiplatform/
https://www.jetbrains.com/zh-cn/kotlin-multiplatform/
https://medium.com/mcdonalds-technical-blog/mobile-multiplatform-development-at-mcdonalds-3b72c8d44ebc