原生和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. 【WinForm】WinForm 生成单文件程序

    WinForm 生成单文件程序 零.解决 安装 Costura.Fody 安装好这个库后生成的就是单文件了. .Net 3.5 NuGet控制台 NuGet\Install-Package Costu ...

  2. MySQL 修复损坏表

    修复MySQL损坏表的简单步骤,不一定适用任意情况下的表损坏的问题,留爪. 简单3步曲: # 用`root`用户登录MySQL # 这里可能需要输入密码 mysql -uroot -p # 使用指定数 ...

  3. jmeter实现幂等测试的一种方法(案例)

    最近在研究怎样对电商系统的业务进行幂等测试,利用jmeter对单独业务开展幂等测试可能简便.直接有效吧 场景描述:买家每一笔订单选中商品后,系统会生成一个"ShopCartIds" ...

  4. 基于Blazor实现的运输信息管理系统

    运输信息管理系统(TIMS)是一个集手机端和PC端协同工作的小型运输服务公司的信息化系统,采用Blazor框架的Auto模式进行开发. 1. 项目背景 目前司机运输任务完成后,在微信工作群中上报运输任 ...

  5. 访问项目resource/static目录下的模板文件(解决Docker部署后访问不到的问题)

    使用ClassPathResource方式获取static下的文件(别的方式本地可以访问到,Docker部署后不行) final String templatePath = "/static ...

  6. 331K star!福利来啦,搞定所有API开发需求,这个开源神器绝了!

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 「public-apis」是GitHub上最全面的免费API资源库,收录了涵盖商业.娱乐.教 ...

  7. 【记录】Truenas scale|NFSv4数据集的子目录或文件的ACL完全访问权限继承老是继承不了怎么回事

    我遇到了数据集下新建文件夹或文件,新建的文件夹或文件没有和数据集的ACL设置相符合的情况.其根本原因是NFSv4的完全访问权限要想继承的话,它的访问设置权限要设置"用户"和&quo ...

  8. 【经验】CiteSpace|Wiley Online Library或除知网以外的其他网站的文献怎么导入CiteSpace 6.1.6?

      如果没安装,请看这篇博客安装,现在新版(6.1.6)的不需要额外下载java了,就很妙~:   最新版citespace软件的安装与配置   结论:导出成RIS然后用它自带的转换成WoS. 文章目 ...

  9. 接口测试策略(一、概念&流程&范围)

    接口测试概要 接口测试概念 什么是接口测试? 维基百科对接口测试的定义如下: API testing is a type of software testing that involves testi ...

  10. MACD的价值不在于“金叉死叉”而在于背离

    之前我们根据MACD金叉死叉技术指标作为依据对股票进行买入和卖出操作,但由于MACD本身是由均线衍化而来的技术指标,具有一定的滞后性.也正是由于它的滞后性和单一性,通过MACD金叉死叉来进行买卖时,并 ...