2024 Google I/O 宣布正式支持 Kotlin Multiplatform ,那 KMP 是什么?它的未來在哪里?

基于最近一直有人和我提 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/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14157.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14157.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14157.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Nginx配置文件

當然,讓我們一步步來了解Nginx配置文件,即使你是完全的初學者也能輕松跟上。想象一下Nginx是一個超級聰明的接待員,它知道如何處理各種各樣的訪客請求,而這些規則,我們就寫在一個叫做nginx.conf的文件里。 1. 找到配置…

AJAX(JavaScript版本)

目錄 一.AJAX簡介 二.XMLHttpRequests對象 2.1XMLHttpRequests對象簡介 2.2創建XMLHttpRequests對象 2.3定義回調函數 2.4發送請求 2.5XMLHttpRequests對象方法介紹 2.6XMLHttpRequests對象屬性 三.向服務器發送請求 3.1發送請求 3.2使用GET還是POST 3.3使用GET來發…

前端nvm、nodejs、npm、cnpm、yarn安裝教程(超詳細圖文,含卸載舊的nodejs,安裝及環境變量配置)

最近換了新電腦,一開始在網上找了一個教程讓下載nvm-noinstall.zip 壓縮包解壓使用,踩坑了,過程復雜最后報錯無法用。 后來搜到下文教程,直接使用nvm。exe進行安裝,方便快捷。下面這個文章寫的很詳細,從如何…

谷歌快速收錄怎么做?

快速收錄顧名思義,就是讓新的的網頁內容能夠迅速被谷歌搜索引擎抓取、索引和顯示在搜索結果中,這對于做seo來說非常重要,因為它有助于新發布的內容盡快出現在谷歌的搜索結果中,從而增加網站的流量 想做谷歌快速收錄谷歌推薦了幾種…

12. Web開發:介紹Web開發的基本概念,Servlet和JSP的使用,MVC設計模式的應用等。

Web開發的輕松入門之旅 想象一下,Web開發就像是搭建一個在線的小家,你既是設計師,又是建筑師,還是管家。我們一步步來探索這個過程,保證簡單易懂,就像搭積木一樣有趣! Web開發基礎認知 Web開…

mybatis-plus 開發中常用的

1、查詢 // 假設有一個 QueryWrapper 對象&#xff0c;設置查詢條件為 age > 25 QueryWrapper<User> queryWrapper new QueryWrapper<>(); queryWrapper.gt("age", 25); List<User> users userService.list(queryWrapper); // 調用 list 方法…

【MySQL02】【 InnoDB 記錄存儲結構】

文章目錄 一、前言二、InnoDB 行格式1. COMPACT 行格式1.1 記錄的額外信息1.2 記錄的真實數據1.3 綜上 2. REDUNDANT 行格式2.1 字段長度偏移列表2.2 記錄頭信息 3. DYNAMIC 行格式和 COMPPESED 行格式 三、InnoDB 數據頁結構1. File Header (文件頭部)2. Page Header (頁面頭部…

(一)Go語言使用:常用API

Math import("math" ) // 比較大小 a,b float64 其他的最大最小得自己實現 Math.max(a,b) Math.min(a,b) // 最大數 最小數 math.MaxInt64 math.MinInt64 ? math.Sqrt(5) // 開方 返回float64 math.Pow(a,b) // 求冪 參數都是float64sort & 排序 // 排序 sort…

探索Linux中的神奇工具:深入了解wc命令

探索Linux中的神奇工具&#xff1a;深入了解wc命令 在Linux系統中&#xff0c;wc命令是一個簡單但功能強大的工具&#xff0c;用于統計文件中的字數、行數和字符數。本文將詳細介紹wc命令的基本用法和一些常見選項&#xff0c;幫助讀者更好地理解和運用這個命令。 了解wc命令…

移動硬盤不小心制作成啟動盤怎么辦?別慌,這樣解決更輕松

在數字化時代&#xff0c;移動硬盤作為我們存儲和攜帶重要數據的重要設備&#xff0c;其安全性與便利性不言而喻。然而&#xff0c;在日常使用中&#xff0c;我們可能會遇到一些意想不到的情況&#xff0c;比如一不小心將移動硬盤制作成了啟動盤。面對這種情況&#xff0c;許多…

【Linux】centos7修改主機名

在CentOS 7中&#xff0c;您可以使用hostnamectl命令修改主機名。以下是步驟和示例代碼&#xff1a; 查看當前主機名&#xff1a; hostnamectl status 設置靜態主機名&#xff1a; sudo hostnamectl set-hostname 新主機名 將新主機名替換為您想要設置的主機名。 退出并重新登…

HTTP 重定向 狀態碼3xx

http狀態碼301代表永久重定向。當服務器收到客戶端的請求時&#xff0c;會將其重定向到另一個url&#xff0c;而不是返回請求的資源。通常用于以下情況&#xff1a; 1、當網站的url結構發生變化或網站遷移到新的域名時。 2、當網站上存在重復內容時&#xff0c;可以使用301狀態…

go select 原理

編譯器會使用如下的流程處理 select 語句&#xff1a; 將所有的 case 轉換成包含 channel 以及類型等信息的 runtime.scase 結構體。調用運行時函數 runtime.selectgo 從多個準備就緒的 channel 中選擇一個可執行的 runtime.scase 結構體。通過 for 循環生成一組 if 語句&…

Spring-AOP入門案例

Spring-AOP&#xff08;Aspect Oriented Programming&#xff0c;面向切面編程&#xff09;是Spring框架的一個重要部分&#xff0c;它允許開發者在不修改原有業務邏輯代碼的情況下&#xff0c;為程序添加額外的功能&#xff0c;如日志記錄、事務管理、安全性控制等。以下是一個…

使用OPENCV查找邊界,提取出面積前top_n的圖像部分,順序粘貼到指定背景圖像上合成單個照片

使用OPENCV查找邊界,提取出面積前top_n的圖像部分,順序粘貼到指定背景圖像上合成單個照片 注意,僅適用于簡單邊緣邊界 import argparse import sysimport cv2 import os import numpy as npif __name__ "__main__":parser argparse.ArgumentParser(description請指…

1W、2W 3KVAC隔離 寬電壓輸入 交直兩用AC/DC 電源模塊——TP01(02)AZ 系列

TP01(02)AZ為客戶提供一款超小體積模塊式開關電源&#xff0c;該系列模塊電源輸出功 率為1W、2W&#xff0c;具有極低的空載損耗&#xff0c;低漏電流僅0.1mA&#xff0c;小體積&#xff0c;隔離耐壓高達 3KV等特點。產品安全可靠&#xff0c;EMC 性能好&#xff0c;EMC 及安全…

【低照度圖像增強系列(7)】RDDNet算法詳解與代碼實現(同濟大學|ICME)

前言 ?? 在低照度場景下進行目標檢測任務&#xff0c;常存在圖像RGB特征信息少、提取特征困難、目標識別和定位精度低等問題&#xff0c;給檢測帶來一定的難度。 &#x1f33b;使用圖像增強模塊對原始圖像進行畫質提升&#xff0c;恢復各類圖像信息&#xff0c;再使用目標檢測…

裝飾器模式與代理模式的區別?

代理模式 為其他對象提供一種代理以控制對這個對象的訪問。在某些情況下&#xff0c;一個對象不適合或者不能直接引用另一個對象&#xff0c;而代理對象可以在客戶端和目標對象之間起到中介的作用。 代理模式的適用場景&#xff1a; 功能增強 當需要對一個對象的訪問提供一些…

SpringBoot(九)之整合mybatis

SpringBoot&#xff08;九&#xff09;之整合mybatis 文章目錄 SpringBoot&#xff08;九&#xff09;之整合mybatisSpring整合mybatis回顧1. 引入依賴2. mybatis-config.xml SpringBoot整合mybatis1.引入依賴2. 配置數據源和 MyBatis 屬性3. 配置 Mapper 接口4. 配置mapper.xm…

Python | 十一、項目搭建

項目環境配置 python setup.py 是 Python 中設置、分發和安裝模塊的傳統方式。setup.py 文件通常位于一個 Python 項目的根目錄下&#xff0c;并且定義了一個名為 setup 的函數。這個 setup 函數是 setuptools&#xff08;或者早期的 distutils&#xff09;模塊的一部分&#…