原生模块性能分析
NativeModule 是 JavaScript 与原生应用之间的核心通信桥梁,通过调用 NativeModule,Lynx 前端页面能够访问和控制原生功能。本文将介绍结合具体代码示例,详细解析 NativeModule 在 Trace 中的调用过程和执行流程。
使用 Trace 深入分析
自 Lynx 3.2 版本起,Trace 页面新增了一个 NativeModule 的 Track,用于集中展示所有 NativeModule 调用记录。每个条目的长度是一次 NativeModule 发起请求至请求完成的整体耗时。
基础展示: 点击 NativeModule Track 中的具体条目,可通过五种颜色标识直观呈现该次调用各阶段的粗略耗时。
详情面板: 详细展示调用名称、入参信息及各阶段的精确耗时数据(包括参数转换、平台逻辑、线程切换等关键节点耗时)。
NativeModule 调用细节拆分
下面以一次前端代码的 NativeModule 调用为例,描述 Trace 中的执行时机。
示例代码
Trace 执行分析
NativeModule 调用可以划分为以下五个主要阶段:
1. 数据转换
该阶段对应 Trace 中 JSValueToPubValue 时间段,主要将 JS 数据(示例代码中的第4-7行)转换成 Native 类型数据。
2. 平台层功能实现
该阶段对应 Trace 中从 CallPlatformImplementation 开始到 NativeModule::PlatformCallbackStart 的时间段,Native 方法执行具体功能并返回平台层数据。
其中,CallPlatformImplemention 发生在后台线程上,而 CallPlatformImplemention Trace 事件与 NativeModule::PlatformCallbackStart 之间的逻辑,通常是在其他线程中完成的。
3. 等待后台线程执行 Callback
该阶段对应 Trace 中从 NativeModule::PlatformCallbackStart 到 NativeModule::Callback 开始的时间段。
4. 返回结果类型转换
该阶段对应 Trace 中 PubValueToJSValue 时间段,将平台层返回的数据转换为 JS 类型参数。