2024 Google I/O 宣布正式支持 Kotlin Multiplatform ,那 KMP 是什么?它的未来在哪里?

基于最近一直有人和我提 KMP ,那就简单聊聊。

2024 Google I/O 正式官宣了支持 KMP ,而一般意义上的 KMP 指的就是 Kotlin Multiplatform ,它是 Google Workspace 团队的一项长期「投资」项目,这里有个重点,那就是 Kotlin Multiplatform 由 JetBrains 开发维护和开源的项目,简单来说,JetBrains 主导,Google Workspace 投资并提供技术支持。

原理上,Kotlin Multiplatform 通过将 Kotlin 编译为平台原生的二进制文件,从而提供跨平台共享代码的目的,应用场景上 :

Forbes 就提到过,他们通过 Kotlin Multiplatform 在 iOS 和 Android 上共享 80% 以上的逻辑,而麦当劳也曾提到过,他们采用了 Kotlin Multiplatform 开发全球移动应用。

当然,这里需要说的是,Kotlin Multiplatform 和 Compose Multiplatform 虽然都是 JetBrains 维护的项目,它们经常被一起提及,但是他们其实是两个项目

  • Kotlin Multiplatform:提供了底层逻辑的跨平台,为 Compose Multiplatform 提供了基础支撑
  • Compose Multiplatform:Compose UI 的跨平台框架,提供 UI 跨平台能力

用 JB 官方的话说就是:借助 Compose Multiplatform,开发者可以将 Kotlin Multiplatform 的代码共享能力推向应用逻辑之外

其实从另一方面讲,Kotlin Multiplatform 的目的并不是消除所有特定于平台的代码,它更多是提供了一种代码重用最大化的方式,同时允许灵活地进行特定于平台的优化和定制,很好的例子就是 iOS 上协程是通过 SKIE 实现支持。

所以如果有一个 Android App 想运行到 iOS 上,那么你会经历的逻辑就是:

  • UI 部分逻辑通过 Compose Multiplatform 实现跨平台,如果你是 Compose UI ,那么需要调整的不会很多。
  • 业务逻辑通过 Kotlin Multiplatform 来跨平台,需要注意你使用的一些库,例如 androidx.* 是否已经支持到了 Kotlin Multiplatform

PS,现在 iOS 上的 Compose Multiplatform 同样支持了集成 iOS 原生的 UIKit 和 SwiftUI ,例如可以通过 UIKitView 集成 iOS 的 UIKit 元素

正如本次 I/O 上所说,Google 和 JetBrains/Kotlin 开发者社区合作,为许多 Jetpack 库添加了 Kotlin 多平台支持,并在某些情况下提供 iOS 平台目标,例如:

  • Ktor 通过处理 REST 服务消耗来简化网络任务,
  • kotlinx.serialization 将数据转换为 JSON 等格式
  • Okio 管理基本的文件 I/O
  • SKIE 适配了类型和协程在 iOS 上的使用
  • CocoaPods 集成支持使用 iOS 特定的依赖项

另外,Annotations、Collections 和 DataStore 库都在稳定版本中支持 Kotlin Multiplatform,另外还添加了对验证 iOS 平台目标的二进制兼容性的支持,使其与 Android 的标准保持一致。

除了上面的库之外,目前还在致力于为 Room、 Lifecycle 和 ViewModels 提供 Kotlin 多平台支持,并且现已提供 alpha 版本。

最后 Android Gradle 插件现在正式支持 Kotlin Multiplatform,可以使用简洁的构建定义将 Android 设置为共享代码的平台目标,如下所示:

plugins {
    id("org.jetbrains.kotlin.multiplatform")
    id("com.android.library")
}

kotlin {
    androidTarget {
        compilations.all {
            kotlinOptions {
                jvmTarget = "11"
            }
        }
    }  
    listOf(
        iosX64(),
        iosArm64(),
        iosSimulatorArm64()
    ).forEach { iosTarget ->
        iosTarget.binaries.framework {
            baseName = "Shared"
            isStatic = true
        }
    }    
    sourceSets {
        commonMain.dependencies {
            // put your Multiplatform dependencies here
        }
    }

当然,也有一些其他问题,例如不少第三方库没有实现支持,例如 Dagger#3916 里所说的,Dagger/Hilt 仍然面临修复 KSP 支持的问题,他们目前还没有计划支持 KMP。

当然对于 DI 现在也有类似替代框架,例如:

最重要的是,JB 现在提供了包发布和检索网站: https://package-search.jetbrains.com/ ,这是跨平台必备的社区支撑,类似 npm、pub 平台,这对于 Kotlin Multiplatform 生态的重要性不言而喻。

至于使用了 Kotlin Multiplatform 的知名企业,目前已知的有:

最后,其实今年 I/O ,Android 和 Flutter 的 PM 还联合发布了一篇文章 《让开发者更轻松地进行跨平台开发》 ,文章里面就提到了:最适合你业务的的才是最重要的

基于这篇内容,简单总结就是:

  • Kotlin 和 Jetpack Compose 是 Android 开发的首选。
  • KMP 将 Kotlin 编译为特定于平台的二进制文件(如 Android、iOS、JVM、WASM),所以你可以用最小的开销调用特定于平台的 API,并利用 Compose MultiPlatform 实现 UI 。
  • Flutter 更多是提供所有平台上业务和 UI 代码的一致,它不特定于平台。

所以,很多时候大家可能觉得它们是你死我活的局面,但是更多来说,它们的维护主体和关注的群体都不一样

最后,我相信很多老 Android 都还在用 XML 布局,这并没有什么问题,但是声明式 UI 基本在客户端已经是主流了, Compose 、Flutter、React Native、SwiftUI 、ArkUI 都表明了声明式 UI 是这个时代的选择

不过还是那句话,能完成业务才是最重要的,技术“新不新“”牛不牛“都是其次,重要的还是业务赚不赚钱,产品是否有前景,企业是否提供岗位,毕竟我们都不是技术驱动的公司,技术并不盈利

更多参考资料:

  • https://github.com/android/kotlin-multiplatform-samples

  • https://android-developers.googleblog.com/2024/05/android-support-for-kotlin-multiplatform-to-share-business-logic-across-mobile-web-server-desktop.html

  • https://developers.googleblog.com/en/making-development-across-platforms-easier-for-developers/

Kotlin Multiplatform提供了一种高效的跨平台开发方式,使得开发者能够在不同平台间共享业务逻辑,并针对特定平台编写UI代码。创建一个跨平台UI组件的步骤大致如下: 参考资源链接:[Kotlin多平台实战:从Android到iOS的跨平台开发](https://wenku.csdn.net/doc/6ushm70gop?spm=1055.2569.3001.10343) 首先,需要确定UI组件的核心功能和外观,将其抽象为平台无关的代码模块。在Kotlin中,这些模块被称为共享模块。然后,根据平台的特定需求,为Android和iOS分别实现相应的UI模块。 对于Android平台,Kotlin Multiplatform项目通常会依赖于Kotlin/Android扩展,这使得开发者能够访问Android SDK提供的所有UI组件。通过创建一个Android模块,并在其中实现与共享模块交互的UI逻辑,可以将共享模块的功能嵌入到Android应用中。 在iOS平台上,Kotlin/Native可以用来构建一个原生框架,该框架内包含Kotlin代码。接着,可以使用Swift或Objective-C来编写与Kotlin代码交互的iOS UI组件。为了确保UI的一致性,需要使用平台特有的工具和框架(例如UIKit)来设计和实现UI。 为了使UI组件在两个平台上的表现一致,开发者需要考虑每个平台的设计规范,确保遵循Material Design(对于Android)和Human Interface Guidelines(对于iOS)。此外,开发者可以使用像Jetpack Compose for Multiplatform这样的实验性项目来帮助设计一致的UI体验。 在创建UI组件时,还需要使用Kotlin的协程来处理异步任务和网络请求,以保持应用的响应性和性能。确保共享模块中不直接依赖任何特定平台的UI元素,使得模块的复用性最大化。 在实现过程中,开发者可以参考《Kotlin多平台实战:从Android到iOS的跨平台开发》一书。该书详细解释了Kotlin Multiplatform的架构和工作机制,并提供了一系列的实战案例,帮助开发者从概念到实践全面掌握KMP跨平台开发技术。通过学习这本书,开发者将能够有效地利用Kotlin Multiplatform解决跨平台UI组件开发中遇到的问题。 参考资源链接:[Kotlin多平台实战:从Android到iOS的跨平台开发](https://wenku.csdn.net/doc/6ushm70gop?spm=1055.2569.3001.10343)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值