腾讯 ovCompose 开源,Kuikly 鸿蒙和 Compose DSL 开源,腾讯的“双”鸿蒙方案发布

article/2025/6/8 4:59:40

近日,腾讯的 ovCompose 和 Kuikly 都发布了全新开源更新,其中 Kuikly 在之前我们聊过,本次 Kuikly 主要是正式开源鸿蒙支持部分和 Compose DSL 的相关支持,而 ovCompose 是腾讯视频团队基于 Compose Multiplatform 生态推出的跨平台开发框架,ovCompose 主要是为了弥补官方 CMP 不支持鸿蒙平台的遗憾和解决 iOS 平台混排受限的问题

那可能有人要问了,这两者有什么关系?

首先它们都是属于腾讯大前端领域 Oteam ,并且 ovCompose 和 Kuikly 都依赖于 KuiklyBase ,可以说 KuiklyBase 是腾讯视频和 Oteam 共建的 KMP 基础支持

KuiklyBase 之前我们就聊过,它服务是独立于 Kuikly UI 之外,为 Kuikly 提供基础设施支持,比如为 iOS、Android 和鸿蒙三大移动平台提供了统一的底层基建能力:

而这部分支持对于鸿蒙平台也非常重要,特别是在鸿蒙平台编译支持上,而在新开源的 ovCompose 上,KuiklyBase 也是共享使用,所以不严谨考虑,可以简单认为,大家都是基于 KuiklyBase 的 KMP 支持,而在上层渲染:

  • KuiklyUI 使用原生 OEM 渲染,但是有自己的「薄原生层」利用原子组件实现 UI 统一,并且 KuiklyUI 侧重于静态化+动态化双运行模式(Kotlin/JS),后续还能可以支持 H5 和小程序,有 Compose DSL ,但是不是真正的 Compose
  • ovCompose 采用官方标准 CMP API ,Skia 自绘,支持 Android 、iOS 和鸿蒙三端,只考虑 Kotlin Native 方,是对于标准 CMP 的横向拓展

所以,在 KMP 角度可以认为它们是同源的,特别是基于 Kotlin Native 的鸿蒙实现上,KuiklyBase 方案基本通用,例如,KuiklyBase 在编译时,在将 Kotlin IR 转 LLVM IR 时会先采用苹果的 LLVM 11,在 LLVM IR 生成可执行文件时使用鸿蒙的 LLVM 12,这样既可以满足诉求,Kotlin本身也无需进行架构调整:

当然,这也造成了你要编译鸿蒙平台,只能使用 mac 电脑。

所以,如果你有 Web 和小程序需求,那么你还是选 KuiklyUI 更合适,特别如果你还需要动态化。

但是如果你只考虑移动端三端,那么 ovCompose 或者更适合你,因为它基于 Compose Multiplatform ,横向扩展了鸿蒙平台,而纵向则是优化了 iOS 平台的混合开发,对于喜欢 CMP 的人来说可能会更容易接受,并且性能理论上会更好一点。

例如 ovCompose 在 iOS 上设计了基于 iOS 的 PictureRecorder 局部更新架构,优化的核心思路是通过增量 hash 来减少 hash 的计算量,并希望对应优化,后续可以反向 PR 合并到 Jetbrains:

而在鸿蒙平台,KuiklyUI 毫无意外也是通过 C API 实现指令的映射,毕竟直接走 ArkUI 实现的 OEM 性能实在堪忧,基本上类似 RN 的实现都会选择直接对接底层 C API,例如 Taro on Harmony C-API 版本 。

而对于 ovCompose ,因为是自绘方案,所以在混合开发里,则是采用 XComponent 的 Texture 模式,将内容绘制到 FBO ,由FBO 参与原有的 ArkUI 的绘制节奏来保证完全的同步:

最后,Kuikly 也支持了 Compose DSL,不过是基于 Kuikly 核心架构与通用渲染层之上,扩充对标准Compose DSL 的支持,就是写法 Compose 了,组件命令和 API 也和 Compose 相近,例如 Kuikly Compose 就支持 Compose 的布局系统,包括所有布局组件和布局修饰符:

@Page("helloWorld")
internal class HelloWorldPage : ComposeContainer() {override fun willInit() {super.willInit()setContent {// 编写Compose代码}}
}LazyRow(modifier: Modifier = Modifier,state: LazyListState = rememberLazyListState(),contentPadding: PaddingValues = PaddingValues(0.dp),reverseLayout: Boolean = false,horizontalArrangement: Arrangement.Horizontal = Arrangement.Start,verticalAlignment: Alignment.Vertical = Alignment.Top,content: LazyListScope.() -> Unit
)

Kuikly 的 Compose DSL 的目标是支持所有标准的 Compose API,但是实际还有部分 API 的参数暂时未完全支持

所以,可以看出来作为 KMP 核心支持和鸿蒙编译链的 KuiklyBase 是公用的,而在上层 UI 上,如果你更考虑动态化和小程序,那么 KuiklyUI 可能更适合你,如果你更注重 Compose 对齐和自渲染性能,那么 ovCompose 则是首选。

那么,ovCompose 或者 Kuikly 会是你 CMP 适配鸿蒙的选择吗?

参考链接

  • https://mp.weixin.qq.com/s/GTkzHTvWIdDmxtlRVpNgfw

  • https://mp.weixin.qq.com/s/KsEqVO_Zh73xSlUWOrvZrQ

  • https://github.com/Tencent-TDS/ovCompose-sample/blob/main/README-zh_CN.md


http://www.hkcw.cn/article/hgVAnkJmug.shtml

相关文章

SP网络结构:现代密码学的核心设计

概述 SP网络(Substitution-Permutation Network)是一种对称密钥密码结构,由Claude Shannon在1949年提出的混淆(Confusion)与扩散(Diffusion) 原则发展而来。与Feistel网络不同,SP网络在每轮中对整个数据块进行非线性替换和线性置…

HCIP(BGP基础)

一、BGP 基础概念 1. 网络分类与协议定位 IGP(内部网关协议):用于自治系统(AS)内部路由,如 RIP、OSPF、EIGRP,关注选路效率、收敛速度和资源占用。EGP(外部网关协议)&a…

身份证实名认证API接口-透明网络空间-实名认证api

数字化时代,线上交易、社交互动、信息共享等活动已经成为人们日常生活的一部分。但随之而来的是身份盗用、欺诈等网络安全问题的不断上升。为应对这一挑战,身份证实名认证作为网络平台的一项基础安全功能,逐渐成为确保用户身份真实性、保障交…

数据安全中心是什么?如何做好数据安全管理?

目录 一、数据安全中心是什么 (一)数据安全中心的定义 (二)数据安全中心的功能 1. 数据分类分级 2. 访问控制 3. 数据加密 4. 安全审计 5. 威胁检测与响应 二、数据安全管理的重要性 三、如何借助数据安全中心做好数据安…

【Oracle】视图

个人主页:Guiat 归属专栏:Oracle 文章目录 1. 视图基础概述1.1 视图的概念与特点1.2 视图的工作原理1.3 视图的分类 2. 简单视图2.1 创建简单视图2.1.1 基本简单视图2.1.2 带计算列的简单视图 2.2 简单视图的DML操作2.2.1 通过视图进行INSERT操作2.2.2 通…

FastMCP vs MCP:协议标准与实现框架的协同

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…

消费者行为变革下开源AI智能名片与链动2+1模式S2B2C商城小程序的协同创新路径

摘要:在信息爆炸与消费理性化趋势下,消费者从被动接受转向主动筛选,企业营销模式面临重构挑战。本文提出开源AI智能名片与链动21模式S2B2C商城小程序的协同创新框架,通过AI驱动的精准触达、链动裂变机制与S2B2C生态赋能&#xff0…

Python与数据分析期末复习笔记

第一次小考自然语言处理 一、单选题(共 29 题,60.0 分) 1.(单选题,3.0 分) 在 matplotlib 中,设置 x 轴标签的方法是? A. title () B. xlabel () C. legend () D. ylabel () 正确答案:B 3.0 分 …

机电工程常用设备

一、通用设备 1. 泵 容积式泵: 往复泵:活塞泵、柱塞泵、隔膜泵()。 回转泵:齿轮泵、螺杆泵、叶片泵()。 叶轮式泵:离心泵、轴流泵、混流泵、旋涡泵(按叶轮和流道结构区…

CSS设置移动端页面底部安全距离

如图:在开发微信小程序时遇到的按钮被iOS设备底部黑线遮挡的问题,以及如何利用CSS中的env(safe-area-inset-bottom)属性来创建安全区域,避免内容被遮挡。通过将该属性应用到padding或height上,成功解决了问题 env(safe-area-inset…

Go语言学习-->第一个go程序--hello world!

Go语言学习–>第一个go程序–hello world! 1 写代码前的准备 1 创建编写代码的文件夹 2 使用vscode打开3 项目初始化 **go mod init*(初始化一个go mod)Go Module 是 Go 1.11 版本引入的官方依赖管理系统,用于替代传统的 GOPATH…

02 C语言程序设计之导言

文章目录 1、入门1-1、引例1-2、练习题1-2-1、Job11-2-2、Job2 2、变量与算术表达式2-1、引例2-2、练习题2-2-1、Job12-2-2、Job2 3、for语句3-1、引例3-2、练习题 4、符号常量5、字符输入/输出5-1、文件复制5-1-1、引例5-1-2、练习题5-1-2-1、Job15-1-2-2、Job2 5-2、字符计数…

血管的三维重建

血管的三维重建 摘 要 断面可用于了解生物组织、器官等的形态,在医学上有重要的作用。用切片机连续不断地将样本切成数十、成百的平行切片,可依次逐片观察。根据平行切片数字图象,运用计算机可重建组织、器官等准确的三维形态。 本文提出了一…

如何在 DataGrip 中 连接 Databend

本文通过详细的步骤演示了如何新建 自定义 Driver 以在 DataGrip 中支持连接 Databend,包括设置 Class、DriverFiles 和URLtemplates。最后,通过新建 Driver 和 DataSource,并在 Databend Cloud 上进行连接测试,确保能成功访问数据…

黑马程序员TypeScript课程笔记2(11-20)

11.数组类型 数组类型可以写为"let numbers:number[][1,2,3] ,也可以写为let numbers:Array[1,2,3] 12.联合类型 联合类型的写法 let arr:(number|string)[][1,a,2,g] 13.类型别名(可以为任意类型起别名,起到一个简化类型名的作用) 14.函数类型(1…

Tailwind CSS 实战:基于 Kooboo 构建 AI 对话框页面(六):图片上传功能

在 《Tailwind CSS 实战:基于 Kooboo 构建 AI 对话框页面(五)》 中,完成了语音交互功能的优化。本文作为该系列教程的第六篇,将聚焦于图片上传功能的开发。通过集成图片上传与预览能力,我们将进一步完善 AI…

常用工具推荐---QQ截图功能、iLovePDF与Pandoc

常用工具推荐 QQ中的超实用功能截图功能录屏功能屏幕识图以及屏幕翻译 iLovePDFPandocPandoc 安装Pandoc使用 QQ中的超实用功能 比起本地截图,个人使用最多的是QQ截图,CSDN里的插图都是使用QQ截的,我不允许有人不知道这么好用的功能&#x…

核心机制:流量控制

搭配滑动窗口使用的 窗口大小 窗口越大,传输速度就越快,但是也不能无限大,太大了,对于可靠性会有影响 比如发生方以非常快的速度,发送,接收方的处理速度跟不上,也就会导致有效数据被接受方丢弃(又得重传) 流量控制,就是根据接收方的处理能力(如何衡量?),干预到发送方的发送…

如何避免工具过多导致的效率下降

避免工具过多导致效率下降需通过精简工具数量、选择高效工具、明确工具使用规范、加强工具集成与协作等措施,其中,精简工具数量是最关键的一步,通过减少冗余工具的使用,可有效避免工具过多造成的信息分散和沟通障碍,从…

C++ stl容器之string(字符串类)

目录 (0)string和char *的区别 (1)string类对象的构造 (2)容量操作 (3)访问遍历 1.用下标访问和遍历 2.用迭代器访问和遍历 ①迭代器说明 ②迭代首尾注意事项 ③使用举例 …