騰訊開源 ovCompose 跨平臺框架:實現一次跨三端(Android/iOS/鴻蒙)

在這里插入圖片描述

在移動應用開發領域,跨平臺技術一直是開發者們追求的目標,它能夠幫助企業降低開發成本、提高開發效率,同時保證應用在不同平臺上的一致性體驗。2025 年 6 月 3 日,騰訊視頻團隊迎來了一個重要的里程碑 —— 正式發布 ovCompose 跨平臺框架,這一框架的最大亮點在于全面支持純血鴻蒙系統,為開發者們帶來了全新的跨端開發體驗。

1. 背景:跨平臺需求的升級與挑戰

隨著純血鴻蒙系統的推出,單純的 UI 跨端已經難以滿足復雜業務的需求,企業迫切需要構建能夠同時在 Android、iOS 和鴻蒙平臺上運行的全跨端應用,以最大程度地降低開發成本、提升人效。與此同時,對于非小程序類的常規應用來說,開發者們更希望在保持原生優良性能的同時,使用行業通用的 UI 開發語言,以降低學習成本。

Kotlin 與 Compose 作為 Google 官方推薦的 Android 開發語言與 UI 框架,深受開發者們的喜愛。Kotlin Multiplatform(KMP)更是具備高性能、與原生交互靈活等優點,因此騰訊視頻團隊選擇了 Compose Multiplatform 作為全跨端應用的基礎。

然而,這套方案也存在一些問題,如不支持純血鴻蒙、iOS 平臺混排能力受限、GC 性能表現一般等。面對這些挑戰,騰訊視頻團隊經過不懈努力,成功解決了這些問題,并決定將解決方案開源,與全行業一同推動 Compose 跨端生態的成熟。

2. 框架的核心特性與優勢

2.1 KuiklyBase 高性能:原生方案帶來極致體驗

KuiklyBase 是騰訊為 Kotlin Multiplatform 開發提供的一整套跨平臺基礎能力組件。它選擇了 Native 方案而非 JS 方案,這是因為 Kotlin-Native(KN)相比 JS 具有更快的執行速度。ovCompose 底層依托 KuiklyBase ,通過一系列的性能優化,KN+Compose 的性能表現令人矚目。
在這里插入圖片描述

在 “小球碰撞” Demo 測試中,以 30FPS 為最低極限,優化后小球數量從 600 提升到 1500(Android 可達 1600 球),繪制性能提升了 150%。這些優化成果不僅提升了應用的流暢度,也為更復雜的業務場景提供了堅實的性能基礎。

2.2 鴻蒙三明治架構:完美解決視圖混排難題

鴻蒙平臺采用了 Skia 的渲染方案,能夠 100% 支持 Compose 語法和渲染能力。通過三明治鏤空結構,很好地解決了與原生組件的混排問題。原生 UI 可以靈活地展示在 Compose 上層或下層,滿足了絕大部分的業務需求。
在這里插入圖片描述

更值得一提的是,該架構還支持粘貼按鈕等安全組件的混排,使得 Compose 無需申請權限也能使用系統能力,這在提升開發效率的同時,也增強了應用的安全性。

2.3 三端高一致性:邏輯與 UI 的完美統一

在邏輯運行方面,由于鴻蒙平臺采用了 Kotlin-Native 方案,解決了 Kotlin-JS 使用 TaskPool 時無法約束跨線程訪問的問題,保持了高度的三端一致性。
在這里插入圖片描述

在 UI 繪制方面,iOS、鴻蒙平臺均采用 Skia 渲染,Android 底層也使用 Skia 渲染,應用層暴露了 Paragraph/Canvas 的繪制接口。基于 Skia 封裝后的 Skiko 可以完美還原 Android 繪制效果,實現了三端 UI 的高度一致。這意味著開發者們可以在三個平臺上 100% 使用 Compose 的控件與繪制能力,大大降低了開發和維護成本。

2.4 iOS 多模態渲染:解放混排能力

針對 iOS 端大量存量業務模塊高度依賴 Compose 與原生 UI 混合編排能力的需求,騰訊視頻團隊提出了指令映射的自研實現方案。這種方案在畫布層進行映射實現,雖然開發難度較高,但可以充分利用 UIKit 豐富的渲染能力,對 Compose 的繪制效果實現較高的還原度。

該方案成功在騰訊視頻 iOS 端核心業務場景落地,業務團隊甚至可以根據實際應用場景在基于 UIKit 實現的自研指令映射方案或官方的 Skia 渲染方案之間自由切換,并且可以在 Runtime 期共存。在文本渲染方面,通過 Skia 將文本渲染成圖片,利用 CALayer 進行展示的方案,保持了高度的一致性。
在這里插入圖片描述

2.5 Kotlin Native 內存優化:GC 與堆 Dump 的雙重突破

  • GC 優化:在 APP 滑動等高幀率場景,短暫抑制 GC 保障流暢;低影響場景高頻 GC 降低 PSS。分析 CMS 算法發現兩次 STW 暫停,利用 GC 掛起能力,在 Vsync 時掛起、idle 時恢復,并調整 munmap 流程,將第二次 STW 時間壓縮至 1ms 內。

  • KN 堆 Dump 優化:KN 堆轉儲會暫停線程致界面凍結。鴻蒙端借助 Linux 內核 fork 特性,以 “父子進程異步轉儲” 實現零延遲;iOS 端重新設計流程,緩存數據異步寫入,使 450MB 轉儲耗時從 2.8 秒降至 410 毫秒,滿足線上使用需求。

2.6 KuiklyBase 組件生態:豐富組件助力高效開發

KuiklyBase 提供了豐富的組件生態,涵蓋了開發過程中的各個方面:

  • Kotlin Native 堆棧還原組件:提供 Kotlin 異常堆棧還原,方便定位問題。
  • Kotlin Native/ArkTS 互調用組件:支持 ArkTS 與 Kotlin Native 跨語言訪問,提供基礎類型、閉包、ArrayBuffer 等類型互轉,統一的生命周期管理,支持跨線程同步調用和跨 Runtime 的服務發現。
  • 資源管理組件:構建了一套跨平臺原生資源管理解決方案,支持 Android、iOS 及 HarmonyOS 三大移動端平臺,實現了多平臺資源統一管理與編譯期強校驗。
  • 原子操作組件:提供輕量級的原子類型,支持原子讀寫、CAS 等操作,實現線程安全的并發編程。
  • 協程組件:簡化異步和并發編程,支持協程構建器、調度器、掛起函數等能力。
  • 序列化組件:支持高效、類型安全的對象序列化與反序列化,兼容多種復雜類型。
  • IO、網絡等三方工具庫:為開發者提供了全面的工具支持,屏蔽了平臺差異,提高了開發效率。

3. 實現原理:技術細節的深度探索

3.1 KN 鴻蒙平臺適配:創新方案解決架構難題

Kotlin 1.9 使用的 LLVM 11,Kotlin 2.1 升級到 LLVM 16,但鴻蒙平臺能夠支持的版本在 LLVM 12~15。騰訊視頻團隊提出了一種創新的 KuiklyBase 方案:在第一步 Kotlin IR 轉 LLVM IR 時采用蘋果的 LLVM 11,在 LLVM IR 生成可執行文件時使用鴻蒙的 LLVM 12。這種方案既滿足了需求,又無需對 Kotlin 本身進行架構調整,解決了常規方案中需要依賴不同 Kotlin 版本的問題。
在這里插入圖片描述

3.2 KN 性能優化:多維度提升運行效率

  • 內聯優化:對比 Kotlin IR 與 LLVM IR 文件,發現鴻蒙平臺 LLVM IR 內聯不足,添加 always inline 后性能顯著提升。后查明 Kotlin 與 C++ 代碼生成 LLVM 函數時 cpu feature 不一致影響內聯,經屬性配置修復問題。

  • ThreadLocal 優化:分析 Benchmark 中鴻蒙耗時超 iOS 的案例,發現其默認用軟件模擬 thread_local 致 Kotlin-Native 內存分配性能差。通過編譯時強制使用硬件 thread_local,性能提升 30%。

  • 協程性能優化:Compose Multiplatform 協程調度依賴異常處理模型,運行損耗大,且鴻蒙 libhilog.so 捕獲異常加劇延遲。通過緩存或舍棄關鍵位置異常,解決非法捕獲,實現長列表滑動 120Hz 穩定。

  • 調試性能優化:針對 Kotlin Native 調試耗時過長問題,在 KDS 與 LLDB 上采用流程合并、緩存等優化手段,提升通信與處理效率,性能提升數倍至數十倍,接近 Native 水平。

3.3 鴻蒙繪制不同步問題解決:Texture 模式實現完美同步

在鴻蒙系統中,Compose 列表與 ArkUI 元素混排滾動時,由于兩種組件屬于獨立的繪制層,存在不同步的問題,導致 UI 銜接處出現空白區域。騰訊視頻團隊采用 XComponent 的 Texture 模式,將內容繪制到 FBO 中,由 FBO 參與原有的 ArkUI 的繪制節奏,保證了完全的同步,解決了這一難題。
在這里插入圖片描述

3.4 iOS 多模態渲染:PictureRecorder 局部更新架構提升效率

針對 iOS 集中渲染架構的特點,設計了基于 iOS 的 PictureRecorder 局部更新架構。通過對繪制命令進行差量處理,只更新變化的部分,提升了繪制效率。進一步升級后,采用增量 hash 來減少 hash 計算量,并將原先由 OC 對象代表的指令改為簡單的 C 結構體,去掉 OC 閉包,大幅提升了渲染效率。以騰訊視頻的視頻播放頁面為例,首次渲染耗時降低 13%,再次渲染耗時降低 56%。

3.5 與 KuiklyUI 的差異:兩種方案滿足不同需求

騰訊大前端 Oteam 同時進行了兩種方案的探索:

  • 原生渲染方案 KuiklyUI:側重于靜態化 + 動態化雙運行模式,采用輕量原生渲染保持原生 UI 體驗并具備高度一致性,基于原生組件映射的方式支持 Compose API,還支持 H5 和小程序(6 月底推出)。

  • 自渲染方案 ovCompose:專注于全面對齊 Compose Multiplatform 標準 API,采用自渲染方式實現鴻蒙平臺的適配,確保三端高度一致性,針對 iOS 上較多的存量業務,提出多模態渲染方案解決低端 iPhone 內存緊張、混排原生視圖、手勢等問題。

4. 開源說明:攜手業界共建生態

此次開源共包含 5 個倉庫,涵蓋了 ovCompose 和 KuiklyBase:

  • ovCompose-sample:展示 ovCompose 與 KuiklyBase 的功能。
  • ovCompose-multiplatform-core:基于 JetBrains 的 compose-multiplatorm-core 定制,實現鴻蒙端適配及 iOS 多模態渲染能力。
  • KuiklyBase-kotlin:基于 JetBrains 的 kotlin-multiplatform 定制,適配鴻蒙平臺并進行了部分優化。
  • KuiklyBase-components:封裝常用的跨端組件,涵蓋資源管理、跨語言通信、網絡請求和圖片加載四大模塊。
  • KuiklyBase-platform:基于官方組件適配鴻蒙平臺,并對部分功能進行性能優化,提升開發效率,現已覆蓋 10 個基礎組件。

倉庫 group 地址:https://github.com/Tencent-TDS

5. 未來計劃:持續優化推動技術進步

盡管 KMM 生態已經取得了長足的發展,Kotlin-Native 的執行性能在很多方面超越了 Kotlin-JVM,但 Compose Multiplatform 跨平臺技術還沒有達到成熟的狀態(特別是 GC)。ovCompose & KuiklyBase 將持續優化,重點關注以下方向:

  • GC 在業務場景的表現:進一步優化 GC 性能,減少對應用流暢度的影響。
  • Kotlin-Native 組件化:提升組件化水平,提高開發效率和代碼復用率。
  • Kotlin-Native 的開發體驗優化:簡化開發流程,提升開發者體驗。
  • UIKit 渲染模式進一步對齊 Skia 的渲染:確保 iOS 平臺上的渲染效果與其他平臺更加一致。

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

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

相關文章

對3D對象進行形變分析

1,目的 分析3D實例對象相對標準參照物的形變。 一般用于質地較軟的材質(例如橡膠,布料)查找,檢查等。 標準參考模型 需匹配的實例: 形變后的模型:* 形變后的模型: 實例形變后的…

寶塔面板WordPress中使用Contact Form 7插件收不到郵件的解決方法

如果是寶塔面板的環境下,在WordPress中使用Contact Form 7插件提交表單時顯示成功,但郵箱未收到郵件,可能是由于服務器郵件功能配置問題。以下是幾種常見解決方法: 1. 檢查郵件發送方式 默認情況下,Contact Form 7 使…

Android中的DX、D8、R8

Kotlin 版本所需的 AGP、D8 和 R8 版本 :https://developer.android.google.cn/build/kotlin-support?hlzh_cn R8:https://developer.android.google.cn/tools/retrace?hlzh_cn D8:https://developer.android.google.cn/tools/d8?hlzh_cn 如上圖&…

通義靈碼 AI IDE 上線!智能體+MCP 從手動調用工具過渡到“AI 主動調度資源”

告訴大家一個好消息,通義靈碼發布了 AI 編程 IDE :Lingma IDE ,你沒看錯,通義靈碼也推出了自己的 AI IDE 客戶端,不是 AI 編程插件,是 IDE 。 Lingma IDE 是基于 VS Code 開源版本構建的智能代碼編輯器&am…

快速解決軟件測試的邏輯方法運用

在軟件測試過程中,遇到復雜問題時,如何快速定位和解決?關鍵在于運用邏輯方法,系統化地分析問題、設計測試用例、優化測試流程。本文將介紹幾種高效的邏輯方法,幫助測試工程師提升效率,減少盲測和重復勞動。…

楓清科技攜手中化信息挖掘實現AI高價值場景應用,打通智能化“最后一公里”

近日,中國中化控股有限責任公司(以下簡稱“中國中化”)發布“人工智能”專項行動推進方案,標志著其全面深化人工智能戰略布局、全力支撐“數智中化”建設進入加速落地階段。作為集團智能化轉型的核心支撐單位,中國中化…

Yolov5.6增加注意力機制+ByterTrack:目標檢測與跟蹤

簡介:本項目使用ESP32-CAM采集圖像上傳至上位機進行手部目標檢測與追蹤,使用了YOLOv5.6(注意力機制ECA,CBAM)ByteTrack 博主同款迅雷鏈接: 鏈接:https://pan.xunlei.com/s/VOSO1EIzmXhBb_BIKM58cM5cA1# 提…

C++進階—C++中的繼承

第一章:繼承的概念及定義 1.1繼承的概念 繼承(inheritance)機制是面向對象程序設計使代碼可以復用的最重要的手段,它允許程序員在保持原有類特性的基礎上進行擴展,增加功能,這樣產生新的類,稱派生類。繼承呈現了面向…

力扣Hot100每日N題(11~14)

200. 島嶼數量 BFS或DFS class Solution {private int[] dx {0, 0, 1, -1};private int[] dy {1, -1, 0, 0};int ans 0, n, m;void dfs(char[][] grid, int x, int y){if(x < 0 || y < 0 || x > n || y > m || grid[x][y] 0) return;grid[x][y] 0;for(int i…

人工智能 倒底是 智能 還是 智障?

假設有如下哈希運算的過程和結果&#xff0c;然后讓人工智能根據初始條件和最終結果的最后幾個字符推理出中間過程。 yw "123456" salt "a1b2c3d4e5f6" sda256(saltsha1(md5(yw.encode)salt)) 1c5852fa5d3c450621c17b9ba87ffdab8d336b16f015b4a10cffc945…

傳智健康---十天項目總結

第一天&#xff1a; 基本內容如下&#xff1a; 從gitee拉取對應的基礎代碼。做好配置相關工作。測試頁面是否可以正常打開。 無問題 需要學習的內容&#xff1a;spring security 了解到這個框架的基礎作用大概是&#xff1a;管理請求路徑&#xff0c;管理用戶權限&#xf…

AbMole| Angiotensin II human(M6240;血管緊張素Ⅱ)

Angiotensin II&#xff08;血管緊張素II&#xff09;是一種生物活性肽和血管收縮劑。Angiotensin II作為腎素-血管緊張素-醛固酮系統&#xff08;RAAS&#xff09;的關鍵活性成分&#xff0c;在動物模型中&#xff0c;它通過調節于血管平滑肌細胞上的血管緊張素II受體&#xf…

【C/C++】gmock vs mockcpp

文章目錄 gmock vs mockcpp1 基本介紹2 語法風格與使用方式gmock 特點&#xff08;基于接口 Mock&#xff09;&#xff1a;mockcpp 特點&#xff08;基于重寫/攔截原函數&#xff09;&#xff1a; 3 對比總結4 實際使用建議 gmock vs mockcpp gmock 和 mockcpp 是 C 中常用的兩…

自己的服務器被 DDOS跟CC攻擊了怎么處理,如何抵御攻擊?

今天后臺突然彈出警報&#xff1a;服務器帶寬瞬間跑滿&#xff0c;CPU 占用率飆到 100%。刷新頁面時&#xff0c;首頁加載像卡帶般斷斷續續&#xff0c;圖片剛顯示半張就卡住&#xff0c;點擊任何按鈕都沒反應。登錄服務器一看&#xff0c;訪問日志里密密麻麻全是陌生 IP 的高頻…

icg真的只能用latch不能用Flip-flop嗎

soc設計中常用latch來做時鐘門控&#xff0c;它的rtl描述如下&#xff1a; input EN; input clk; input TE; output E_clk;always (*) beginif (clk1d0)E_latch EN | TE; endassign E_clk E_latch & clk;實際soc實現會把上面代碼中latch和與操作換成專用CLKLANQ的libcel…

基于python大數據的nba球員可視化分析系統

博主介紹&#xff1a;java高級開發&#xff0c;從事互聯網行業六年&#xff0c;熟悉各種主流語言&#xff0c;精通java、python、php、爬蟲、web開發&#xff0c;已經做了六年的畢業設計程序開發&#xff0c;開發過上千套畢業設計程序&#xff0c;沒有什么華麗的語言&#xff0…

從0開始學習R語言--Day22--km曲線

KM曲線 在分析疾病的死亡率時&#xff0c;我們往往會糾結于怎樣在邏輯架構中去考慮未死亡的人群&#xff0c;以及想研究兩種藥物的表現效果&#xff0c;但病人的指標表現都不明顯&#xff0c;作用于其他指標且很難量化。 而KM曲線可以很好地反映人群在時間序列上的生存率&…

SpringBoot ?@ControllerAdvice 處理異常

應用中的異常&#xff0c;有兩件事要考慮&#xff0c;怎么處理這個異常&#xff0c;怎么把異常可讀性高地返回給前端用戶 1.怎么把異常可讀性高的返回給前端用戶或API的消費者 自定義錯誤代碼和錯誤內容 2.怎么處理異常 比如遇到某個異常時需要發郵件通知IT團隊 Controlle…

爬百度圖片如何解決{“antiFlag“:1,“message“:“Forbid spider access“}

在學習深度學習的卷積神經算法時&#xff0c;需要貓和狗的訓練數據集。這時想到在百度網上爬取貓和狗的圖片。 在爬取狗狗圖片的時候&#xff0c;我抓包分析了下獲取這個url1 “https://image.baidu.com/search/index?tnbaiduimage&ipnr&ct201326592&cl2&lm&…

QWebEngine

Qt自帶的QWebEngine 不支持播放MP4, 需要手動編譯QWebEngine模塊 不支持播放mp4 // mainwindow.cpp , m_webEngine(new MyWebEngine(this)) void MainWindow::init() { //關閉系統代理&#xff0c;提高速度,采用release會更快QNetworkProxyFactory::setUseSystemConfigurati…