动态化-鸿蒙跨端方案介绍

news2024/9/22 9:43:53

一、背景

👉 华为在2023.9.25官方发布会上宣布,新的鸿蒙系统将不再兼容安卓应用,这意味着,包括京东金融APP在内的所有安卓应用,在新的鸿蒙系统上将无法运行,需要重新开发专门适用于新鸿蒙系统的专版APP。

二、原生适配方案

原生适配方案就是将京东金融APP所有业务层及基建层全部使用鸿蒙语言重写,但该方案存在以下三个问题:

1、首次开发成本高:对齐金融APP当前能力,1:1开发鸿蒙版,开发周期长,研发投入巨大。

2、业务迭代成本高:未来,无论是存量业务还是新增业务,都需要在iOS、Android、Harmony等多端同时进行,产品沟通、开发、测试、UI验收成本均会升高。

3、业务发布效率低:业务需求完成后,需要在华为市场提交、审核、发布,发布周期长,且无法做到业务随时发布。

三、动态化适配方案

“动态化”是一个由京东金融大前端团队全自主研发的,一份代码,可以在iOS、Android、Web三端运行的跨平台解决方案。

1、方案简介

动态化目前已经具备一份代码在iOS、Android、H5三端运行的能力,该方案就是将动态化一码多端能力对接到鸿蒙系统,降低首次适配研发投入;一次开发,四端共用,长期降低业务迭代成本;并且使业务具备随时发布能力。



2、方案实现

在鸿蒙系统实现动态化的流程和安卓端流程相似,但因鸿蒙生态尚未成熟,我们面临着譬如V8虚拟机不能直接使用、核心能力层通讯过程复杂、布局库需要移植等一系列难题。





如上图简略所示,动态化在鸿蒙系统的跨端实现大致流程如下

虚拟机层-V8

动态化跨端框架的实现依赖一个能够执行js代码的虚拟机,在iOS端使用苹果系统提供的JSCore,在安卓端使用V8,而鸿蒙系统未提供类似JSCore或者V8的虚拟机,所以我们需要将V8移植到鸿蒙系统,对应上图V8 For Harmony部分。

虚拟机对接层

完成V8移植后,我们要使用ArkTS语言进行V8接口的包装和调用以便使用,包括虚拟机对象创建、内存管理、通讯管理等一系列能力,对应上图ArkTs2V8部分。

动态化引擎运行

完成ArkTs2V8后,我们就可以运行RomaEngine文件了,RomaEngine文件是一个js文件,核心职责在于能够生成一颗虚拟Dom树(V-Dom),以及进行V-Dom树对比从而触发相应页面节点的更新。

通讯层-JSI

RomaEngine产生V-Dom树的过程会逐条触发原生渲染树的节点创建,在iOS和Android端目前是使用JSON描述的方式进行通讯,但在大量数据传输场景存在性能瓶颈,虽然我们使用了一些技术手段进行了优化,但实现成本高,开发者体验差,所以在鸿蒙系统我们决定使用业界先进的JSI技术来建立JS和原生(C++)通讯,对应上图通讯层JSI部分。

原生SDK层

通过JSI技术我们就可以在C++语言中收到JS发送过来的节点创建的指令,而鸿蒙原生UI的语言是ArkTS,所以需要借助鸿蒙系统提供的NAPI接口进行C++和ArkTS语言的通讯,对应上图NAPI部分,这样我们就实现了JS→C++→ArkTS链路的通讯,当然也需要反向通讯的过程,这两个过程还包括同步通讯、异步通讯等能力,这里就不详细展开了。建立通讯通道后,再借助鸿蒙系统提供的自定义组件嵌套能力,就可以递归形成鸿蒙原生UI树。

布局层

我们先将Yoga库移植到了鸿蒙系统,在上述形成的鸿蒙原生UI树并未做任何的布局处理,借助Yoga布局就可以计算出所有UI元素最终的位置和大小,这样就完成了整个渲染流程。

交互处理

例如页面上渲染出来的一个按钮,当发生点击事件后,我们需要实现ArkTS→C++→JS通讯链路,将点击事件传递给业务方。

3、关键技术

1、V8虚拟机移植

- 自编译V8路线

V8虚拟机移植到鸿蒙系统是一个动态化必备的高技术门槛卡点任务,若无法突破此任务,动态化鸿蒙系统的跨端则无法实现。 然而V8是一个近千万级代码的庞大仓库,需要掌握CMake、Clang、LLVM、Ninja等一系列交叉编译知识(嵌入式范畴),对于应用开发者是一个巨大的挑战,通过动态化小组成员的攻坚克难,现已掌握了V8虚拟机交叉编译移植技术







- 华为内置V8路线

短期看我们初步掌握了V8交叉编译移植技术,但从包大小、稳定性、兼容性、维护成本等维度看,华为厂商内置V8是一个具有长期收益的重大事项,通过和华为持续沟通,最终华为将V8内置到了操作系统,业界所有类动态化框均可直接使用内置V8虚拟机进行跨端框架的适配。

2、通讯方案设计

鸿蒙系统提供了NAPI的方式来建立Arkts和C、C++的通讯。动态化的JSI通讯,建立了JS虚拟机和宿主环境C++语言的通讯。这样我们就可以建立JS、C++和ArkTs三种语言间的通讯了。



3、页面渲染方案



- 首次渲染

页面渲染的核心流程就是对于三棵树的管理过程,RomaEngine负责产生V-Dom Tree;通过JSI通道从根节点开始按照父子关系发出ComponentTree节点创建命令,最终形成一个和V-DomTree结构一致的ComponentTree,ComponentTree每个节点都包含了样式、属性、内容等信息;最后通过鸿蒙系统提供的自定义组件嵌套方式将ComponentTree映射为RenderTree,这样就完成了使用鸿蒙原生组件渲染。

- 二次渲染

当业务需要更新页面的时候,会根据新的页面数据重新生成一个新的V-Dom Tree,和页面旧的V-Dom Tree进行对比,最终得到需要更新的节点数组,将这个数组同样通过JSI通道发送到Componet Tree对应的节点,再查找出在Render Tree对应的节点完成页面的节点更新。

4、布局方案

如果节点不经过布局计算,是无法在屏幕正确的位置上显示的,Yoga库是一个跨平台布局计算库,目前动态化在iOS和Android端均使用此库进行布局计算,为保证鸿蒙端布局效果和另外两端的一致性,我们成功将Yoga库编译成了鸿蒙系统可运行的库,借助Yoga进行节点布局计算。

5、更多内容

通过以上流程就完成了一个页面渲染的核心过程,每一个环节都比较复杂,后续我们会以系列文章展开讲解。

除此之外,还需要处理交互事件、动画、生命周期、埋点曝光、组件化、图表等一系列功能,后续也会加入系列文章中。

四、未来规划

自绘方案

除了鸿蒙系统,小米、Vivo也发布了澎湃OS、blueOS,如果将来也不兼容安卓,动态化在每个系统都要做一遍和鸿蒙适配类似的工作,并且需要多个端同时长期维护。我们将探索基于SKIA技术的自绘制技术,该技术可以实现一份渲染代码,实现在iOS、Android、HarmonyOS、澎湃OS、blueOS以及未来新的系统上的渲染。

转小程序

动态化基于V-Dom模式实现跨端的渲染架构,可以实现同样一份代码转换为微信小程序、抖音小程序、百度小程序等,使业务可以低成本快速完成私域投放。

生态扩展

未来的终端设备将形成万物互联的世界,比如华为的手机应用和车机间已经可以无缝流转,动态化将持续探索在更多设备上运行的技术方案!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2108064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java项目: 基于SpringBoot+mysql网上点餐系统分前后台(含源码+数据库+答辩PPT+毕业论文)

一、项目简介 本项目是一套基于SpringBootmysql网上点餐系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、功能齐…

深度学习特征提取魔改版太强了!发文香饽饽!

要说CV领域经久不衰的研究热点,特征提取可以占一席,毕竟SLAM、三维重建等重要应用的底层都离不开它。 再加上近几年深度学习兴起,用深度学习做特征提取逐渐成了主流,比传统算法无论是性能、准确性还是效率都更胜一筹。 目前比较…

AAC高级音频编码技术

一、什么是AAC AAC的中文名称是高级音频编码技术,它是基于MPEG-2的一种全新的音频编码技术。随着时代的发展,目前AAC的技术升级到MPEG-4表准。AAC广泛的应用在网络传输、高清录制等领域,而AAC技术的出现就是为了取代之前的MP3格式。 二、为什…

类的加载过程与初始化小记

//部分内容来自“狂神说java” 代码验证 解释 1.加载类的信息,加载到内存中,如例子,将Test05和A类的信息加载到方法区, 2.加载完成后,立马生成一个class对象,如例 java.lang.class对象代表Test05类..., 3…

畅捷通ERP远程访问:使用巴比达内网穿透的体验

ERP系统的应用越来越普遍。畅捷通ERP作为一款优秀的企业资源管理工具,帮助企业整合资源,提高运营效率。然而,很多企业在使用畅捷通ERP时,面临着远程访问的问题。为了有效解决这一问题,我尝试了巴比达内网穿透&#xff…

2024高教社杯全国大学生数学建模竞赛C题保姆级分析完整思路+代码+数据教学

2024高教社杯全国大学生数学建模竞赛C题保姆级分析完整思路代码数据教学 C题题目:农作物的种植策略 今年的题目很有意思,和去年C题题目相关联了,接下来我们将按照题目总体分析-背景分析-各小问分析的形式来 1 总体分析 1.1 问题背景&…

[算法]单调栈解法

目录 739. 每日温度 - 力扣(LeetCode) 42. 接雨水 - 力扣(LeetCode) 84. 柱状图中最大的矩形 - 力扣(LeetCode) 739. 每日温度 - 力扣(LeetCode) 解法: 通常是一维数…

Ubuntu: 配置OpenCV环境

从从Ubuntu系统安装opencv_ubuntu安装opencv-CSDN博客文章浏览阅读2.3k次,点赞4次,收藏14次。开源计算机视觉(OpenCV)是一个主要针对实时计算机视觉的编程函数库。OpenCV的应用领域包括:2D和3D功能工具包、运动估计、面部识别系统、手势识别、人机交互、…

2024 高教社杯 数学建模国赛 (C题)深度剖析|农作物的种植策略|数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题! CS团队倾注了大量时间和心血,深入挖掘解…

数学专题.

数论 1.判断质数 定义:在大于1的整数中,如果只包含1和本身这两个约数,就称为质数or素数 Acwing 866.试除法判断质数 2.预处理质数(筛质数) Acwing 868.筛质数 3.质因数分解 Acwing 867.分解质因数 4.阶乘分解 5.因…

2024最新软件测试面试题(附答案)来测试下你的水平

1、软件测试的目的是( ) A、试验性运行软件 B、发现软件错误 C、证明软件正确 D、找出软件中全部错误 【答案】B 2、下面说法正确的是( ) A、经过测试没有发现错误说明程序正确 B、测试的目标是为了证明程序没有错误 C、成功的测试是发现了迄今…

数字货币是怎么回事什么是数字货币

数字货币的定义 数字货币是一种基于密码学原理的数字形式表示的货币,通过特定的加密算法和分布式账本技术实现安全交易和流通。它不像传统货币那样具有实体形态,而是以电子方式存在。数字货币可以通过互联网进行转账和交易,通常依赖区块链等分…

OPC DA

默认端口号: TCP 135 参考https://wenku.baidu.com/view/8f2b18a229f90242a8956bec0975f46527d3a7e4.html?_wkts_1725526157944&bdQuery%E6%9F%A5%E7%9C%8B%E8%A5%BF%E9%97%A8%E5%AD%90opcDA%E7%AB%AF%E5%8F%A3%E5%8F%B7 OPC DA ,OPC UA简介https://www.cnblogs.com/mi…

Qt 应用程序主界面

主要窗口类的概述 这些类提供了典型现代主应用程序窗口所需的一切,如主窗口本身、菜单和工具栏、状态栏等。 QAction 可以插入小部件的抽象用户界面操作 QActionGroup 将动作组合在一起 QDockWidget 小部件,可以停靠在QMainWindow中,也可以作…

springboot+vue+mybatis计算机毕业设计音乐播放系统+PPT+论文+讲解+售后

音乐播放系统的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品,体验高科技时代带给人们的方便,同时也能让用户体会到与以往常规产品不同的体验风格。 与安卓,iOS相比较起来,音乐…

【JVM】JVM简介|运行流程|内存划分

目录 一、JVM简介 二、JVM运行流程 三、JVM运⾏时数据区(内存划分) 3.1 堆(线程共享) 3.2 栈 3.3 元数据区(方法区)(线程共享) 3.4 程序计数器(线程私有&#xff0…

【学习笔记】5G-A时代物联网应用及策略研究

摘要 海量物联网通信是5G典型应用场景之一,为了实现蜂窝网的全场景物联能力,需要更多的场景化技术,5G-A引入了RedCap(5G Reduced Capability)和Passive IoT。其中,RedCap降低了设备复杂性及成本&#xff0…

js混淆保护在线工具开源项目大全

具体前往:js代码混淆加密保护工具&开源项目大全

指针复习--(笔记整理)

之前出的有指针合集在博客,最近要备考计算机二级,所以复习了一下,有一些容易遗忘的点整理了一下,大家可以有针对性的看一看,后续刷二级真题的时候也会进行题目代练,可以下收藏起来。记得先赞,祝…

力扣96-不同的二叉搜索树(Java详细题解)

题目链接:96. 不同的二叉搜索树 - 力扣(LeetCode) 前情提要: 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 dp五部曲。 1.确定dp数组和i下标的含义。 2.确定递推公式。 3.dp初始化。 4.确定dp的遍历顺序。 …