Kotlin Multiplatform Mobile

簡(jiǎn)介

Kotlin Multiplatform Mobile门怪,縮寫(xiě)為KMM诅妹,記住這個(gè)縮寫(xiě)芜抒,今后遇到它珍策,知道是在說(shuō)什么

KMM目前處于alpha階段,預(yù)計(jì)在2022年春季發(fā)布beta版本宅倒。就是今年春天攘宙,還剩幾天時(shí)間了,猜一下會(huì)不會(huì)延期拐迁?

截止到今天(2022/4/7)蹭劈,仍是alpha版本,也就是beta版本延期了线召。

KMM用于簡(jiǎn)化跨平臺(tái)應(yīng)用開(kāi)發(fā)铺韧。使用KMM可以用kotlin寫(xiě)代碼,并可以在android和iOS之間共享這些代碼缓淹,也可以使用kotlin寫(xiě)平臺(tái)特有的代碼

跨平臺(tái)的原理

使用kotlin編寫(xiě)祟蚀,之后編譯出目標(biāo)平臺(tái)代碼

編譯出不同的平臺(tái)代碼

借助Kotlin Multiplatform,可以讓用Kotlin寫(xiě)的代碼可以在所有平臺(tái)上運(yùn)行

Kotlin Multiplatform

Kotlin/Native是什么

  • Kotlin/Native是一種把Kotlin代碼編譯為native二進(jìn)制并且無(wú)需虛擬機(jī)就能運(yùn)行的技術(shù)

包大小
Android 平臺(tái)以 aar 的形式集成割卖,許多依賴(lài)的 Kotlin 基礎(chǔ)庫(kù),例如 kotlinx.coroutines 以及 kotlinx.serialization 等等都沒(méi)有打進(jìn)這個(gè) aar 里患雏,再加上編譯產(chǎn)物又是字節(jié)碼鹏溯,總 size 增長(zhǎng)只有 0.03 MB。但是 iOS 有所不同淹仑,編譯產(chǎn)物是二進(jìn)制碼丙挽,再加上整個(gè) Kotlin/Native 的基礎(chǔ)庫(kù)肺孵、Runtime 等等通通打進(jìn)了這個(gè) Framework,總 size 增長(zhǎng)為 1.5 MB颜阐,當(dāng)然后續(xù)再持續(xù)集成業(yè)務(wù)代碼的話平窘,增長(zhǎng)幅度不會(huì)再這么驚人

KMM對(duì)比Flutter

體積

  1. 使用 Flutter 需要在 App 包內(nèi)部增加兩個(gè)引擎:

    • 一個(gè)是 Flutter 的渲染引擎,該引擎使用 C/C++ 開(kāi)發(fā)凳怨,直接調(diào)用 OpenGL/Skia 的 API 進(jìn)行繪制瑰艘,從而擺脫 iOS 的 UIKit 以及 Android 的 View 組件直接渲染成需要的樣式,從保證樣式高度統(tǒng)一
    • 一個(gè)是 Dart 語(yǔ)言的 Runtime肤舞,用于解析并運(yùn)行 Dart 語(yǔ)言編譯的 Bundle

    這兩者減小了開(kāi)發(fā)者的適配成本紫新,但增大了 APP 的包體積(其他類(lèi)似的跨平臺(tái)框架,如:React Native 等李剖,也會(huì)內(nèi)置 JavaScript Core 或 V8 引擎)

  2. KMM 針對(duì)不同平臺(tái)生成不同的二進(jìn)制依賴(lài)包芒率,根本上還是調(diào)用了 Android、iOS 的原生 API篙顺,并不會(huì)內(nèi)置引擎這類(lèi)文件偶芍,對(duì) App 的體積影響相對(duì)較小,同時(shí)也保證了性能

技術(shù)棧

  • Flutter 使用 Dart 開(kāi)發(fā)德玫,無(wú)論是 Web 開(kāi)發(fā)者匪蟀,還是原生 App 開(kāi)發(fā)者,都需要抽時(shí)間去學(xué)習(xí)一門(mén)新的語(yǔ)言化焕,理解新的開(kāi)發(fā)模式萄窜,雖然 Dart 與 JavaScript、Java 有著類(lèi)似之處撒桨,且開(kāi)發(fā)形式和 React 相近查刻,但仍有一定學(xué)習(xí)門(mén)檻
  • Kotlin 已經(jīng)成為 Google 官方主推的 Android 開(kāi)發(fā)語(yǔ)言,且由于Kotlin 與 Java 交互非常方便凤类,目前很多 Android 開(kāi)發(fā)者已經(jīng)完全切換到 Kotlin 來(lái)進(jìn)行 App 開(kāi)發(fā)穗泵,很多與平臺(tái)無(wú)關(guān)的工具類(lèi)、算法谜疤、數(shù)據(jù)模型可以直接利用 KMM 實(shí)現(xiàn)跨平臺(tái)佃延,與 Flutter 相比,至少 Android 開(kāi)發(fā)者的門(mén)檻要求較低

風(fēng)險(xiǎn)點(diǎn)

  • 眾所周知夷磕,App Store 對(duì) App 的審核一直都是極為嚴(yán)格的履肃,JSPatch、React Native 等框架的使用都有過(guò)審核被拒的情況坐桩,從某種角度來(lái)看尺棋,F(xiàn)lutter 與 Swift UI 在一定程度上目標(biāo)相似,且繞開(kāi) iOS SDK 的 UIKit绵跷,Apple 雖沒(méi)有明確對(duì) Flutter 表態(tài)膘螟,但按照 Apple 的風(fēng)格成福,F(xiàn)lutter 在未來(lái)仍存在一定的被拒風(fēng)險(xiǎn)
  • KMM 會(huì)將 Kotlin 代碼編譯為標(biāo)準(zhǔn)的 Apple Framework,在不引入其他第三方庫(kù)的情況下荆残,不存在調(diào)用高風(fēng)險(xiǎn) API 的情況奴艾,故對(duì) App Store 審核的影響較小,風(fēng)險(xiǎn)較低

適用場(chǎng)景

  • 由于 Flutter 采用類(lèi)似 3D 游戲的渲染理念内斯,統(tǒng)一了界面渲染引擎蕴潦,利用 Dart 可以高度保證雙端樣式和交互邏輯一致,且?guī)缀醪淮嬖诮缑孢m配問(wèn)題嘿期,完全抹平了 TextView 和 UILabel 這類(lèi)控件之間的差異品擎,所以 Flutter 適合于界面構(gòu)建
  • 而 KMM 并不適合 UI,雙端的組件备徐,生命周期萄传、API 差異都比較大,KMM 在技術(shù)上可以實(shí)現(xiàn)功能蜜猾,但相當(dāng)于寫(xiě)了兩份代碼秀菱,失去了意義;KMM適合寫(xiě)邏輯的代碼蹭睡。

看一個(gè)例子

工程結(jié)構(gòu)

image.png
  • androidApp:Android工程代碼
  • iosApp:iOS工程代碼
  • shared:Kotlin編寫(xiě)的跨平臺(tái)代碼

android和iOS設(shè)置依賴(lài)后衍菱,可以直接引用shared工程內(nèi)的"kotlin"代碼

shared目錄

commonMain

// expect關(guān)鍵字:申明是平臺(tái)差異化代碼
expect class Platform() {
    val platform: String
}

class Greeting {
    fun greeting(): String {
        return "Hello, ${Platform().platform}!"
    }
}

androidMain

// actual:是平臺(tái)差異化代碼的實(shí)現(xiàn)
actual class Platform actual constructor() {
    actual val platform: String = "Android ${android.os.Build.VERSION.SDK_INT}"
}

iOSMain

import platform.UIKit.UIDevice

// actual:是平臺(tái)差異化代碼的實(shí)現(xiàn)
actual class Platform actual constructor() {
    actual val platform: String = UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion
}

androidApp目錄

fun greet(): String {
    return Greeting().greeting()
}

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val tv: TextView = findViewById(R.id.text_view)
        tv.text = greet()
    }
}

運(yùn)行

Android
iOS

我們哪些場(chǎng)景可以使用KMM?

  • 數(shù)據(jù)埋點(diǎn)
  • 網(wǎng)絡(luò)請(qǐng)求
  • 加解密
  • 與Compose配合肩豁,完整實(shí)現(xiàn)跨平臺(tái)開(kāi)發(fā)(Compose當(dāng)前只支持Android平臺(tái)脊串,但是它是有擴(kuò)展至其他平臺(tái)的能力)

參考文章

https://kotlinlang.org/docs/multiplatform-mobile-getting-started.html
https://blog.jetbrains.com/zh-hans/kotlin/2021/05/whats-new-in-kmm-since-going-alpha/
https://coderyuan.com/2021/05/26/KMM-1/
https://cloud.tencent.com/developer/article/1889664
https://mp.weixin.qq.com/s/e3k5JcxG1FvGlNkOyjNIFw

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市清钥,隨后出現(xiàn)的幾起案子琼锋,更是在濱河造成了極大的恐慌,老刑警劉巖祟昭,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缕坎,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡篡悟,警方通過(guò)查閱死者的電腦和手機(jī)谜叹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)搬葬,“玉大人荷腊,你說(shuō)我怎么就攤上這事〖被耍” “怎么了停局?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我董栽,道長(zhǎng),這世上最難降的妖魔是什么企孩? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任锭碳,我火速辦了婚禮,結(jié)果婚禮上勿璃,老公的妹妹穿的比我還像新娘擒抛。我一直安慰自己,他們只是感情好补疑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布歧沪。 她就那樣靜靜地躺著,像睡著了一般莲组。 火紅的嫁衣襯著肌膚如雪诊胞。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天锹杈,我揣著相機(jī)與錄音撵孤,去河邊找鬼。 笑死竭望,一個(gè)胖子當(dāng)著我的面吹牛邪码,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播咬清,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼闭专,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了旧烧?” 一聲冷哼從身側(cè)響起影钉,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎粪滤,沒(méi)想到半個(gè)月后斧拍,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡杖小,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年肆汹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片予权。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡昂勉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出扫腺,到底是詐尸還是另有隱情岗照,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站攒至,受9級(jí)特大地震影響厚者,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜迫吐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一库菲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧志膀,春花似錦熙宇、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至戳稽,卻和暖如春馆蠕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背广鳍。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工荆几, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赊时。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓吨铸,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親祖秒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子诞吱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容