騰訊 Kuikly 正式開源,了解一下這個基于 Kotlin 的全平臺框架

在 3月的時候通過 《騰訊 TDF 即將開源 Kuikly 跨端框架,Kotlin 支持全平臺》 我們大致知道了 Kuikly 的基本情況,Kuikly 是一個面向終端技術棧的跨端開發框架,完全基于kotlin語言開發,提供原生的性能和體驗。

按照官方的說法:Kuikly 是基于Kotlin Multiplatform 的 UI 與邏輯全面跨端綜合解決方案,由騰訊大前端領域 Oteam(公司級)推出,目的在于提供一套一碼多端、極致易用、動態靈活的全平臺高性能開發框架

當然,雖然是全平臺,但是目前暫時只開源了 Android 和 iOS,鴻蒙部分 5 月才開源,而 Web 和 小程序暫定是 Q2:

img

官方表示 Kuikly 在騰訊內部本身已經支持了小程序 + H5 ,后續會分步驟開放,可能下一期還不會是所有小程序平臺。

那 Kuikly 如何實現跨平臺?目前 Kuikly 主要是在 KMP 的基礎上實現的自研 DSL 來構建 UI ,比如 iOS 平臺的 UI 能力就是 UIkit ,而大家更熟悉的 Compose 支持,目前還處于開發過程中:

img

SwiftUI 和 Compose 無法直接和 Kuikly 一起使用,但是 Kuikly 可以在 DSL 語法和 UI 組件屬性對齊兩者的寫法,變成一個類 Compose 和 SwiftUI 的 UI 框架,也就是 Compose DSL 大概就是讓 Kuikly 更像 Compose ,而不是直接適配 Compose

那么大家可能會有疑問,既然借助了平臺控件的能力,那它和 RN 有什么區別?

首先 Kuikly 是直接從編譯產物的角度實現跨平臺,它的編譯產物與原生一致,和 RN 是在運行時轉換為原生控件不同,Kotlin 是直接編譯為對應平臺的原生代碼,所以在運行時其實就類似原生 code 。

那 Kuikly 又如何保證多端 UI 一致?答案是 Kuikly 實現了自己的一套「薄原生層」

首先在 Kotlin 層,Kuikly 將虛擬 Dom 方案優化為直調方案,這里 Kotlin View API 直調,避免 JSON 序列化/反序列化損耗,同時只維護一棵樹,更輕量和O(1)同步UI更新:

img

之后,Kuikly 使用“非常薄”的原生層,該原生層只暴露最基本和無邏輯的 UI 組件(原子組件),也就是 Kuikly 在 UI 上只用了最基本的原生層 UI ,真正的 UI 邏輯主要在共享的 Kotlin 代碼來實現:

通過將 UI 邏輯抽象到共享的 Kotlin 層,減少平臺特定 UI 差異或行為差異的可能性,「薄原生層」充當一致的渲染目標,確保 Kotlin 定義的 UI 元素在所有平臺上都以類似的方式顯示。

img

也就是說,Kuikly 雖然會依賴原生平臺的控件,但是大部分控件的實現都已經被「提升」到 Kuikly 自己的 Kotlin 共享層,目前 Kuikly 實現了 60% UI 組件的純 Kotlin 組合封裝實現,不需要 Native 提供原子控件

img

最容易出現不一致的高階組件都通過 Kotlin 實現,比如 List 列表控件,Kuikly 通過對齊 Native 的 List 內部實現原理,然后再用 Kotlin 重寫一次,從而實現真正的高一致性 UI 組件跨平臺實現。

img

所以基于上面的內容,我們再來看 Kuikly UI 官方提供的結構圖,是不是就清晰了很多:

img

  • Core 模塊提供了統一的 UI 邏輯實現和 API 接口
  • Render 模塊負責在 Android、iOS、HarmonyOS、H5 以及各種小程序等多個平臺上實現 UI 的渲染 。

另外在 Kuikly 領域,還有一套名為 KuiklyBase 服務,它是獨立于 Kuikly UI 之外,為 Kuikly 提供基礎設施支持,比如為 iOS、Android 和鴻蒙三大移動平臺提供了統一的底層基建能力:

img

KuiklyBase 強調在不同平臺之間實現高性能的邏輯共享 ,它更像是 KMP 的進一步定制,KuiklyBase 兼容標準的 Kotlin Multiplatform 組件,允許復用成熟的 KMP 組件,比如有些業務各端都已經有 UI 層的實現,僅僅需要非 UI 的業務邏輯實現跨端,而通過 KuiklyBase 的基礎設施,也可以滿足這種場景的需求。

另外 KuiklyBase 還提供了對 HarmonyOS 平臺的全面支持,包括 KN HarmonyOS 編譯、調試和構建能力。

也就是 Kuikly 在鴻蒙有支持 Kotlin Native 高性能版本。

同時,KuiklyBase 還提供了強大的多線程和協程能力,支持復雜業務邏輯的跨平臺并行處理,以滿足高性能場景的需求。

并且在開發工具鏈方面,KuiklyBase 覆蓋了從腳手架搭建到調試、構建、發布和監控的整個流程,特別是支持和 Bugly 和 Shiply 聯動提供配套能力。

最后,KuiklyBase 還內置了性能優化工具,并針對 HarmonyOS 和 iOS 提供了優化的調試體驗 。

目前使用 KuiklyBase 業務的團隊:騰訊視頻、瀏覽器、新聞、輸入法、理財通····

當然,這里需要注意的是, KuiklyBase 和 KuiklyUI 一起使用,某種情況下會存在場景沖突:

  • KuiklyUI 的 iOS 和鴻蒙動態化方案主要利用了 Kotlin/JS 編譯成 js 產物,動態下發到宿主的js引擎去執行
  • KuiklyBase 利用 Kotlin/Native 編譯成高性能的二進制產物執行,因此沒有解耦 KuiklyBase 的 KMP 組件,在 iOS 和鴻蒙在動態化場景需要注意兼容

所以,動態化決定了你優先使用哪個支持:

  • 無動態化訴求場景: KuiklyBase + KuiklyUI = 完美

  • 有動態化訴求場景: KuiklyBase 兼容 js 動態化方案還沒完成,短期方案可利用 KuiklyUI 的 Module 方案來作為替代

上面問題的核心其實是,KuiklyBase 組件因為是 KMP 組件,沒有和平臺做解耦,動態化時產物會運行在 js 環境中,由于 js 單線程,無法直接提供平臺能力等的限制,所以決定了動態化部分不能直接使用多線程和平臺能力。

所以業務在開發過程中需要特別注意在調用平臺 KMP 組件能力的時候,需要通過 Kuikly Module 方式進行解耦調用,避免直接依賴

Kuikly 作為一個跨端的 UI 框架, 他本身不具備調用平臺 API 的能力, 但是Kuikly提供了一套Module機制,可以通過Module機制將平臺的 API 暴露給 Kuikly 側調用,同時 Kuikly內置了一些通用的 Module , 如果這些 Module 不滿足 業務訴求時, 可以通過擴展原生 API 自定義Module, 將更多的宿主平臺 API 暴露給 Kuikly 側使用。

在 KuiklyUI 內部,模塊頁面分為兩種類型:可動態化類型(內置和動態靈活切換)和純內置類型(只能內置) :

img

而可動態化類型部分:

  • 不可直接依賴平臺能力
  • 不可使用多線程和協程
  • 不可依賴內置部分
  • 不可依賴使用到了平臺能力或多線程協程等能力的 KMP 組件,如果無法避免需要使用相關能力,就需要前面提到額 Kuikly Module 進行解耦調用

核心就是,動態化的只能是 JS 。

最后,以下是 Kuikly 工程的項目結構說明:

.
├── core                    # 跨平臺模塊,實現各個平臺響應式 UI、布局算法、Bridge 通信等核心能力├── src├── commanMain            # 跨平臺共享代碼、定義跨平臺接口 ├── androidMain           # Android 平臺實現代碼 (aar)├── jvmMain               # 泛 JVM 平臺代碼(不涉及 Android API)(jar)├── iosMain               # iOS 平臺實現代碼(framework)
├── core-render-android    # android 平臺的渲染器模塊
├── core-render-ios        # iOS 平臺的渲染器模塊
├── core-annotations       # 注解模塊,定義業務注解 @Page
├── core-ksp               # 注解處理模塊,生成 Core 入口文件 
├── buildSrc               # 編譯腳本,用于編譯、打包、分包產物相關腳本
├── demo                   # DSL 示例代碼 
├── androidApp             # Android 宿主殼工程
└── iosApp                 # iOS 宿主殼工程

還有需要注意的是,之前的 Kuikly 的插件還不支持 K2 模式,所以如果你的 IDE 是 K2 模式,需要關閉 K2 才能支持插件:

img

而一天之后,已經是 1.0.3 版本,此時 KuiklyTemplate 插件也支持了最新的 K2 模式:

img

針對 Mac 用戶還提供 kdoctor CI 支持:img

另外,Kuikly 未來也會兼容 Compose DSL ,但是大概率不會是原本的 Compose ,而是類 Compose 的代碼組織方式。

另外,在混合開發領域,在原有 App 集成 Kuikly ,可以把它簡單當作如系統 webview 的概念來使用,但是如果在原生列表中嵌入 Kuikly view,目前會因為 Kuikly 本身的異步機制,導致無法同原生列表其它卡片同時生存layout和view結果,造成顯示上的不同步。

可以看到,Kuikly 總得來說還是一個類 RN 框架,但是它又不像 RN 一樣的運行時 OEM 原生控件,而是在編譯成完成轉化為原生代碼,并且它抽象出了統一的 「薄原生層」,讓大量高階控件在共享的 Kotlin 層完成實現,只讓少量 native 層提供原子組件能力,從而盡可能實現 UI 的多端統一,類似于把原生控件單做 “Canvas" 效果使用。

總的來說,Kuikly 既能實現接近原生的性能體驗和原生的開發體驗,又能提供良好的動態化能力,看起來還是不錯的選擇。

最后,官方表示 Kuikly 對于 Android 的同學家基本沒有學習成本,只要使用過響應式開發的都能上手,而對于 iOS 同學而已,大概就是需要熟悉一下 Kotlin 語法,不過 Kotlin 和 Swift 相近度挺高,所以上手也不會太困難。

目前 Kuikly 已經在 QQ、QQ音樂、QQ瀏覽器、騰訊新聞、搜狗輸入法、應用寶、全民K歌、酷狗音樂、酷我音樂、自選股、ima.copilot、微視等多款產品中使用,那么,你覺得你會愿意嘗試 Kuikly 嗎?

參考鏈接

  • https://kuikly.tds.qq.com/
  • https://github.com/Tencent-TDS/KuiklyUI/

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

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

相關文章

AI驅動UI自動化測試框架調研

隨著應用復雜度增加,手動測試變得費時且易出錯,而自動化測試可提高效率和可靠性。如何借助大模型和一些自動化測試框架進行自動化測試,是一個研發團隊很重要的訴求。 目前主流的自動化測試框架很多,Midscene.js結合Playwright提供…

關系型數據庫設計指南

1. 前言 在自己獨立開發一個項目的過程中,我發現了一些以往寫小 Demo 從來沒有遇到過的問題。 最近在獨立制作一個全棧的通知管理平臺。一開始我沒有考慮太多,直接根據頭腦中零星的想法就開擼后端數據庫 model 和 API,用的是學了半成品的 M…

詳解TypeScript中的類型斷言及其繞過類型檢查機制

TypeScript中的類型斷言及其繞過類型檢查機制 一、類型斷言的本質與工作原理編譯時與運行時的區別TypeScript編譯器處理類型斷言的步驟 二、類型斷言的詳細語法與進階用法基礎語法對比鏈式斷言斷言修飾符1. 非空斷言操作符 (!)代碼分析1. getLength 函數分析用法說明&#xff1…

XLSX.utils.sheet_to_json設置了blankrows:true,但無法獲取到開頭的空白行

在用sheetJs的XLSX庫做導入,遇到一個bug。如果開頭行是空白行的話,調用sheet_to_json轉數組獲得的數據也是沒有包含空白行的。這樣會導致在設置對應的起始行時,解析數據不生效。 目前是直接跳過了開頭的兩行空白行 正確應該獲得一下數據 問…

PostgreSQL 數據庫下載和安裝

官網: PostgreSQL: Downloads 推薦下載網站:EDB downloads postgresql 我選了 postgresql-15.12-1-windows-x64.exe 鼠標雙擊,開始安裝: 安裝路徑: Installation Directory: D:\Program Files\PostgreSQL\15 Serv…

一、Javaweb是什么?

1.1 客戶端與服務端 客戶端 :用于與用戶進行交互,接受用戶的輸入或操作,且展示服務器端的數據以及向服務器傳遞數據。 例如:手機app,微信小程序、瀏覽器… 服務端 :與客戶端進行交互,接受客戶…

奇偶ASCII值判斷

奇偶ASCII值判斷 Description 任意輸入一個字符,判斷其ASCII是否是奇數,若是,輸出YES,否則,輸出NO。例如,字符A的ASCII值是65,則輸出YES,若輸入字符B(ASCII值是66),則輸…

OpenCV 圖形API(74)圖像與通道拼接函數-----合并三個單通道圖像(GMat)為一個多通道圖像的函數merge3()

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 從3個單通道矩陣創建一個3通道矩陣。 此函數將多個矩陣合并以生成一個單一的多通道矩陣。即,輸出矩陣的每個元素將是輸入矩陣元素的…

多節點監測任務分配方法比較與分析

多監測節點任務分配方法是分布式系統、物聯網(IoT)、工業監測等領域的核心技術,其核心目標是在資源受限條件下高效分配任務,以優化系統性能。以下從方法分類、對比分析、應用場景選擇及挑戰等方面進行系統闡述: 圖1 多…

【推薦系統筆記】BPR損失函數公式

一、BPR損失函數公式 BPR 損失函數的核心公式如下: L BPR ? ∑ ( u , i , j ) ∈ D ln ? σ ( x ^ u i j ) λ ∣ ∣ Θ ∣ ∣ 2 L_{\text{BPR}} - \sum_{(u, i, j) \in D} \ln \sigma(\hat{x}_{uij}) \lambda ||\Theta||^2 LBPR??(u,i,j)∈D∑?lnσ(x^ui…

Java 核心--泛型枚舉

作者:IvanCodes 發布時間:2025年4月30日🤓 專欄:Java教程 各位 CSDN伙伴們,大家好!👋 寫了那么多代碼,有沒有遇到過這樣的“驚喜”:滿心歡喜地從 ArrayList 里取出數據…

新能源行業供應鏈規劃及集成計劃報告(95頁PPT)(文末有下載方式)

資料解讀:《數字化供應鏈規劃及集成計劃現狀評估報告》 詳細資料請看本解讀文章的最后內容。 該報告圍繞新能源行業 XX 企業供應鏈展開,全面評估其現狀,剖析存在的問題,并提出改進方向和關鍵舉措,旨在提升供應鏈競爭力…

Centos 7 yum配置出現一下報錯:

One of the configured repositories failed (CentOS-$releaserver-Base), and yum doesnt have enough cached data to continue. At this point the only safe thing yum can do is fail. There are a few ways to work "fix" this: 1.解決CentOS Yum Repositor…

Redis 常見問題深度剖析與全方位解決方案指南

Redis 是一款廣泛使用的開源內存數據庫,在實際應用中常會遇到以下一些常見問題: 1.內存占用問題 問題描述:隨著數據量的不斷增加,Redis 占用的內存可能會超出預期,導致服務器內存不足,影響系統的穩定性和…

HOOK上癮思維模型——AI與思維模型【88】

一、定義 HOOK上癮思維模型是一種通過設計一系列的觸發(Trigger)、行動(Action)、獎勵(Reward)和投入(Investment)環節,來促使用戶形成習慣并持續使用產品或服務的思維框…

【playwright】內網離線部署playwright

背景:安裝好python3.9后,由于內網無法使用pip安裝playwright,多方收集資料,終于部署完成,現匯總如下: 1、playwright需要python3.7以上的版本,如果低于這個版本先要將python解釋器升級 2、在可…

Unity動態列表+UniTask異步數據請求

Unity動態列表UniTask異步數據請求 很久沒有寫東西了。最近有一個需求,在Unity項目里,有幾個比較長的列表,經歷了一翻優化,趁這幾日閑暇,記錄下來,給自己留個筆記,也送給有緣之人共同探討吧。 …

pandas讀取Excel數據(.xlsx和.xls)到treeview

對于.xls文件,xlrd可能更合適,但需要注意新版本的xlrd可能不支持xlsx,不過用戶可能同時需要處理兩種格式,所以可能需要結合openpyxl和xlrd?或者直接用pandas,因為它內部會處理這些依賴。 然后,…

2025年Jetpack Compose集成網絡請求庫的完整實施方案

Compose中集成網絡請求庫,網絡請求現在Retrofit是最流行的。 首先在Compose中如何進行網絡請求,而不僅僅是集成庫。因為Compose本身是UI框架,網絡請求其實還是通過ViewModel或者Repository來處理,然后通過狀態管理來更新UI。所以…

機器視覺開發-攝像頭掃描二維碼

以下是使用Python和OpenCV實現攝像頭掃描二維碼的最簡單示例: import cv2 from pyzbar import pyzbar# 打開攝像頭 cap cv2.VideoCapture(0)print("正在掃描二維碼... (按 q 鍵退出)")while True:# 讀取攝像頭幀ret, frame cap.read()if not ret:print…