react_native_exceptions_manager:基于 React Native 鸿蒙生态的异常管理适配项目

可用于在 React Native 鸿蒙应用中捕获和处理 JS 异常。该项目是 react-native-exceptions-manager 的鸿蒙适配版本,支持报告致命和非致命异常,提供事件发布与日志输出功能,适配 API12+。【此简介由AI生成】

分支3Tags0
当前项目代码仓暂无内容

@bingtang-rn/react-native-exceptions-manager for HarmonyOS

本项目基于 react-native-exceptions-manager 开发,为 React Native 鸿蒙(OpenHarmony)适配版本。如果在使用过程中有任何问题,可以在GitCode提Issue,会及时跟进。issue地址:issues

版本对应关系

鸿蒙适配包版本 原始库版本 支持 RN 版本 Autolink 编译 API 版本
见发布记录 0.2.0 0.72+ API17+

安装

npm install @bingtang-rn/react-native-exceptions-manager

使用

import RKExceptionsManager from 'react-native-exceptions-manager';

// 报告致命异常(JS 层捕获后发送到宿主应用)
RKExceptionsManager.reportFatalException(
  'Unhandled JS Error',
  [
    { methodName: 'render', file: 'index.bundle', lineNumber: 42, column: 15 },
    { methodName: 'processChild', file: '123.js', lineNumber: 100 },
  ],
  1,
);

// 报告非致命异常(仅记录日志)
RKExceptionsManager.reportSoftException(
  'Soft Error',
  [{ methodName: 'onPress', file: 'App.js', lineNumber: 30 }],
  2,
);

import 时使用原库名 'react-native-exceptions-manager',而非鸿蒙包名(RNOH alias 自动映射)。

平台差异

  • HarmonyOS 上 reportFatalException 通过 commonEventManager.publish 发布自定义公共事件(对应 Android 的 sendBroadcast),宿主应用需通过 commonEventManager.subscribe 订阅 action 为 com.richardcao.android.REACT_NATIVE_CRASH_REPORT_ACTION 的事件来接收异常信息。
  • reportSoftException 在 HarmonyOS 上通过 hilog.error 输出日志(对应 Android 的 FLog.e)。

权限要求

  • 发布自定义公共事件无需额外权限声明。
版本 是否支持 Autolink
当前版本

如使用版本支持 Autolink 且工程已接入,可跳过手动配置。

Manual Link 配置

说明:本模块需要同时在 C++ 侧和 ETS 侧注册 Package。

1. Overrides RN SDK

在工程根目录 oh-package.json5 添加:

{
  "overrides": {
    "@rnoh/react-native-openharmony": "./react_native_openharmony"
  }
}

2. 引入原生端依赖

打开 entry/oh-package.json5,添加:

"dependencies": {
  "@bingtang-rn/react-native-exceptions-manager": "file:../../node_modules/@bingtang-rn/react-native-exceptions-manager/harmony/exceptions_manager.har"
}

执行 ohpm install

3. 配置 CMakeLists

打开 entry/src/main/cpp/CMakeLists.txt,添加:

set(OH_MODULES "${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules")

add_subdirectory("${OH_MODULES}/@bingtang-rn/react-native-exceptions-manager/src/main/cpp" ./exceptions_manager)

target_link_libraries(rnoh_app PUBLIC exceptions_manager)

4. 注册 Package(C++ 侧)

打开 entry/src/main/cpp/PackageProvider.cpp,添加:

#include "ExceptionsManagerPackage.h"

std::vector<std::shared_ptr<Package>> PackageProvider::getPackages(Package::Context ctx) {
    return {
        std::make_shared<ExceptionsManagerPackage>(ctx),
    };
}

5. 注册 Package(ETS 侧)

打开 entry/src/main/ets/RNPackagesFactory.ets,添加:

import { ExceptionsManagerPackage } from '@bingtang-rn/react-native-exceptions-manager/ts';

export function createRNPackages(ctx: RNPackageContext): RNPackage[] {
  return [
    new ExceptionsManagerPackage(ctx),
  ];
}

属性 / API

API 描述 参数 返回值 HarmonyOS 支持
reportFatalException 报告致命 JS 异常,发布自定义公共事件 title: string, details: Object[], exceptionId: number void ✅ 完全支持
reportSoftException 报告非致命 JS 异常,记录日志 title: string, details: Object[], exceptionId: number void ✅ 完全支持
updateExceptionMessage 更新异常消息 title: string, details: Object[], exceptionId: number void ✅ 完全支持(空实现,与 Android 一致)
dismissRedbox 关闭红框提示 void ✅ 完全支持(空实现,与 Android 一致)

平台差异

  • reportFatalException:Android 使用 BroadcastReceiver + Intent 发送异常广播;HarmonyOS 使用 commonEventManager.publish 发布自定义公共事件,宿主需订阅相同 action 接收。异常信息以 parameters['JavascriptException'] 字符串传递(Android 为 RuntimeException 对象 extra)。
  • reportSoftException:Android 使用 FLog.e 输出;HarmonyOS 使用 hilog.error 输出。

未实现功能

功能 原因
NativeModuleCallExceptionHandler RNOH 框架不提供等效的 NativeModuleCallExceptionHandler 机制。原 Android 构造函数通过 reactContext.setNativeModuleCallExceptionHandler 捕获 native 调用异常并广播;HarmonyOS 无直接对应 API。宿主应用如需捕获全局 JS 异常,可在 EntryAbility 中使用 errorManager.on('error') 注册全局异常观测器。

使用限制

  • 模块名 RKExceptionsManager 与 RN 内置 ExceptionsManager 同名,原 Android 端通过 canOverrideExistingModule=true 覆盖系统模块。HarmonyOS 上是否能覆盖系统模块取决于 RNOH 版本和运行时行为。

快速验证(运行 Example)

前置条件

依赖 版本要求
Node.js >= 18
DevEco Studio 5.0+ / 6.0+
HarmonyOS SDK API 17+

运行步骤

1. 克隆仓库

git clone <仓库地址>
cd <仓库目录>

2. 安装依赖并构建

npm install --legacy-peer-deps
npm pack           # 生成 tgz 包(会自动触发 prepare 构建 JS 产物)

3. 进入 example 目录,安装依赖

cd example
npm install --legacy-peer-deps

4. 生成 JS Bundle

npm run dev

产物:harmony/entry/src/main/resources/rawfile/bundle.harmony.js

5. 用 DevEco Studio 打开鸿蒙工程

  • 打开 DevEco Studio
  • 选择 example/harmony 目录
  • 等待 Sync 完成

6. 编译并运行 HAP

在 DevEco Studio 中点击运行按钮,将 HAP 安装到设备/模拟器。

注意:Example 中已预置插件依赖和 Package 注册,无需手动配置 Link。

约束与限制

兼容性

  • RNOH: 0.72+
  • HarmonyOS SDK: API 17+
  • DevEco Studio: 5.0+

遗留问题

  • NativeModuleCallExceptionHandler 功能未实现:RNOH 框架无等效机制,宿主应用需自行使用 errorManager.on('error') 捕获全局异常。

开源协议

本项目基于 MIT 协议,详见 LICENSE 文件。

项目介绍

可用于在 React Native 鸿蒙应用中捕获和处理 JS 异常。该项目是 react-native-exceptions-manager 的鸿蒙适配版本,支持报告致命和非致命异常,提供事件发布与日志输出功能,适配 API12+。【此简介由AI生成】

定制我的领域