簡(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)代碼
借助Kotlin Multiplatform,可以讓用Kotlin寫(xiě)的代碼可以在所有平臺(tái)上運(yùn)行
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
體積
-
使用 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 引擎)
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)
- 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)行
我們哪些場(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