腾讯开源 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…