Kotlin是什么蜡塌?
Kotlin
是一種由JetBrains
創(chuàng)造的類型強(qiáng)安全的編程語(yǔ)言纸巷,主要設(shè)計(jì)運(yùn)行在Java虛擬機(jī)(JVM)
上裙戏。
Google
已經(jīng)宣布Kotlin
作為Android
開發(fā)的首選語(yǔ)言凸主。
Kotlin
是開源的,擁有超過400名活躍的貢獻(xiàn)者茉稠。
簡(jiǎn)單來說描馅,Kotlin
是一種廣受歡迎的編程語(yǔ)言。
Kotlin Multiplatform是什么而线?
Kotlin Multiplatform
允許Kotlin
代碼在多平臺(tái)上運(yùn)行铭污,包括JVM
、Android
膀篮、iOS
嘹狞、macOS
、Windows
誓竿、Linux
和Web
等磅网。
雖然Kotlin Multiplatform
仍處于Beta
階段,但它已經(jīng)成為Kotlin
團(tuán)隊(duì)的重點(diǎn)項(xiàng)目筷屡,預(yù)期將在今年(2023)發(fā)布穩(wěn)定版本涧偷。
縮寫釋義:KMP 和 KMM
KMM:Kotlin Multiplatform Mobile
KMP:Kotlin Multiplatform Project
當(dāng)我們只談?wù)撘苿?dòng)設(shè)備開發(fā)時(shí)簸喂,則是KMM。只有iOS和Android嫂丙。
如果我們說的是所有平臺(tái)娘赴,包括Web规哲、服務(wù)端等跟啤,那就是KMP。
什么樣的項(xiàng)目適合使用KMM唉锌?
跨平臺(tái)功能相似的項(xiàng)目最適合使用KMM隅肥。
典型的例子就是iOS
和Android
項(xiàng)目,它們的業(yè)務(wù)邏輯袄简、網(wǎng)絡(luò)腥放、數(shù)據(jù)庫(kù)和日志記錄等都可以進(jìn)行代碼復(fù)用。這些公共部分非常適合進(jìn)行代碼共享绿语。
更棒的是秃症,KMM允許iOS和Android各自實(shí)現(xiàn)其Native UI
。
KMM項(xiàng)目結(jié)構(gòu)
我們用Android Studio
創(chuàng)建一個(gè)KMM項(xiàng)目吕粹,生成的Gradle
項(xiàng)目包含三個(gè)模塊:shared
种柑、androidApp
和iosApp
。
對(duì)于后端開發(fā)匹耕,可以使用IntelliJ來創(chuàng)建KMP項(xiàng)目聚请。
首先看圖片中間的shared
模塊,它包含三個(gè)部分:commonMain
用于存放通用的Kotlin代碼稳其,androidMain
和iosMain
分別用于存放Android和iOS專用代碼驶赏。所有在shared
模塊中的代碼都可以在iOS和Android上使用。
右側(cè)的iosApp
模塊是一個(gè)iOS Xcode項(xiàng)目既鞠,可以打包并上傳到App Store煤傍,并且會(huì)集成shared
模塊的代碼。
最左側(cè)的部分則是一個(gè)Android項(xiàng)目嘱蛋,其工作方式與iosApp模塊相同蚯姆。
連接到特定平臺(tái)的API
雖然KMM允許我們編寫大量的共享代碼,但有時(shí)候浑槽,我們?nèi)孕枰L問特定平臺(tái)的API蒋失。 KMM提供了Expect
和Actual
兩個(gè)關(guān)鍵字,用于實(shí)現(xiàn)這一目標(biāo)桐玻。左圖展示了這兩個(gè)關(guān)鍵字的聲明篙挽。
讓我們一起看看右圖中的例子。假設(shè)我們需要實(shí)現(xiàn)一個(gè)randomUUID()
方法镊靴,但iOS和Android有各自不同的UUID獲取API铣卡。
iOS需要導(dǎo)入Foundation
并使用NSUUID().UUIDString()
链韭,而Android則需要導(dǎo)入java.util
并使用UUID.randomUUID().toString()
。在這種情況下煮落,我們可以使用Expect
和Actual
敞峭。
首先,在圖的頂部蝉仇,我們使用Expect
來聲明一個(gè)randomUUID()
函數(shù)旋讹,接著在iosMain
和androidMain
中使用Actual
來實(shí)現(xiàn)該方法。
這樣轿衔,我們就可以在任何地方使用這個(gè)方法沉迹,而無需關(guān)心每個(gè)平臺(tái)的具體實(shí)現(xiàn)方式,因?yàn)镵MM會(huì)自動(dòng)找到相應(yīng)平臺(tái)的具體實(shí)現(xiàn)害驹。
Expect
和Actual
關(guān)鍵字可適用于函數(shù)鞭呕、類、接口宛官、枚舉葫松、屬性等。
Kotlin Multiplatform是如何工作的?
關(guān)鍵是Kotlin為不同平臺(tái)提供了特定的編譯器
, 可以根據(jù)目標(biāo)平臺(tái)轉(zhuǎn)換代碼底洗。
這些編譯器包括Kotlin/JVM
、Kotlin/JavaScript
和Kotlin/Native
枷恕。編譯器會(huì)將Kotlin代碼轉(zhuǎn)換成相應(yīng)平臺(tái)的可執(zhí)行代碼,從而使普通的Kotlin代碼能夠在不同平臺(tái)上運(yùn)行党晋。
這個(gè)過程實(shí)際上比較復(fù)雜,涉及LLVM
、中間產(chǎn)物徐块、前端編譯器未玻、后端編譯器等。但現(xiàn)在我們只需要知道,KMP的工作原理是依賴不同的編譯器就可以了胡控。
在新項(xiàng)目或已有項(xiàng)目中使用
我們可以自由選擇在項(xiàng)目中應(yīng)用Kotlin Multiplatform的范圍扳剿。
可以啟動(dòng)一個(gè)全新的項(xiàng)目,將數(shù)據(jù)層和業(yè)務(wù)層全部使用KMM來編寫。
也可以僅選擇某個(gè)邏輯使其跨平臺(tái),將其作為微庫(kù)連接到現(xiàn)有項(xiàng)目中昼激。
重點(diǎn)是,使用KMM非常靈活,你可以將其理解為僅是一個(gè)集成到主項(xiàng)目中的共享SDK,由你決定SDK的內(nèi)容庇绽。
原生性能
KMP直接將共享代碼編譯成各平臺(tái)的可執(zhí)行代碼,因此性能與原生一致。
良好的社區(qū)支持
許多知名庫(kù)已經(jīng)支持Kotlin Multiplatform
, 如Ktor
橙困、SQLDelight
瞧掺、Arrow
和Realm
等。
而且正如之前提到的, JetBrains
和Google
也在大力支持它凡傅。