基于最近一直有人和我提 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 現在也有類似替代框架,例如:
-
Koin
-
Kodein
-
kotlin-inject
-
Koject
-
DI.kt
-
PopKorn
最重要的是,JB 現在提供了包發布和檢索網站: https://package-search.jetbrains.com/
,這是跨平臺必備的社區支撐,類似 npm、pub 平臺,這對于 Kotlin Multiplatform 生態的重要性不言而喻。
至于使用了 Kotlin Multiplatform 的知名企業,目前已知的有:
- 麥當勞
- netflix
- PHILIPS
- 百度
- Meetup
- 快手
- VMware
- …
最后,其實今年 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/