0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

揭秘动态化跨端框架在鸿蒙系统下的高性能解决方案

京东云 来源:京东科技 胡大海 作者:京东科技 胡大海 2024-10-08 13:46 次阅读

作者:京东科技 胡大海

前言

动态化跨端框架(后文统称“动态化”)是一个由京东金融大前端团队全自主研发的,一份代码,可以在HarmonyOSiOSAndroid、Web四端运行的跨平台解决方案。在研发团队使用后可大幅降低研发人力成本;为业务提供实时触达、A/B触达等能力以提升业务投放效率;同时保障了C端用户优秀的用户体验。

一、动态化跨端框架原理介绍

wKgaomcExxeAVKpeAALojfzrv6c694.png



通过上图,我们先了解一下动态化跨端框架在iOS、Android等多个平台实现跨端的原理:

① 业务层:业务代码经过打包后形成business.js发布到云端,被Harmony、iOS、Android、H5四端共用。

② 虚拟机层:虚拟机的核心职责是运行js代码,这也是跨平台框架的基础,在iOS使用系统内置的JSCore,在Android使用V8,在浏览器使用Webkit,在鸿蒙系统我们依然需要一个能够运行js代码的虚拟机

③ 通讯层:在iOS和Android端使用了json数据格式进行通讯数据的传输,在鸿蒙系统也可以使用该方案。

④ 渲染层:使用各个系统的系统组件进行UI元素的渲染。

二、基于方舟虚拟机的方案探索

1、方舟字节码概念

方舟字节码(Ark Bytecode),是由方舟编译器编译ArkTS/TS/JS生成的,提供给方舟运行时解释执行的二进制文件,字节码中的主要内容是方舟字节码指令。

2、在方舟虚拟机中运行JS

方舟虚拟机不能直接运行当前在V8中运行的js代码,但是能够执行方舟字节码,所以我们可以借助鸿蒙提供的工具将js代码转化为方舟字节码,这样就能利用鸿蒙系统的方舟虚拟机执行我们的js代码了。

wKgaomcExx6AWlcsAAMXYRiszCE796.png



3、存在的问题

3.1、业务无法热更新

在iOS和Android端,业务可以随时打包后在云端发布新的版本,借助于JSCore或者V8就可以直接运行新的版本的js,这样就支持了业务的热更新发布。但在鸿蒙系统上,华为基于安全考虑,business.abc这样的字节码文件不支持动态下发,需要内置到APP中,这样就失去了业务热更新的能力。

3.2、单线程性能问题

wKgZomcExx-AFZMEAAFEixaPi7g779.png

在其他两端我们是开启了一个单独的JS线程,进行business.js文件的执行,但是如果我们使用方舟虚拟机执行business.js转换来的business.abc的时候,其实是在方舟虚拟机的UI主线程运行了这个文件。在其他两端js文件在JS线程执行的时候,UI渲染和交互是并行不受影响的,但是在方舟虚拟机单线程下abc文件的执行和UI渲染&交互变成了串行,这样必然会严重影响页面渲染速度和交互的流畅度。

业务不能热更新以及单线程性能不佳等问题的存在,我们决定使用另一种方案-V8虚拟机。

三、基于V8虚拟机的方案落地

1、在V8虚拟机中运行JS

如果能把V8移植到鸿蒙系统中,我们就可以像其他两端一样使用多线程并且能实现业务热更新等特性,但是V8是一个近千万级代码的庞大仓库,需要掌握CMake、Clang、LLVM、Ninja等一系列交叉编译知识(嵌入式范畴),对于应用开发者是一个巨大的挑战,虽然我们已经掌握了V8移植到鸿蒙的技术,但从包大小、稳定性、兼容性、维护成本等维度看,华为厂商内置V8是一个具有长期收益的重大事项,通过和华为持续沟通,最终华为将V8内置到了操作系统,业界所有类动态化框均可直接使用内置V8虚拟机进行跨端框架的适配。

wKgaomcExyCAUYkvAALwe2a2Q6o520.png



2、高性能核心方案

2.1、多线程架构

wKgZomcExyGAdlbyAAbh3BmjFqo448.png

多线程是提高程序性能最直接、最有效的手段之一,借助于鸿蒙系统内置的V8虚拟机,我们就能像iOS、Android两端一样使用三线程模型完成动态化跨端框架在鸿蒙系统的渲染过程。

JS线程负责将业务代码解析为一颗虚拟Dom树、发出渲染命令、处理业务逻辑等,通过接口定义的桥方法发送给组件线程进行处理。我们以添加一个点击按钮节点为例,JS线程会通过“添加节点”这个接口以JSON描述的方式,将信息传递给组件线程,组件线程根据JSON描述将这个点击按钮节点添加到组件树中,然后触发UI线程创建系统组件,比如在鸿蒙系统会创建一个ArkTS的按钮组件,在iOS系统会创建一个UIButton组件。

UI线程负责用户页面滑动、点击事件等交互行为,当发生比如用户点击事件后,同样通过接口定义的桥方法“调用JS”,将点击事件传递给JS线程进行处理,紧接着继续处理UI线程的任务,这样UI线程的交互效率就高了,充分保障了用户良好的操作体验。

//JSON描述示例
{
    "type":"btn",
    "value":"按钮",
    "childrens":[],
    "id":"238346e885ee",
    "style":{
        "width":"66px"
    },
    "attr":{
        "text-color":"#FFFFFFFF"
    },
    "event":{
        "onclick":"myclick()"
    }
}

2.2、JSI技术引入

通讯桥存在的问题

动态化基于三个线程并行运行的方式,使其渲染性能已经接近于原生的渲染性能,但是在一些频繁通讯场景,通讯桥会“堵塞”,比如当业务需要监听一个页面的滑动而改变另外一个元素背景色的透明度,那么JS线程大部分时间在处理接收列表滑动距离,改变元素背景色透明度这个任务中,其他任务的执行会被严重影响。另外JSON数据传输的序列化和反序列化过程也会带来很大的线程性能损耗。

wKgaomcExyKAB4JuAAEgwGcEiY0895.png



解决方案-JSI

之前使用通讯桥的一个主要原因就是 C++ 中的函数没办法完整映射到 JavaScript 中,让 JavaScript 直接调用,所以只能选择以序列化字符串的形式通过通讯桥传输。而JSI做的事情就是将 C++ 中的常用类型(函数、对象等)一一映射到 JavaScript 中,我们就能在JS中直接调用C++的函数和对象了。因为消除了桥通讯带来的序列化和异步调用的开销,大大提升了线程通讯性能。

wKgZomcExyOAEvxTAAOhQzt_SNw358.png



四、进一步优化的方向

1、减少UI层级

当前基于多线程和JSI的架构模式在鸿蒙系统的性能还算不差,但是在鸿蒙系统上同样一个业务的UI层级是其他两端层级的约2倍。原因在于在鸿蒙系统使用系统组件进行递归渲染的时候,需要借助自定义组件进行实现,然而和iOS和Android端的命令式组件渲染不同,比如RomaDiv对应iOS就是直接翻译为UIView即可,在鸿蒙必须增加一个包裹的容器才是一个合法的自定义组件,比如Stack容器,这样每个组件的层级就多了一层,层级过多会直接影响渲染性能,在一些复杂业务场景到达一定层级后会造成页面掉帧和卡顿。

@Componentexport 
struct RomaDiv 
{ 
    build()
    { 
        Stack(){
         //借助wrapBuilder实现递归 
         ForEach(this.childrenTags, (childrenTag) => 
             { 
                 RomaComponentFactory.builder()//RomaComponentFactory就是对应鸿蒙系统提供的WrappedBuilder 
             }) 
         } 
    } 
}

面对业界跨端框架面临的这个共性问题,鸿蒙系统提供了C语言的命令式接口进行组件创建,C组件接口是介于UI组件的Native实现和ArkTS对接层之间的一层C接口封装,它绕过了状态管理对组件变化、刷新的自动化管理,因此具有较好的性能。同时经过初步验证,接入C-API后,UI层级能直接和另外两端保持一致,同时渲染性能也会得到大幅提升。

2、降低通讯成本

当前JSI在鸿蒙系统的应用中通过JSI打通C++,再通过NAPI从C++打通ArkTS,跨语言通讯成本高。如果接入了C-API,就避免了C++和ArkTS之间类型互相转换和跨语言调用的开销,也能带来不少的性能提升。

wKgaomcExySAQ5zbAAF8-yWCJRg654.png

3、JS逻辑下沉到C++

在当前架构中,JS线程运行着V-Dom树创建、对比,样式&属性解析等一系列繁重的框架逻辑,如果我们能将这些JS代码逻辑下沉到C++,框架逻辑运行效率会进一步提升。

wKgZomcExyWASs6_AAMyWA3PxfE038.png

总结

本文讲述了如何在鸿蒙系统中实现“动态化”跨端框架的高性能运行。包含探索方舟虚拟机运行方案时遇到的问题,以及基于V8虚拟机方案的具体提升手段和后续进一步提升的方案。通过阅读,你将能够更好地理解和应用这些技术,提高跨端框架的性能,提升C端用户体验。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C++
    C++
    +关注

    关注

    22

    文章

    2109

    浏览量

    73663
  • 虚拟机
    +关注

    关注

    1

    文章

    917

    浏览量

    28213
  • 鸿蒙系统
    +关注

    关注

    183

    文章

    2634

    浏览量

    66362
收藏 人收藏

    评论

    相关推荐

    鸿蒙实践-JS虚拟机架构实现

    在Roma方案中,JS虚拟机是框架的核心,负责执行动态的JS代码。在Android平台采用了基于V8的J2V8,iOS平台则使用了
    的头像 发表于 09-30 14:42 2421次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>跨</b><b class='flag-5'>端</b>实践-JS虚拟机架构实现

    鸿蒙实践-布局方案介绍

    封装到标签中实现,业务只需要针对标签简单地设置相关属性,即可实现列表类布局,大幅提升研发效率。同时动态也支持绝对布局以及控制视图的显示和隐藏等功能,使之能胜任绝大多数业务布局场景。 在京东金融App使用动态
    的头像 发表于 09-18 10:26 910次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>跨</b><b class='flag-5'>端</b>实践-布局<b class='flag-5'>方案</b>介绍

    史无前例,移植V8虚拟机到纯血鸿蒙系统

    作者:京东科技 于飞跃 一、背景 如图所示,Roma框架是我们自主研发的动态平台解决方案,已支持iOS,android,web三
    的头像 发表于 09-18 10:28 1153次阅读
    史无前例,移植V8虚拟机到纯血<b class='flag-5'>鸿蒙</b><b class='flag-5'>系统</b>

    高性能的可编程电源管理解决方案

    高性能的可编程电源管理解决方案
    发表于 08-20 23:13

    [资料分享]+Android框架揭秘

    `[资料分享]+Android框架揭秘一、看威武霸气的封面作者:(韩)金泰延等 二、读读简介,看看适合你吗? 《android框架揭秘》通过对android
    发表于 09-26 09:47

    24位ADC的无变压器双极性输入和高性能解决方案包括BOM及层图

    描述此隔离式 3.65mm 薄型参考设计采用 24 位 Δ-Σ 模数转换器 (ADC),可实现高度集成的双极性输入和高性能解决方案。现代模拟输入模块在不同的方面都需要高性能,例如以相同的空间大小
    发表于 10-10 09:16

    采用GDDR6的高性能内存解决方案

    随着网络和数据中心带宽需求的日益提升,针对高性能内存解决方案的需求也是水涨船高。对于超过 400 Gbps 的系统开发,以经济高效的方式实现内存方案
    发表于 12-03 07:14

    点胶机系统中的几种解决方案

    为液晶屏嵌入式的运动控制器解决方案, 总体上向集成方向发展,脱离PC,向专业控制发展,为目前应用最多的解决方案。第三类为高性能脱机运动控制卡+人机界面手持盒组成
    发表于 01-15 09:46

    如何实现高性能的射频测试解决方案

    如何实现高性能的射频测试解决方案NI软硬件的关键作用是什么
    发表于 05-06 07:24

    分享一种高性能的FM内置天线解决方案

    分享一种高性能的FM内置天线解决方案
    发表于 05-26 06:18

    分享一款不错的高性能音频解决方案

    分享一款不错的高性能音频解决方案
    发表于 06-08 06:18

    基于socket API开发一个高性能高稳定性的平台MQTT客户

    mqttclient一个高性能、高稳定性的平台MQTT客户一个高性能、高稳定性的平台MQTT客户
    发表于 08-09 11:15

    高性能电流源的解决方案

    高性能电流源的解决方案电流源设计是一个比稳压器设计更难的挑战。两电流源会带来了一系列的新问题,尤其是当温度变化时依然希望获得高精度和稳定性时
    发表于 06-07 18:33 1554次阅读
    <b class='flag-5'>高性能</b>双<b class='flag-5'>端</b>电流源的<b class='flag-5'>解决方案</b>

    Supermicro(R)利用新处理器和高速互连技术拓展高性能解决方案

    Supermicro(R)利用即将面市的新处理器和最新的高速互连技术拓展高性能解决方案Supermicro(R)利用即将面市的新处理器和最新的高速互连技术拓展高性能解决方案
    发表于 11-14 19:03 1020次阅读

    CLOUD4Y加速云存储LSI的高性能解决方案

    电子发烧友网站提供《CLOUD4Y加速云存储LSI的高性能解决方案.pdf》资料免费下载
    发表于 08-23 10:35 0次下载
    CLOUD4Y加速云存储LSI的<b class='flag-5'>高性能解决方案</b>