以 KMM x Ktor 打造全平台应用
乔禹昂
携程机票移动端 资深工程师
禹昂是 Kotlin 中文社区核心成员,曾多次在 Kotlin 用户组、GDG 等技术分享活动担任讲师。除了积极推广 Kotlin 技术外,也是图书《Kotlin 编程实践》译者,并在工作上持续探索 Kotlin 在不同平台上的应用潜力。
范圣佑
JetBrains Developer Advocate
圣佑是 JetBrains 技术布道师,负责推广 JetBrians 相关技术与产品,包括:Kotlin 编程语言、 IntelliJ IDEA 系列 IDE 及 YouTrack、TeamCity、Upsource 等团队合作解决方案,协助开发者善用工具辅助来提升生产力,同时维护代码品质。
Kotlin 支持多平台开发的特性一直受到众多开发者的期待,毕竟能用一种语言开发前端(Kotlin/JS)、后端(Kotlin/JVM)、Android(Kotlin/JVM)及 iOS(Kotlin/Native)是非常吸引人的。2020 年 8 月,Kotlin 团队正式发布 1.4 版,并推出 KMM(Kotlin Multiplatform Mobile)及其同名插件,使 Kotlin 开发者可以用一个语言开发 Android、iOS 双平台的 App。本次网络研讨会就由两位讲师为大家演示如何用 KMM 及 Ktor 两个框架,从 Mobile 到 Backend 打造全平台应用。
主題分享
本次分享由携程机票移动端资深工程师禹昂及 JetBrains 技术布道师圣佑两人合力完成一个 RSS Reader 应用,由禹昂以 KMM 实现 Mobile App,再串接由圣佑以 Ktor 实现的 Backend API。
演示由后端开始,圣佑首先介绍由 JetBrains 团队以 100% Kotlin 打造的 Web 框架 Ktor,其轻量、语法简洁易学是它的特色,非常适合用于网站、API 及微服务。从 IntelliJ IDEA 的插件市场安装好 Ktor 插件后,就可以快速创建项目。接着从 API 规格设计出对应的 JSON 内容,再转成 Kotlin Data Class。为了让所有 RSS 文章能存储在数据库里,圣佑也演示了如何集成同样由 JetBrains 团队打造的 Exposed 框架,并使用 H2 数据库来存储 RSS 数据。最后,在配置好项目的依赖后,开始解析 Kotlin 官方博客的 RSS 文件,整理并排序后回传 JSON 给前端读取。
接着由禹昂接手介绍 KMM。禹昂首先说明 KMM 的原理及工作方式,通过 Kotlin Multiplatform 的架构,以 Common、Android 及 iOS 三种不同 SourceSet 打包出不同的产物即可跨平台。为了简化开发工作,Kotlin 团队推出适用于 macOS Android Studio KMM 插件,安装后即可快速创建 KMM 项目,并可直接从 Android Studio 编译两个平台的代码并启动模拟器预览。接着,禹昂从多平台依赖配置、expect/actual 声明与实现、common 层声明的 Data Class、集成 Ktor HTTP Client、suspend 式的网络请求及 UI 代码等主题做演示,让大家迅速了解 KMM 的实现方式、开发生态及现阶段的优缺点。
演示完后的问答环节非常热烈,在这边将同学们的提问整理如下:
問答
Q. KMM 的性能如何?
禹昂:KMM 在 Android 平台上跟原本的开发方式没有太大的部份,在性能上没有太大的区别。不过在 iOS 平台上,因为整个跟 Objective-C 的 Runtime、垃圾回收、对象分配器都是不一样的,所以会有些差别,但目前还没有详细跟 Objective-C 对比的数据。自 Kotlin 1.4 发布后可以启用一个实验性的对象分配器,经我自己本地测试可以提升不少性能,但还需时间完善,大家有兴趣的话可以关注下。
Q. KMM 国内有公司在用吗?
禹昂:目前携程有在用,一些功能也已经上线了,目前是以逻辑性的功能为主。
Q. Native 的文件系统现在如何?
禹昂:目前还是在用平台相关的 API,未来 kotlinx-io 库有计划会重构来支持多平台的文件 IO。
Q. Ktor 有没有计划替代 Spring?
圣佑:Ktor 和 Spring 的设计理念不同,所以我觉得两者不是一种替代的关系,而是应该将 Ktor 视为是 Spring 之外的新选择,是一种更轻量、不依赖 Annotation 的方案。若你原本就是 Android 开发者,那 Ktor 也是从 Mobile 转到 Backend 时,一个比较简单易上手的选择。对于一些小型服务来说,许多 Android 开发者就能自己独立完成 Mobile 及 Backend API。
Q. Compose + Kotlin Native 有这个可能吗?
禹昂:这个要等官方支持。我觉得后面官方会支持,不过这中间要搞定许多跨语言交互的问题。
Q. Ktor 有稍重的后端 Demo 吗?
圣佑:可以参考 Ktor 官方文档里的系列示例。
相信大家看完两人的实作后,对于 KMM 及 Ktor 这两种技术有更深入的了解。而从两人通力合作的过程中,也能一窥前后端串接的技巧,对全端开发会有更深刻的体认。希望本次网络研讨会的内容对大家有帮助,我们下次见!