原生和ArkUI界面参数传递

在原生页面拉起对应的跨平台的页面时,会将代表拉起哪个页面的参数通过intent的形式传递给跨平台的Entry模块,这里主要用到的是intent的putExtra()方法进行设置,Entry模块收到该参数之后,解析参数从而决定拉起的页面,一个简单的示意图如下所示:

ArkUI-X与原生之间的bridge桥接通信

ArkUI-X SDK 提供了一种bridge通信方案,用于跨平台层和宿主Native之间进行相互通信,使得跨平台层可以调用原生的能力。运动健康应用使用bridge的简单示意图如图所示:

在运动健康内部,有5个bridge,用于跨平台层与native之间进行通信:

1.数据平台的bridge -- 负责跨平台业务层 和 数据平台之间交互的接口定义;

2.设备类的bridge -- 负责上层业务层 和 设备能力之间的交互(目前由于ArkUI-X SDK的蓝牙能力并非跨平台的,所以使用接口抽象不同平台的设备的交互);

3.页面跳转的bridge -- 负责从ArkUI的页面跳转到 H5的页面(在鸿蒙NEXT系统当中,运动健康跳转的是NEXT系统的H5页面,而在Android和iOS当中,运动健康跳转的是原生的H5页面);

4.日志类的bridge -- 负责将日志打印到对应的原生应用的日志文件当中;

5.用户账户信息的bridge --负责向上层业务层提供获取原生App账户信息的能力。

这些bridge的创建时机均为跨平台Entry模块初始化之时。为了使上层调用bridge方法的时候,像调用ts原生方法一样方便,在应用工程内部,我们在ArkUI-X SDK的基础上对bridge的调用进行了一层封装,方法的核心代码如下所示:

/**
* 执行Native接口
* @param moduleName native模块名
* @param funcName native函数名
* @param params 参数列表
*/
public execNativeAsync(moduleName: string, funName: string, ...params: any): Promise<any> {
return this.wrapFunc(moduleName, funcName, ...params);
} private wrapFunc(moduleName: string, funcName: string, ...params: any): Promise<void> {
return new Promise((resolve, reject) => {
const id = mgr.add({
success: (data) => {
resolve(this.parseResult(data));
},
fail: (errCode, errMsg) => {
reject({ errCode, errMsg });
}
});
// 指定bridge类型和方法名即可进行调用对应的bridge方法
console.log(`${TAG} call method: ${moduleName}/${funcName}`);
if (params.length) {
this.getModule(moduleName).callMethod(funcName, id, ...params);
} else {
this.getModule(moduleName).callMethod(funcName, id);
}
});
}

在本方法中,对调用层屏蔽了变量id,变量id由mgr来进行管理,调用方在调用bridge方法的时候,只需要指定bridge的类型和对应的bridge方法名,即可像调用原生ts方法一样调用bridge方法。

平台差异化处理—动态编译脚本

由于不同操作系统之间的数据平台差异等客观原因,需要做到一套业务代码在鸿蒙NEXT系统、Android 和 iOS上面同步运行,在尽可能不修改业务代码的前提下屏蔽三端数据平台的差异,结合运动健康NEXT系统当前的代码现状,运动健康使用了编译前动态修改import的技术方案:根据接口的形式抽象数据平台的功能,利用编译前动态import的方式来根据宿主形态来确定调用的具体方法。具体方案如下:

1.在鸿蒙Next系统上,我们的业务代码依赖了鸿蒙Next系统的原生能力,我们将该原生能力包称为A包;与此同时,我们开发跨平台场景包,为了描述方便,我们将这个包命名为B包,B包的接口形式与数据结构跟A包保持一致,但是B包的内部实现与A包的实现不同(B包主要是跨平台包,内部实现为跨平台桥接)。

2.将上层业务对A包的依赖导入收编到一个文件内(对A包的数据结构和接口进行import 和 export,通过该形式实现依赖中转),我们在这里将文件命名为import-sdk.ts,举个简单的示例:

import { xxx } from ‘a-sdk’ // A包是鸿蒙Next系统原生能力包

修改为:

import { xxx } from ‘import-sdk’// import-sdk.ts 是包名统一收编包

其中,import-sdk.ts文件的简单示例如下所示:

import {
HealthModel, // A包的数据结构
healthInterface // A包的接口方法
} from 'a-sdk'; // A包 export {
HealthModel,
healthInterface
};

与此同时,创建B包的收编导入文件,其内容与import-sdk.ts有差异,差异为引入包的路径,代码如下所示:

import {
HealthModel, // B包的数据结构
healthInterface // B包的接口方法
} from 'b-sdk'; // B包 export {
HealthModel,
healthInterface
};

3.在编译前,按照编译目标替换收编导入文件,例如编译跨平台版本时,将import-sdk.ts替换为B包的收编导入文件。如果是编译鸿蒙Next系统的hap包,则不需要替换。由于之前对A包和B包的依赖统一收编到import-sdk.ts,所以只需要替换一个文件,即可以实现全局依赖替换。

性能指标

目前ArkUI-X跨平台页面整体静态指标为: • 滑动帧率为:60fps(达到满帧) • 包体积增加:二进制包增加19MB • 内存数据:内存与原生持平(或略高),具体表格数据如下所示:

整体实现效果

总结

通过引入ArkUI-X技术,使得华为运动健康应用三端平台复用健康模块代码,从而在三端交互一致的前提下提升开发效率以及代码复用率(目前代码复用率为74.3%,提升研发效率30%),并且用户体验追平原生native页面的体验效果。后续规划,运动健康应用内部更多高频使用的页面和模块(如单次运动模块、运动记录页面等)也会逐渐迁移到ArkUI-X跨平台框架上。

ArkUI-X跨平台技术落地-华为运动健康(二)的更多相关文章

  1. Mate 40系列发布 搭载华为运动健康服务带来健康数字生活

    10月30日,HUAWEI Mate 40系列国内发布会如期而至.Mate 40系列除了拥有强悍的性能.全能记录影像和突破性的交互之外,还搭载了全新升级的HMS Core,其中,Health Kit( ...

  2. 【FAQ】申请华为运动健康服务授权的4个常见问题及解决方法

    华为运动健康服务(HUAWEI Health Kit)提供原子化数据开放,在获取用户对数据的授权后,应用可通过接口访问运动健康数据,对用户数据进行增.删.改.查等操作,为用户提供运动健康类数据服务.这 ...

  3. 华为运动健康服务Health Kit 6.9.0版本新增功能揭秘!

    华为运动健康服务(HUAWEI Health Kit)6.9.0版本新鲜出炉啦! 一文了解新增功能,快来一起加入Health Kit生态大家庭! 一.更丰富:睡眠呼吸记录健康数据开放 呼吸机是用于为患 ...

  4. 【FAQ】运动健康服务REST API接口使用过程中常见问题和解决方法总结

    华为运动健康服务(HUAWEI Health Kit)为三方生态应用提供了REST API接口,通过其接口可访问数据库,为用户提供运动健康类数据服务.在实际的集成过程中,开发者们可能会遇到各种问题,这 ...

  5. 【FAQ】申请运动健康服务验证环节常见问题及解答

    华为 HMS Core 运动健康服务(HUAWEI Health Kit)提供原子化数据开放.应用在获取用户数据授权后,可通过接口访问运动健康数据,对用户数据进行读写等操作,为用户提供运动健康类数据服 ...

  6. MOT大连站 | 卓越研发之路:前沿技术落地实践

    还在讨论究竟哪种编程语言更容易深度学习?哪种编程语言更具有价值?如果你是资深技术人员又或者是团队负责人,在机器学习.微服务.Spring 5反应式编程等方面遇到了问题,不妨参加一场由msup和微软联合 ...

  7. 为 “超级大脑”构建支撑能力,腾讯云聚焦AI技术落地

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 5月24日,以"无界数据.无限智能"为主题的2018腾讯"云+未来"峰会AI大数据分论坛在广州拉开帷 ...

  8. AI驱动的超分辨技术落地实践

    近年来,随着深度学习技术的快速发展,基于AI的超分辨技术在图像恢复和图像增强领域呈现出广阔的应用前景,受到了学术界和工业界的关注和重视.但是,在RTC视频领域中,很多AI算法并不能满足实际场景下的应用 ...

  9. PWA 技术落地!让你的站点(Web)秒变APP(应用程序)

    Web应用方兴未艾,我们已经十分习惯习惯了在电脑上进行以自己的工作,而随着众多功能强大的在线网站,我们的Windows的桌面也不再拥挤着各种快捷方式:不光是PC端,在移动端我们也不再在浩如烟海的应用市 ...

  10. 使用C#对华为IPC摄像头二次开发(一)

    开发环境: 操作系统:Win10 x64专业版2004 开发工具:VS2019 16.7.2 目标平台:x86 首先去下载IPC SDK(点击下载,需要华为授权账户.) 新建一个WPF的项目,Fram ...

随机推荐

  1. Java24你发任你发,我用Java8

    大家好,我是晓凡. 各位 Java 开发者们!是不是还在为 Java 23 的新特性忙得焦头烂额? 别急,Java 24 已经悄咪咪地发布了! 这可是自 Java 21 以来的第三个非长期支持版本,而 ...

  2. C++基础学习--随记

    博客地址:https://www.cnblogs.com/zylyehuo/ 参考"C++基础与深度解析" 一.预备知识 // c++常用工具 /usr/bin/time //查看 ...

  3. 面试题-RabbitMQ

    前言 在面试题系列文章中,笔者本着效率的原则,没有总结RabbitMQ相关的知识,但是当其他知识点都总结完毕后,我发现如果面试中针对我们实际使用的RabbitMQ进行深入原理的提问或者说说框架使用的注 ...

  4. Linux性能分析-平均负载

    平均负载的理解 一般系统变慢时,我们会使用top或uptime命令来查看下系统的负载情况 [root@localhost shell]# uptime 13:51:08 up 5 days, 21:5 ...

  5. 物理机Jenkins接入K8s环境

    前言 本次记录物理机部署Jenkins,k8s弹性伸缩agent节点供部署项目. 安装 K8S 插件 登录 Jenkins,系统管理→ 插件管理 → 搜索 kubernetes,选择第二个 Kuber ...

  6. 分布式任务调度系统 xxl-job

    微服务难不难,不难!无非就是一个消费方,一个生产方,一个注册中心,然后就是实现一些微服务,其实微服务的难点在于治理,给你一堆 微服务,如何来管理?这就有很多方面了,比如容器化,服务间通信,服务上下线发 ...

  7. Global.asax 转

    备忘: 项目中的Global.asax文件里通常包含这5个方法: Application_Start – web 应用程序最初启动时执行 Application_End – 应用程序关闭时运行 App ...

  8. 🎀Java线程池创建

    简介 Java 手动创建线程池 代码 package com.zk.app.utils; import com.google.common.util.concurrent.ThreadFactoryB ...

  9. C#关键字:in、out、ref、in T、out T、[In]、[Out]这些你都知道多少?

    in.out 和 ref 关键字 首先我们来说in.out 和 ref ,在 C# 中,in.out 和 ref 是用于方法参数的引用传递.在引用传递过程中,形参和实参都是指向相同的引用地址. 名称 ...

  10. TGCTF2025 部分题目WP

    TGCTF 2025 Web AAA偷渡阴平 ?tgctf2025=eval(end(current(get_defined_vars())));&b=system('cat /flag'); ...