天天看點

OpenHarmony NAPI子產品注冊流程

作者:51CTO

關于 NAPI 接口相關知識,之前我們介紹過 NAPI 同步異步接口使用方法、應用啟動觸發的 ArkUI ets_runtime 啟動流程,從 NAPI 使用到整體流程給大家做了介紹。

OpenHarmony NAPI子產品注冊流程

本次我們針對 NAPI 子產品注冊流程做深入介紹,給大家後續工作中開發、使用 NAPI 接口提供指導。

子產品注冊簡介

NAPI 子產品注冊是在系統架構層與應用層的互相配合下完成的,下面簡要介紹一下大緻流程。

OpenHarmony NAPI子產品注冊流程

首先,提供 NAPI 接口定義給應用層,一般是打包到 SDK 中,供應用開發者查詢使用;其次,NAPI 接口在架構層實作其業務邏輯代碼後。

最後,在編譯腳本中定義子產品對外接口方法,可以是靜态庫或者動态庫,也可以是可執行檔案方式。

目前 OpenHarmony 庫中 NAPI 子產品,大多通過動态庫方式加載。

OpenHarmony NAPI子產品注冊流程

對于應用層,首先引用需要的 NAPI 所在的庫名,然後通過庫名調用子產品内相應的接口。

OpenHarmony NAPI子產品注冊流程

上面我們簡要介紹了 NAPI 子產品注冊的流程,接下來我們對應用層如何觸發 NAPI 子產品加載、子產品注冊,以及系統架構層在收到加載、注冊請求後如何處理,進而調用到引擎層面。

注冊流程詳解

①子產品注冊

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 子產品注冊時定義的回調函數。

②子產品選擇

子產品選擇時,首先從緩存的已加載子產品中比對是否存在需要的子產品,若存在則直接用緩存的進行後續接口查找。否則從硬碟中加載庫,根據注冊資訊擷取子產品資訊。

FindNativeModuleByCache:

OpenHarmony NAPI子產品注冊流程

從緩存中查找子產品時,根據 import 子產品名查找是否被 load 過(nm_modname),若查找不成功,則從硬碟中加載庫。

否則,繼續檢查子產品是否被加載過,若被加載過,則傳回子產品資訊,進行後續接口處理;若未被加載,則要查找的子產品插入已加載子產品連結清單尾部;進行後續從硬碟中加載庫。

FindNativeModuleByDisk:

OpenHarmony NAPI子產品注冊流程

從硬碟中加載庫時,首先調用 GetNativeModulePath 擷取對應的庫路徑,選路徑時,首先将要查找的庫名進行小寫處理,然後擷取比對首選路徑、備選路徑(首先路徑_napi)。

然後依次比對,若查找成功,則會調用 dlopen 打開庫,首次 dlopen 時,會調用庫的構造回調進行已加載子產品注冊處理,将子產品資訊寫到已加載子產品連結清單中;至此子產品注冊、查找流程結束。

總結

本文介紹了 NAPI 子產品注冊流程,後續大家開發中需要注意以下幾點:

  • 庫名一定要小寫
  • 子產品名與庫名要一緻,大小寫可不一緻
  • 庫名 AA、AA_napi 均能比對成功,優先比對 AA
  • 應用首次調用接口時觸發子產品注冊

關于 NAPI 架構原理介紹會持續更新,感謝大家關注。

作者:趙軍霞

繼續閱讀