一码多端挑战下的新跨端方案思考与实践

如果无法正常显示,请先停止浏览器的去广告插件。
分享至:
1. 一码多端挑战下的 新跨端方案思考与实践 演讲人:范绍贵
2. 关于我 Web页面、 原生App开发 2016年 接触 ReactNative All In JavaScript Android、IOS、服务器 2022年6月 结束创业 加入字节,孵化 WasmTS 2024年6月 2013年 首次创业 扫码点餐 恋爱君等 10 余款APP 基于 WasmTS 的转译技术 将 RTS 转译 Native 语言 累计600多万用户 赚了个房子首付 2021年 接触 WebAssembly 设计了 WasmTS TypeScript 编译 wasm
3. 背景 目录 contents 新跨端方案 核心挑战 方案亮点 性能与业务收益 AI 相关探索
4.
5. 01 背景
6. 鸿蒙 适配 降本 增效 KMP 有没有更好的 跨端方案?
7. 跨端方案核心瓶颈:FFI 和 GC • 跨端语言存在独立的数据结构,比如容器 Array、Map。 宿主语言 跨端语言 Kotlin Swift Arkts JavaScript 这些数据无法被宿主识别、消费。 • 数据传输:存在系列化、反序列化,或者对象复制问题 数据结构 内存回收 • 内存回收:对象的传输,被外部持有等,导致内存回收异 常复杂,回收时机难以精细化,容易内存波动剧烈。 ... ... 操作类型 Kotlin -> OC Swift -> OC 空函数调用 8862 ns/100op 380 ns/100op 简单计算操作 6859 ns/100op 378 ns/100op 返回值处理 4914 ns/100op 378 ns/100op
8. KMP 方案 Android • 没有跨语言问题 • 没有 gc 、ffi 问题 • KotlinNative ,直接对接操作系统 C api Harmony • 内部闭环时,可媲美原生 • 与 arkts 交互存在 ffi 、 gc 问题 iOS More • 与 Swift/OC 存在跨语言调用 • 存在 ffi 、 gc 问题 • 未来可能出现的新端 • 是否会对外暴露底层 C api ? 如何才能彻底解 决 ffi 、gc 问题
9. FFI 和 GC 问题产生 宿主语言 跨端语言 Kotlin Swift Arkts JavaScript ... ... 根本原因是 跨语言 调用的问题 有没有一种方法 数据结构 可以做到 没有跨语言 内存回收 转译 是一种可行思路
10. 基于转译的思路 我们围绕语言、工程、UI 框架 打造了一套全新的跨端方案
11. 02 三位一体的跨端方案
12. 三位一体的跨端方案 RTS 语言 以转译为核心,实现无 FFI 高性能调用 Salamander 工程化 负责整个工程的构建、开发、Typing 、IDE工具链 Relax UI 渲染 参考最前沿的前端框架长处,采用 jsx 语法,无 运行时的 signal 更新机制。背靠 Lynx 端渲染 能力,也能实现动态下发。
13. 编译流程 Swift Kotlin ArkTS ...... DTS salamander typings Swift import RTS/Relax 工程 客户端代码仓库 RTS 编译器 Kotlin 客户端产物 转译 ArkTS VM Bytecode 客户端编译
14. 宿主层 抖音 头条 剪映 即梦 ... ... 业务场景层 直播间页 文娱短剧 财经支付 头条混排 ... ... 业务架构层 统一容器 直播 文娱 财经 ... ... Relax UI linear text image ... ... request getAppInfo login ... ... 基础抹平层 ALog Storage JSON ... ... 系统抹平层 线程能力 设备 事件机制 ... ... Compact API 运行时 框架层 Relax UI / Compact API / 基础抹平层 / 系统抹平层 工程化层 创建模块 开发环境层 RTS / RX 平台层 iOS DTS 声明 构建项目 绑定宿主 语法提示插件、调试工具 Trae / VSCode / XCode / Android Studio Android 鸿蒙 构建APP Web Electron
15. RTS 语言
16. • 类型安全的静态语言 • 可转译多种客户端 native 语言 • 拥有自己的虚拟机,可 动态下发 R T S Kotlin Android Swift IOS Arkts Harmony Web TypesScript Electron bytecode RTS VM
17. 基础数据类型与转译后类型 RTS 类型 Kotlin 类型 Swift 类型 Arkts 类型 TypeScript 类型 int32 Int Int32 number number int64 Long Int64 bigint bigint float32 Float Float number number float64 Double Float64 number number Array Kotlin.ArrayList NSMutableArray Array Array Map Kotlin.MutableMap NSMutableDictionary Map Map Set MutableSet NSMutableSet Set Set 还有 boolean 和 string,int8,int16,uint8,uint16,uint32 等
18. 核心语法支持 能力 细节 函数 重载,泛型,闭包 class/interface 重载,覆盖,泛型,抽象类 协程 async/await,Promise 多线程 SLThread 类型转换 as,as?,as! 数据类型 Json,元组 序列化 Serializable
19. 工具链支持 • 基本的语法提示插件、 断点调试能力等
20. RTS 转译产物示例 Kotlin Swift
21. Kotlin/Swift 内置对象实现
22. Salamander 工程化
23. Salamander 工程化 宿主工程 XCode / AndroidStudio/... ... 工程创建 typing dts 代码同步 Swift Library Business Build App RTS Coding Demo Kotlin Arkts TypeScript 开发环境:vsCode,基础库,系统库 ...
24. 系统 API 能力
25. Relax UI 框架
26. Relax 是声明式、响应式的高性能 UI 框架 是使用 RTS 语言开发的 UI 框架 借鉴了非常多 React 和 Solid 的思想,提供了 Signal 的数据 驱动理念,将 JSX 直接转译为创建视图及设置属性的函数调 用,不需要 Diff 操作 另外在架构上沿用了端渲染方案,可媲美原生性能,并无缝调 用已有的平台侧组件。
27. 编译与渲染 relax rts compiler compiler Calls 系统层端渲染 Android iOS 鸿蒙 LynxUI Relax Framework text element layout view element attrs
28. 03 核心挑战
29. 核心挑战一 数据传输无FFI
30. 内置对象的实现 Kotlin Swift
31. 内置对象 Array 的实现 • 直接使用宿主对应的 Array 容器 • 如果没有相应的属性(比如 length),则扩展
32. 为什么 swift 侧 Array,不用 Swift 自身的 Array 而是用 OC 对象 NSMutableArray ??? 如果仅仅是值类型、引用 类型的区别 为什么不包一层 Swift 的 Array
33. 核心挑战二 与宿主侧的交互通讯
34. 宿主侧接口的调用:系统库、二方库、三方库 rts 可消费的 .d.ts 文件 swift 头文件 typings
35. 继承宿主侧 Class .d.ts 文件 rts 文件
36. 如何用 .d.ts 描述各宿主语言的接口签名 swift 代码 .d.ts typings
37. 复杂一点的例子 .d.ts 文件 swift 代码 typings
38. 小结 • rts 编译器在编译时,识别 .d.ts 文件上的注释做相应翻译 • .d.ts 并不能描述所有 swift/kotlin 签名,只解决 80% 问题 • 剩余不能支持部分,需要手写 swift/kotlin 代码进行适配
39. 核心挑战三 多端一致性保证
40. 多端一致:内存回收机制 rts 文件 swift
41. 多端一致:swift 内存环问题
42. 正确做法:使用 weak 关键字,手动解环 rts 文件 swift
43. 多端一致:int64 问题 rts 文件 TypeScript
44. 多端一致:重载的支持问题 TypeScript 重载不区分 int32/float32 数字类型 不支持 enum 类型重载
45. 多端一致:空安全问题 TypeScript
46. 多端一致:副作用问题 a.rts b.rts import • 对于 kotlin 来说,topfunc 会被执行 • web/arkts 则不会执行 topfunc
47. 多端不一致:非 int64 的数字类型判断 在鸿蒙和 web , 并不区分 int32 和 float64
48. 04 方案亮点
49. 极致的性能 无 FFI ,GC 问题 轻量,集成成本低 可无缝使用客户端生态 UI 渲染无 diff
50. Hot Reload 开发
51. 新的跨端方案形态:动静态兼顾 业务处于迭代期 通过下发动态代码,跑在 RTSVM 业务进入稳定期 转为原生代码,原生性能
52. 05 性能与业务收益
53. 单文本渲染 / Hello World iOS 机型 IPHONE 14 Native Android SwiftUI IPHONE 11 Relax2Native Native SwiftUI Relax2Native Render Time 47.92ms 53.19ms 50.00ms 48.61ms 63.89ms 59.72ms CPU Cost Time 36.98ms 43.79ms 45.71ms 42.10ms 50.27ms 51.92ms Memory -79.00 KB 339.00 KB 49.67 KB 92.33 KB 506.67 KB 243.75 KB 机型 Pixel 9 Native COMPOSE Pixel3 Relax2Native Native COMPOSE Relax2Native Render Time 16.70ms 15.67ms 16.54ms 16.49ms 53.23ms 33.76ms CPU Cost Time 41.00ms 188.88ms 73.38ms 72.63ms 113.75ms 111.00ms Memory 16.13 MB 21.69 MB 14.21 MB 11.99 MB 17.82 MB 13.74 MB • 这个用例主要关注各方案的启动成本。 • IOS 上整体指标 Native 优于 Relax 优于 Swiftui, 但是差距数值较小 • Android 上 Compose CPU 负载显著较高。 Native 优于 Relax 优于 Compose
54. 单列图文列表 / ImageTextLiest iOS 机型 IPHONE 14 Native Android SwiftUI IPHONE 11 Relax2Native Native SwiftUI Relax2Native Render Time 108.33ms 145.83ms 108.33ms 112.50ms 129.17ms 59.72ms CPU Cost Time 89.38ms 124.63ms 105.25ms 97.00ms 104.00ms 51.92ms Memory 1.38 MB 5.46 MB 1.59 MB 2.08 MB 7.90 MB 243.75 KB 机型 Pixel 9 Native COMPOSE Pixel3 Relax2Native Native COMPOSE Relax2Native Render Time 81.88ms 116.61ms 79.64ms 105.71ms 213.45ms 147.86ms CPU Cost Time 310.63ms 592.25ms 453.38ms 225.75ms 408.75ms 277.25ms Memory 67.89 MB 72.13 MB 66.86 MB 43.61 MB 49.63 MB 46.14 MB • IOS 上整体指标 Relax ~= Native 优于 SwiftUI • Android 上整体指标 Native 优于 Relax 优于 Compose
55. 内嵌卡片列表 / EmbeddedImageTextLiest iOS 机型 IPHONE 14 Native Android SwiftUI IPHONE 11 Relax2Native Native SwiftUI Relax2Native Render Time 91.88ms 110.42ms 83.13ms 102.08ms 133.33ms 106.25ms CPU Cost Time 94.38ms 94.50ms 102.63ms 91.00ms 125.88ms 113.63ms Memory 3.23 MB 7.83 MB 11.29 MB 1.49 MB 5.48 MB 9.19 MB 机型 Pixel 9 Native COMPOSE Pixel3 Relax2Native Native COMPOSE Relax2Native Render Time 90.83ms 111.53ms 98.63ms 107.28ms 237.24ms 116.35ms CPU Cost Time 318.25ms 613.88ms 422.00ms 228.13ms 418.00ms 293.00ms Memory 67.47 MB 77.60 MB 65.30 MB 43.62 MB 48.72 MB 45.00 MB • IOS 上整体指标 Relax ~= Native 优于 SwiftUI,内存占用 Relax 略高 • Android 上首屏指标 Relax ~= Native 优于 Compose,其他指标 Native 优于 • Relax 优于 Compose
56. 大量色块(6000 个)/ColorfulView iOS 机型 IPHONE 14 Native Android SwiftUI IPHONE 11 Relax2Native Native SwiftUI Relax2Native Render Time 133.33ms 1647.00ms 291.67ms 229.17ms 6318.33ms 495.62ms CPU Cost Time 128.13ms 1645.13ms 292.75ms 396.00ms 3634.50ms 487.38ms Memory 12.99 MB 226.91 MB 43.83 MB 77.03 MB 271.56 MB 39.06 MB 机型 Pixel 9 Native COMPOSE Pixel3 Relax2Native Native COMPOSE 在SwiftUI视图树的递归 diff 和布局上以及 SwiftUI桥接到 Relax2Native UIKit后,UIKit 会继续递归 Render Time 200.21ms 382.01ms 223.99ms 470.33ms 1442.63ms 856.96ms CPU Cost Time 387.88ms 673.13ms 560.75ms 433.75ms 2007.00ms 1262.88ms Memory 145.72 MB 77.13 MB 96.33 MB 137.04MB 48.63 MB 94.82 MB • 主要关注创建大量节点时的数据(Flex 布局) • IOS 上 整体数据 Native 优于 Relax 优于 SwiftUI • Android 上整体数据 Native 优于 Relax 优于 Compose 遍历所有 UIView 层级。在 极限场景下损耗较大。
57. 文本渲染 /ComplicateText iOS 机型 IPHONE 14 Native Android SwiftUI IPHONE 11 Relax2Native Native SwiftUI Relax2Native Render Time 133.33ms 166.46ms 150.00ms 183.33ms 216.67ms 202.08ms CPU Cost Time 130.63ms 154.50ms 159.88ms 176.13ms 214.50ms 215.25ms Memory 21.21 MB 27.27 MB 43.99 MB 17.89 MB 27.62 MB 30.83 MB 机型 Pixel 9 Native COMPOSE Pixel3 Relax2Native Native COMPOSE Relax2Native Render Time 75.74ms 147.14ms 99.16ms 165.83ms 300.28ms 264.60ms CPU Cost Time 301.13ms 433.38ms 346.25ms 191.38ms 354.63ms 310.50ms Memory 53.49 MB 55.57 MB 55.73 MB 44.32 MB 45.66 MB 47.21 MB • 渲染大量的文字内容。这个用例主要关注各个框架对文字的处理性能。 • iOS 上,整体指标 Native 优于 Relax 优于 SwiftUI • Android 平台上各项指标:Native 优于 Relax 优于 Compose
58. 长列表 / LongList iOS 机型 IPHONE 14 Native Android SwiftUI IPHONE 11 Relax2Native Native SwiftUI Relax2Native Render Time 95.83ms 91.67ms 83.33ms 112.50ms 104.17ms 100.00ms CPU Cost Time 71.00ms 75.63ms 78.88ms 86.38ms 97.00ms 86.13ms Memory 4.65 MB 2.76 MB 1.97 MB 3.46 MB 3.29 MB 2.24 MB 机型 Pixel 9 Native COMPOSE Pixel3 Relax2Native Native COMPOSE Relax2Native Render Time 28.95ms 104.54ms 32.93ms 32.61ms 244.80ms 99.94ms CPU Cost Time 138.88ms 382.88ms 311.75ms 52.25ms 277.25ms 136.13ms Memory 18.27 MB 25.81 MB 37.41 MB 13.70 MB 20.49 MB 17.16 MB • 1000 个纯色块和文字。关注长列表压力场景 • IOS 上整体指标 Relax 优于 Native 优于 SwiftUI • Android 上整体指标 Native 优于 Relax 优于 Compose
59. 用户列表 /UserInfoList iOS 机型 IPHONE 14 Native Android SwiftUI IPHONE 11 Relax2Native Native SwiftUI Relax2Native Render Time 83.33ms 158.33ms 112.50ms 87.50ms 175.00ms 112.50ms CPU Cost Time 78.13ms 128.88ms 99.13ms 84.75ms 164.50ms 106.75ms Memory 3.49 MB 6.86 MB 3.06 MB 2.30 MB 5.98 MB 3.34 MB 机型 Pixel 9 Native COMPOSE Pixel3 Relax2Native Native COMPOSE Relax2Native Render Time 97.53ms 185.83ms 114.21ms 161.07ms 307.01ms 209.95ms CPU Cost Time 482.00ms 886.50ms 660.25ms 408.50ms 694.50ms 463.00ms Memory 60.40 MB 174.86 MB 56.31 MB 33.51 MB 116.79 MB 33.90 MB • IOS 上整体指标 Native 优于 Relax 优于 SwiftUI • Android 上整体指标 Native 优于 Relax 优于 Compose
60. 业务落地情况 相关客户端:抖音、头条、番茄小说、即梦、巨量等 业务 业务开发者 数量 RTS 业务累计上线 新增代码量 累计 RTS SDK 代码量 同构比例 已上线多端复用 迭代人效 取直播数据 10 25 5.6w 6.1w 65% 40% 相关业务:直播,文娱,财经,商业化,搜索等
61. 06 AI 相关探索
62. 一个问题,两个探索 一个问题 AI 时代,还需不需要跨端?如何是对 AI 更友好的跨端? 两个探索 辅助抹平 生态迁移 Compact API Kotlin2RTS
63.
64. 开源计划 RTS 计划开源,期待你们的参与 一起参与大终端的浪潮,实现“前端、客户端”的大一统 THANKS

首页 - Wiki
Copyright © 2011-2025 iteam. Current version is 2.147.1. UTC+08:00, 2025-11-04 12:45
浙ICP备14020137号-1 $访客地图$