OpenHarmony NAPI模块注册流程介绍

系统 OpenHarmony
本次我们针对NAPI模块注册流程做深入介绍,给大家后续工作中开发、使用NAPI接口提供指导。

想了解更多关于开源的内容,请访问:

51CTO 开源基础软件社区

https://ost.51cto.com

前言

关于NAPI接口相关知识,之前我们介绍过NAPI同步异步接口使用方法、应用启动触发的ArkUI ets_runtime启动流程,从NAPI使用到整体流程给大家做了介绍,本次我们针对NAPI模块注册流程做深入介绍,给大家后续工作中开发、使用NAPI接口提供指导。

一、模块注册简介

NAPI模块注册是在系统框架层 与 应用层的相互配合下完成的,下面简要介绍一下大致流程。

OpenHarmony NAPI模块注册流程介绍-开源基础软件社区

首先,提供NAPI接口定义给应用层,一般是打包到SDK中,供应用开发者查询使用;

其次,NAPI接口在框架层实现其业务逻辑代码后,

最后,在编译脚本中定义模块对外接口方法,可以是静态库或者动态库,也可以是可执行文件方式,当前OpenHarmony库中NAPI模块,大多通过动态库方式加载。

OpenHarmony NAPI模块注册流程介绍-开源基础软件社区

对于应用层,首先引用需要的NAPI所在的库名,然后通过库名调用模块内相应的接口;

OpenHarmony NAPI模块注册流程介绍-开源基础软件社区

上面我们简要介绍了NAPI模块注册的流程,接下来我们对应用层如何触发NAPI模块加载、模块注册,以及系统框架层在收到加载、注册请求后如何处理,进而调用到引擎层面。

二、注册流程详解

1、模块注册

OpenHarmony NAPI模块注册流程介绍-开源基础软件社区

Ability线程初始化

应用hap包安装到设备后,启动应用程序时,通过foundation进程fork出应用进程,应用进程的主线程,根据包中的应用类型(FA或Stage)、 UI风格(js或ets)初始化Ability,我们以FA模型、ets UI为例,展开描述。

Ability初始化时,会判断当前Ability类型(AceAbility、PageAbility、ServiceAblity等),进而调用相应类型Ability的初始化,在AceAbility初始化时,需要先创建AceContainer,后续可以通过AceContainer获取包信息、窗口信息。

创建AceContainer时,需要初始化UI前端,以及初始化引擎,引擎初始化时,前端会拉起js线程,进而进入UI后端引擎初始化流程。

js线程初始化

js线程进行后端引擎初始化时,首先进行js Runtime初始化,在运行环境中创建js虚拟机vm,根据虚拟机创建NativeEngine。
NativeEgine会根据后端引擎类型,调用相应的子类NativeEgine,目前标准系统支持的后端引擎:QuickJS引擎、Ark引擎,编译选项可自定义引擎类型,此处我们以ark引擎为例讲解。

应用代码中的:

import XXX from "@ohos.xxx"

经过前端处理打包后,生成的代码为映射为:

globalThis.requireNapi("xxx")

创建后端ark引擎时,会定义requireNapi接口,接口中通过模块管理器加载模块。
加载模块时,首先从缓存中查找已加载的模块是否匹配,首次加载的模块缓存中是不存在的,查找失败;
缓存中查找失败后,则从硬盘中加载,首次加载均是从硬盘加载。
库加载成功后,根据已加载的nativeModule回调NAPI模块注册时定义的回调函数。

2、模块选择

模块选择时,首先从缓存的已加载模块中匹配是否存在需要的模块,若存在则直接用缓存的进行后续接口查找;

否则从硬盘中加载库,根据注册信息获取模块信息;

(1)FindNativeModuleByCache

OpenHarmony NAPI模块注册流程介绍-开源基础软件社区

从缓存中查找模块时,根据import模块名查找是否被load过(nm_modname),若查找不成功,则从硬盘中加载库;
否则,继续检查模块是否被加载过,若被加载过,则返回模块信息,进行后续接口处理;若未被加载,则要查找的模块插入已加载模块链表尾部;进行后续从硬盘中加载库;

(2)FindNativeModuleByDisk

OpenHarmony NAPI模块注册流程介绍-开源基础软件社区

从硬盘中加载库时,首先调用GetNativeModulePath获取对应的库路径,选路径时,首先将要查找的库名进行小写处理,然后获取匹配首选路径、备选路径(首先路径_napi),然后依次匹配,若查找成功,则会调用dlopen打开库,首次dlopen时,会调用库的构造回调进行已加载模块注册处理,将模块信息写到已加载模块链表中;

至此模块注册、查找流程结束。

总结

本文介绍了NAPI模块注册流程,后续大家开发中需要注意以下几点:

1.库名一定要小写。

2.模块名与库名要一致,大小写可不一致。

3.库名AA、AA_napi均能匹配成功,优先匹配AA。

4.应用首次调用接口时触发模块注册。

想了解更多关于开源的内容,请访问:

51CTO 开源基础软件社区

https://ost.51cto.com

责任编辑:jianghua 来源: 51CTO 开源基础软件社区
相关推荐

2024-01-03 15:41:49

2022-05-10 11:02:02

电话子系统鸿蒙

2022-10-11 15:04:28

NAPI开发鸿蒙

2021-12-08 15:07:51

鸿蒙HarmonyOS应用

2021-12-06 06:19:03

鸿蒙HarmonyOS应用

2022-07-19 20:04:31

NAPI模块鸿蒙

2021-09-16 15:08:08

鸿蒙HarmonyOS应用

2023-07-17 16:13:21

组件模块开发的鸿蒙

2022-07-07 14:32:30

蓝牙技术鸿蒙

2022-05-12 14:42:17

项目开发Napi实现

2023-04-04 09:15:10

NAPI 框架鸿蒙

2021-12-02 10:05:01

鸿蒙HarmonyOS应用

2009-12-24 10:09:33

WPF事件注册

2023-06-20 15:45:15

服务卡片鸿蒙

2021-12-14 14:45:38

鸿蒙HarmonyOS应用

2021-06-28 09:38:50

鸿蒙HarmonyOS应用

2023-10-08 15:19:40

2014-09-25 15:27:28

微信企业号注册流程

2023-02-10 15:23:04

2009-09-07 10:36:25

思科CCNA证书CCNA注册方法
点赞
收藏

51CTO技术栈公众号