本文原作者: 戀貓de小郭,原文發(fā)布于: GSYTech
又到了喜聞樂(lè)見(jiàn)的環(huán)節(jié),「本篇主要是科普 KMM、Compose 和 Flutter 的最新現(xiàn)狀」,對(duì)于 Compose 和 Flutter 大家可能并不陌生,但是對(duì)于 KMM 也許會(huì)存在疑惑,KMM 全稱 Kotlin Multiplatform Mobile,顧名思義它是用 Kotlin 實(shí)現(xiàn)的跨平臺(tái)框架,那為什么今天突然會(huì)聊到它?
起因如下圖所示,最近有人提及了 KMM,并且用了 "變天" 的詞匯,頓時(shí)就勾起了我的興趣,因?yàn)?KMM 這些年來(lái)一直 "不溫不火",可以說(shuō)很多使用 Kotlin 開(kāi)發(fā)的 "Androider" 對(duì)它都很陌生,難道最近它又有了什么突破性的進(jìn)展?
而在求證一番之后,原來(lái)起因來(lái)自 10 月初「Android 官方宣布Jetpack 開(kāi)始要支持 KMM」了,目前Collections和DataStore已經(jīng)可以通過(guò)依賴-dev01版本在多平臺(tái)上使用,同時(shí)「KMM 進(jìn)入 Beta 版本階段」。 「所以目前 KMM 變不了天,至少它還處于 Beta 階段,但是 Jetpack 開(kāi)始支持 KMM 是個(gè)很好的消息,這意味著 KMM 的社區(qū)支持有了官方保證」。
好了,介紹完起因,接下來(lái)開(kāi)始進(jìn)入今天的主題,什么是 KMM、Compose 和 Flutter。
KMM
Kotlin Multiplatform Mobile – KMM 是基于 Kotlin 并應(yīng)用在 iOS 和 Android 的一種跨平臺(tái)技術(shù),它的特點(diǎn)是結(jié)合了跨平臺(tái)和原生開(kāi)發(fā)協(xié)同開(kāi)發(fā)的模式,如下圖所示,簡(jiǎn)單的理解就是:「從純?cè)_(kāi)發(fā)變成了 KMM + 原生 UI 開(kāi)發(fā)」。

「使用 KMM 可以把您的業(yè)務(wù)邏輯和基建部分的能力跨平臺(tái)化」,例如網(wǎng)絡(luò)請(qǐng)求、數(shù)據(jù)存儲(chǔ),狀態(tài)上報(bào)等模塊通過(guò) KMM 實(shí)現(xiàn) Android 和 iOS 通用,例如前面介紹的 DataStore 就可以在 iOS 上支持使用。
在官方的介紹里 KMM 的早期使用者有百度、Netflix、VMWare、Philips 等,目前收到的反饋都挺不錯(cuò),而 Beta 版本也意味著現(xiàn)在 KMM 已經(jīng)具備了使用的基礎(chǔ)。
那您可能會(huì)好奇,KMM 支持 Web 嗎?
聊到這個(gè)話題就很有趣,從我的角度上看,我會(huì)說(shuō) Kotlin Multiplatform 支持,但是 KMM 不支持。 如果您安裝過(guò) KMM 插件和創(chuàng)建過(guò) KMM 項(xiàng)目,您會(huì)看到 KMM 不管是從 logo 還是項(xiàng)目創(chuàng)建都只有 Android 和 iOS,但是,Kotlin Multiplatform 是支持 Web 的,通過(guò) Kotlin JS。
如果接觸 Kotlin Multiplatform 比較早,那您可能還聽(tīng)說(shuō)過(guò) KMP,KN 之類的縮寫,那它們和 KMM 又是什么關(guān)系?簡(jiǎn)單來(lái)說(shuō):
- KMP 一般指的就是 Kotlin Multiplatform,我依稀記得 KMP 這個(gè)概念是在 Kotlin 1.2 的時(shí)候被提出,可以將 Kotlin 運(yùn)行到特定平臺(tái)的 JVM 和 JS 代碼上
- KN 一般指的是 Kotlin Native,KN 屬于是將 Kotlin 編譯為 Native 二進(jìn)制文件的技術(shù),甚至可以在沒(méi)有虛擬機(jī)的情況下運(yùn)行,例如 KMM 上的 iOS 就是使用了 KN 的能力
- KMM 是利用了 JVM 和 KN 能力實(shí)現(xiàn)的針對(duì) Android 和 iOS 平臺(tái)的 Kotlin 框架: Android (Kotlin/JVM) 和 iOS (Kotlin/Native)

另外還有 Kotlin JS 用于 Web 平臺(tái),「所以 KMP 可以看作是大集合,而 KMM 是其中針對(duì) Android 和 iOS 的支持,另外通過(guò) Kotlin Native 和 Kotlin JS 也可以支持拓展到 PC 端和 Web 端」。
那么到這里您應(yīng)該理解:「KMM 主要是用來(lái)寫跨平臺(tái)邏輯,涉及到 UI 部分您還是需要通過(guò)原生實(shí)現(xiàn)」,如果您從另外一個(gè)角度看,用 KMM 對(duì)于 Android 開(kāi)發(fā)來(lái)說(shuō)幾乎等于白送的能力,因?yàn)樗恍枰?Kotlin。至少 Compose 您還需要適應(yīng)下響應(yīng)式開(kāi)發(fā)模式。
那或者有人就問(wèn):那 KMM 的意義何在? 事實(shí)上還真有,「KMM 在 App 的基建上會(huì)很實(shí)用,比如做數(shù)據(jù)上報(bào),崩潰統(tǒng)計(jì),數(shù)據(jù)分析等等」,純邏輯的跨平臺(tái)不影響 UI 部分,目前也是在這些場(chǎng)景上 KMM 應(yīng)用較多。
另外還有人問(wèn)我,KMM 可以用 Java 開(kāi)發(fā)嗎?嗯,這是個(gè)好問(wèn)題,下次不要再問(wèn)了。當(dāng)然,KMM 也存在一些局限,比如使用 ViewModel 和協(xié)程如何在 iOS 上運(yùn)行的問(wèn)題,不過(guò)社區(qū)針對(duì)這部分也有一些第三方支持,所以對(duì)于 KMM 的未來(lái)還是值得期待。
Compose
Compose 相信大家不會(huì)陌生,「其實(shí) Compose 也可以分兩部分看待,Jetpack Compose 和 Compose Multiplatform」:-
由 Android 官方維護(hù)的 Jetpack Compose
-
由 JetBrains 維護(hù)的compose-jb實(shí)現(xiàn)的 Compose Multiplatform
但是要說(shuō)完全沒(méi)關(guān)系顯然是不可能,畢竟 Kotlin Native 和 Kotlin JS 的能力其實(shí)在 Compose Multiplatform 里很重要。
當(dāng)然,如下圖所示,Compose Multiplatform 在跨平臺(tái)開(kāi)發(fā)體驗(yàn)上還是有所區(qū)別,「Compose 目前是通過(guò)多個(gè)模塊不同實(shí)現(xiàn)來(lái)支持多平臺(tái),所以目前 Jetpack Compose 和 Compose Multiplatform 有一些 "割裂"」,特別是在 Web 端,想要達(dá)到 Flutter 一樣共享代碼的比例還需要繼續(xù)努力。
?PS: 圖比較老,iOS 其實(shí)目前已經(jīng)進(jìn)入實(shí)驗(yàn)階段, androidx.compose.ui.main.defaultUIKitMain 相關(guān)的支持距離正式發(fā)布可以期待。
另外 Compose Multiplatform 還有的問(wèn)題就是缺少插件社區(qū),這其實(shí)是跨平臺(tái)領(lǐng)域必不可少的配置:「前端有 npm、Flutter 有 pub,您可以通過(guò)它們的中央官網(wǎng)搜索您想要的庫(kù),查看它們的熱度,版本,兼容和使用量等等信息,設(shè)置官方認(rèn)證和安全保障,但是 Maven 時(shí)代在這方面一直很弱」。
另一方面 Compose 的優(yōu)勢(shì)也很明顯:
- Kotlin 生態(tài)
- Android 開(kāi)發(fā)友好
- 打包體積增長(zhǎng)不大,代碼壓縮比例高
- 性能不錯(cuò),compose-android 和 compose-desktop 都使用 Skia

PS: JetBrains 目前就已經(jīng)將 Toolbox 應(yīng)用通過(guò) Compose Multiplatform 實(shí)現(xiàn)并且發(fā)布使用。
Flutter
現(xiàn)在 Flutter 已經(jīng)是 3.3 的版本,F(xiàn)lutter 的特點(diǎn)就是跨平臺(tái),因?yàn)樗](méi)有自己的平臺(tái),同時(shí)它也是 single codebase 的跨平臺(tái)實(shí)現(xiàn)。
?關(guān)于 Flutter 和其他框架的對(duì)比或者使用數(shù)據(jù)就不多贅述,這里介紹一些其他比較有意思的話題。
1. FlutterVSOther量化對(duì)比 2. 國(guó)內(nèi)大廠應(yīng)用在移動(dòng)端Flutter框架使用分析 3. 國(guó)內(nèi)大廠在移動(dòng)端跨平臺(tái)的框架接入分析
「在 Jetbrains 的開(kāi)源項(xiàng)目里有一個(gè)叫skiko的項(xiàng)目」,Skiko (Kotlin 的 Skia 的縮寫) 是一個(gè)圖形庫(kù),它支持 Kotlin/JVM、Kotlin/JS、Kotlin/Native 等相關(guān)實(shí)現(xiàn),目前支持有:
- Kotlin/JVM - Linux、Windows、macOS、Android
- Kotlin/JS - web
- Kotlin/Native - iOS 、macOS
其實(shí)未來(lái) Linux、Windows 等平臺(tái)也完全可以脫離 JVM 通過(guò) Kotlin/Native + Skiko 實(shí)現(xiàn)支持,只是維護(hù)成本會(huì)變高。
而「Flutter 在自建渲染引擎上其實(shí)已經(jīng)越來(lái)越激進(jìn),因?yàn)橹苯邮褂?Skia 已經(jīng)無(wú)法滿足日益增長(zhǎng)的 Bug 和性能極限,所以官方開(kāi)始了自研渲染引擎 Impeller」。 因?yàn)?Flutter 團(tuán)隊(duì)現(xiàn)在出現(xiàn)問(wèn)題每次都要和 Skia 團(tuán)隊(duì)溝通,然后等跟進(jìn),這樣的節(jié)奏太慢了,從官方的更新日志上就可以看出目前 Flutter 的迭代速度依然很夸張。

所以「這次自研的 Impeller 本質(zhì)上是為了解決 Skia 需要運(yùn)行時(shí)遇到的問(wèn)題,Impeller 可以直接在編譯器就完成 GLSL 和 MSL,不需要 SKSL 從而提高了性能和運(yùn)行時(shí)的穩(wěn)定性」,目前優(yōu)先在 iOS 平臺(tái)上開(kāi)始支持,配合 Metal 做優(yōu)化,后續(xù)如果沒(méi)問(wèn)題也會(huì)同步支持 Android 和 Vulkan。
從這個(gè)角度猜測(cè),F(xiàn)lutter 在 Skia 遇到的問(wèn)題 Compose Multiplatform 也很可能會(huì)遇上,而如果后續(xù) Impeller 項(xiàng)目進(jìn)展順利,那它或者并不會(huì)局限在 Flutter,也許也可以拓展支持到 Compose Multiplatform 上。
其實(shí)自研發(fā)引擎并不奇怪,隨著項(xiàng)目的發(fā)展和深入,很多底層問(wèn)題沒(méi)辦法快速推進(jìn)就會(huì)反推自研,例如Hermes 在 RN 0.7 成為默認(rèn) Engine也是類似問(wèn)題的體現(xiàn),「自研底層屬于是一個(gè)負(fù)責(zé)任的開(kāi)源團(tuán)隊(duì)的必經(jīng)之路」。
最后
今天這篇文章的內(nèi)容更多的是科普性質(zhì)而非技術(shù)性,主要是針對(duì)目前 KMM、Compose 和 Flutter 的現(xiàn)狀做一個(gè)陳述,其實(shí)很多時(shí)候它們之間并不沖突,但是作為開(kāi)發(fā)者很經(jīng)常就像開(kāi)頭一樣,用 "對(duì)立" 的角度來(lái)看 A 火了 B 就要掛,這種心態(tài)大可不必。
長(zhǎng)按右側(cè)二維碼
查看更多開(kāi)發(fā)者精彩分享

"開(kāi)發(fā)者說(shuō)·DTalk" 面向
中國(guó)開(kāi)發(fā)者們征集 Google 移動(dòng)應(yīng)用 (apps & games)?相關(guān)的產(chǎn)品/技術(shù)內(nèi)容。歡迎大家前來(lái)分享您對(duì)移動(dòng)應(yīng)用的行業(yè)洞察或見(jiàn)解、移動(dòng)開(kāi)發(fā)過(guò)程中的心得或新發(fā)現(xiàn)、以及應(yīng)用出海的實(shí)戰(zhàn)經(jīng)驗(yàn)總結(jié)和相關(guān)產(chǎn)品的使用反饋等。我們由衷地希望可以給這些出眾的中國(guó)開(kāi)發(fā)者們提供更好展現(xiàn)自己、充分發(fā)揮自己特長(zhǎng)的平臺(tái)。我們將通過(guò)大家的技術(shù)內(nèi)容著重選出優(yōu)秀案例進(jìn)行谷歌開(kāi)發(fā)技術(shù)專家 (GDE)?的推薦。
?點(diǎn)擊屏末|閱讀原文|即刻報(bào)名參與 "開(kāi)發(fā)者說(shuō)·DTalk"



原文標(biāo)題:一文快速帶您了解 KMM、Compose 和 Flutter 的現(xiàn)狀 | 開(kāi)發(fā)者說(shuō)·DTalk
文章出處:【微信公眾號(hào):谷歌開(kāi)發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
谷歌
+關(guān)注
關(guān)注
27文章
6254瀏覽量
111404
原文標(biāo)題:一文快速帶您了解 KMM、Compose 和 Flutter 的現(xiàn)狀 | 開(kāi)發(fā)者說(shuō)·DTalk
文章出處:【微信號(hào):Google_Developers,微信公眾號(hào):谷歌開(kāi)發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
【扔物線】Jetpack Compose:從上手到進(jìn)階再到高手資源課程
2025華為開(kāi)發(fā)者大賽暨開(kāi)發(fā)者年度會(huì)議成功舉辦
探秘 CYSBSYSKIT - DEV - 01 快速物聯(lián)網(wǎng)連接開(kāi)發(fā)者套件
2025開(kāi)源鴻蒙開(kāi)發(fā)者激勵(lì)計(jì)劃正式啟動(dòng)
Flutter 移動(dòng)端開(kāi)發(fā):集成淘寶 API 實(shí)現(xiàn)商品數(shù)據(jù)實(shí)時(shí)展示 APP
元服務(wù)發(fā)布配置開(kāi)發(fā)者服務(wù)信息
2025開(kāi)放原子開(kāi)發(fā)者大會(huì)11月啟幕
NVIDIA DRIVE AGX Thor開(kāi)發(fā)者套件重磅發(fā)布
曙光網(wǎng)絡(luò)SugonRI開(kāi)發(fā)者社區(qū)正式上線
Android Studio中的Gemini全面支持Dart和Flutter開(kāi)發(fā)
迅龍軟件參加昇騰 AI?開(kāi)發(fā)者創(chuàng)享日?廣東站,為開(kāi)發(fā)者打造沉浸式實(shí)操體驗(yàn)
HDC 2025開(kāi)發(fā)者主題演講精彩回顧
使用 Flutter SDK 3.27.4構(gòu)建HarmonyOS應(yīng)用
Flutter on Raspberry Pi:從入門到精通的完整指南!
一文快速帶您了解 KMM、Compose 和 Flutter 的現(xiàn)狀 | 開(kāi)發(fā)者說(shuō)·DTalk
評(píng)論