@arms/rum-reactnative 0.1.3-beta.4 → 0.1.4-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/README.md +7 -1
  2. package/RumSdkReactnative.podspec +3 -1
  3. package/android/src/main/java/com/rumsdkreactnative/RumSdkReactnativeModule.kt +31 -0
  4. package/docs/ReactNative SDK/351/205/215/347/275/256/345/217/202/350/200/203.md" +25 -0
  5. package/docs/SDK /347/211/210/346/234/254/350/257/264/346/230/216.md" +14 -0
  6. package/ios/RumAppStateRecorder.h +69 -0
  7. package/ios/RumAppStateRecorder.mm +547 -0
  8. package/ios/RumCrashReporter.h +32 -0
  9. package/ios/RumCrashReporter.mm +156 -33
  10. package/ios/RumSdkReactnative.mm +81 -1
  11. package/lib/commonjs/NativeRumSdkReactnative.js +1 -54
  12. package/lib/commonjs/collector/action/index.js +1 -108
  13. package/lib/commonjs/collector/exception/crash.js +1 -148
  14. package/lib/commonjs/collector/exception/index.js +1 -238
  15. package/lib/commonjs/collector/exception/oom.js +1 -0
  16. package/lib/commonjs/collector/index.js +1 -42
  17. package/lib/commonjs/collector/resource/api.js +1 -292
  18. package/lib/commonjs/collector/view/perf.js +1 -79
  19. package/lib/commonjs/collector/view/pv.js +1 -88
  20. package/lib/commonjs/expoConfigPlugin.js +1 -37
  21. package/lib/commonjs/index.js +1 -29
  22. package/lib/commonjs/plugin.js +1 -47
  23. package/lib/commonjs/processor/default-processor.js +1 -27
  24. package/lib/commonjs/processor/session-processor.js +1 -47
  25. package/lib/commonjs/reporter/index.js +1 -148
  26. package/lib/commonjs/reporter/monitor-reporter.js +1 -43
  27. package/lib/commonjs/shell.js +1 -91
  28. package/lib/commonjs/types/client.js +1 -6
  29. package/lib/commonjs/types/crash.js +1 -37
  30. package/lib/commonjs/types/index.js +1 -2
  31. package/lib/commonjs/types/oom.js +1 -0
  32. package/lib/commonjs/utils/action.js +1 -305
  33. package/lib/commonjs/utils/api.js +1 -84
  34. package/lib/commonjs/utils/base.js +1 -95
  35. package/lib/commonjs/utils/crash.js +1 -149
  36. package/lib/commonjs/utils/platform.js +1 -162
  37. package/lib/commonjs/utils/session.js +1 -158
  38. package/lib/commonjs/utils/url.js +1 -59
  39. package/lib/commonjs/utils/view.js +1 -93
  40. package/lib/module/NativeRumSdkReactnative.js +1 -51
  41. package/lib/module/collector/action/index.js +1 -103
  42. package/lib/module/collector/exception/crash.js +1 -143
  43. package/lib/module/collector/exception/index.js +1 -233
  44. package/lib/module/collector/exception/oom.js +1 -0
  45. package/lib/module/collector/index.js +1 -8
  46. package/lib/module/collector/resource/api.js +1 -287
  47. package/lib/module/collector/view/perf.js +1 -79
  48. package/lib/module/collector/view/pv.js +1 -83
  49. package/lib/module/expoConfigPlugin.js +1 -33
  50. package/lib/module/index.js +1 -7
  51. package/lib/module/plugin.js +1 -42
  52. package/lib/module/processor/default-processor.js +1 -22
  53. package/lib/module/processor/session-processor.js +1 -42
  54. package/lib/module/reporter/index.js +1 -144
  55. package/lib/module/reporter/monitor-reporter.js +1 -38
  56. package/lib/module/shell.js +1 -84
  57. package/lib/module/types/client.js +1 -4
  58. package/lib/module/types/crash.js +1 -33
  59. package/lib/module/types/index.js +1 -2
  60. package/lib/module/types/oom.js +1 -0
  61. package/lib/module/utils/action.js +1 -299
  62. package/lib/module/utils/api.js +1 -76
  63. package/lib/module/utils/base.js +1 -90
  64. package/lib/module/utils/crash.js +1 -144
  65. package/lib/module/utils/platform.js +1 -150
  66. package/lib/module/utils/session.js +1 -154
  67. package/lib/module/utils/url.js +1 -54
  68. package/lib/module/utils/view.js +1 -88
  69. package/lib/typescript/commonjs/src/NativeRumSdkReactnative.d.ts +10 -0
  70. package/lib/typescript/commonjs/src/collector/exception/oom.d.ts +34 -0
  71. package/lib/typescript/commonjs/src/collector/index.d.ts +1 -0
  72. package/lib/typescript/commonjs/src/shell.d.ts +1 -1
  73. package/lib/typescript/commonjs/src/types/client.d.ts +27 -0
  74. package/lib/typescript/commonjs/src/types/oom.d.ts +58 -0
  75. package/lib/typescript/commonjs/src/utils/crash.d.ts +13 -0
  76. package/lib/typescript/module/src/NativeRumSdkReactnative.d.ts +10 -0
  77. package/lib/typescript/module/src/collector/exception/oom.d.ts +34 -0
  78. package/lib/typescript/module/src/collector/index.d.ts +1 -0
  79. package/lib/typescript/module/src/shell.d.ts +1 -1
  80. package/lib/typescript/module/src/types/client.d.ts +27 -0
  81. package/lib/typescript/module/src/types/oom.d.ts +58 -0
  82. package/lib/typescript/module/src/utils/crash.d.ts +13 -0
  83. package/package.json +1 -2
  84. package/src/NativeRumSdkReactnative.ts +18 -0
package/README.md CHANGED
@@ -5,6 +5,7 @@
5
5
  ## 功能特性
6
6
 
7
7
  - **原生崩溃采集** — 自动捕获 iOS(KSCrash)与 Android(Java + NDK)原生崩溃,支持堆栈双侧截断与数据体积优化
8
+ - **OOM采集(iOS)** — 看门狗终止(Watchdog Termination / FOOM)的事后推断上报,默认关闭,需显式开启
8
9
  - **API性能监控** — 自动拦截 XMLHttpRequest / fetch 请求,采集耗时、状态码等指标
9
10
  - **JS错误捕获** — 自动捕获 JavaScript 运行时异常
10
11
  - **控制台错误监听** — 监听 `console.error` 输出
@@ -81,6 +82,7 @@ armsRum.init({
81
82
  | api | boolean \| object | `true` | API请求监控(XMLHttpRequest / fetch) |
82
83
  | jsError | boolean \| object | `true` | JavaScript运行时错误捕获 |
83
84
  | consoleError | boolean \| object | `true` | `console.error`监听 |
85
+ | oom | boolean | `false` | OOM(iOS 看门狗终止推断)采集,仅 iOS 前台场景,需显式开启,详见[配置参考](docs/ReactNative%20SDK配置参考.md) |
84
86
 
85
87
  ### sessionConfig Session配置
86
88
 
@@ -427,7 +429,8 @@ SDK 的 peerDependencies 声明为 `react-native: >=0.68.0`,原生构建配置
427
429
  |--------|--------------|-------------|------|
428
430
  | **原生崩溃采集** | TurboModule + codegen | 0.68 | podspec / build.gradle 按版本条件分支,自动适配 0.68-0.70 和 0.71+ |
429
431
  | NDK 崩溃采集(C/C++) | CMake + NDK `externalNativeBuild` | 0.68 | 随原生崩溃采集一起启用 |
430
- | iOS 崩溃采集(KSCrash) | KSCrash ~2.0(CocoaPods 源码依赖) | 0.68 | `pod install` 时自动编译 |
432
+ | iOS 崩溃采集(KSCrash) | KSCrash 2.5.1(CocoaPods 源码依赖,已锁定版本) | 0.68 | `pod install` 时自动编译 |
433
+ | **OOM 采集(iOS)** | TurboModule + KSCrash + 状态快照持久化 | 0.68 | 仅 iOS,默认关闭(`collectors.oom` 显式开启);Android 为空实现 |
431
434
  | **JS 异常采集** | `ErrorUtils.setGlobalHandler` | 0.68 | 全版本可用 |
432
435
  | Hermes Promise rejection | `HermesInternal.enablePromiseRejectionTracker` | 0.70(推荐) | Hermes 为默认引擎时完整支持 |
433
436
  | JSC Promise rejection 兜底 | `globalThis.onunhandledrejection` | 0.68 | 非 Hermes 引擎有降级方案 |
@@ -447,4 +450,7 @@ SDK 的 peerDependencies 声明为 `react-native: >=0.68.0`,原生构建配置
447
450
 
448
451
  ## 相关文档
449
452
 
453
+ - [接入ReactNative应用](docs/接入ReactNative应用.md)
454
+ - [ReactNative SDK配置参考](docs/ReactNative%20SDK配置参考.md)
455
+ - [SDK 版本说明](docs/SDK%20版本说明.md)
450
456
  - [ARMS用户体验监控文档](https://help.aliyun.com/zh/arms/user-experience-monitoring/)
@@ -25,7 +25,9 @@ Pod::Spec.new do |s|
25
25
 
26
26
  # KSCrash 通过 CocoaPods 源码依赖引入。KSCrash 不发布官方 XCFramework,
27
27
  # 故不自行预编译,直接由宿主工程 `pod install` 时源码编译。
28
- s.dependency "KSCrash", "~> 2.0"
28
+ # 锁定到已验证版本 2.5.1:避免 `~> 2.0` 浮动解析到未经测试的新版本,在不同
29
+ # iOS(尤其新系统如 iOS 26)上源码编译引入不可控行为。升级须重新回归验证后再改此处。
30
+ s.dependency "KSCrash", "2.5.1"
29
31
 
30
32
  if defined?(install_modules_dependencies)
31
33
  # RN 0.71+ 使用 install_modules_dependencies 自动解析 React 依赖
@@ -422,6 +422,37 @@ class RumSdkReactnativeModule(reactContext: ReactApplicationContext) :
422
422
 
423
423
  // endregion
424
424
 
425
+ // region OOM (iOS-only watchdog termination, no-op on Android)
426
+
427
+ /**
428
+ * Android 无 OOM(看门狗终止推断)能力(D2):Java OutOfMemoryError
429
+ * 已由 CrashHandler 崩溃链路捕获,系统低内存杀进程检测不在本期范围。
430
+ * 空实现仅为满足 TurboModule Spec 双端对齐。
431
+ */
432
+ override fun getPendingOomReports(promise: Promise) {
433
+ try {
434
+ promise.resolve("[]")
435
+ } catch (e: Throwable) {
436
+ promise.reject(ERR_CRASH, e)
437
+ }
438
+ }
439
+
440
+ /** 清除 OOM 报告文件:Android 无 OOM 文件,no-op */
441
+ override fun clearOomReports(oomIds: String, promise: Promise) {
442
+ try {
443
+ promise.resolve(null)
444
+ } catch (e: Throwable) {
445
+ promise.reject(ERR_CRASH, e)
446
+ }
447
+ }
448
+
449
+ /** 同步 JS 侧采集器配置(如 oom 开关):Android 无 OOM 能力,接受但忽略 */
450
+ override fun updateCollectorsConfig(config: String) {
451
+ // no-op
452
+ }
453
+
454
+ // endregion
455
+
425
456
  // region Test Crash
426
457
 
427
458
  private external fun nativeTriggerCrash(type: Int)
@@ -104,6 +104,7 @@ Collector是RUM SDK用于收集React Native应用监控数据的最小单元。
104
104
  | api | boolean \| object | 监听API请求(XMLHttpRequest / fetch) | 否 | true |
105
105
  | jsError | boolean \| object | 监听JS错误 | 否 | true |
106
106
  | consoleError | boolean \| object | 监听Console错误 | 否 | true |
107
+ | oom | boolean | OOM(iOS看门狗终止推断)采集,详细说明请参见[oom配置](#oom-配置) | 否 | false |
107
108
 
108
109
  ### 示例
109
110
 
@@ -131,6 +132,30 @@ armsRum.init({
131
132
  });
132
133
  ```
133
134
 
135
+ ## oom 配置
136
+
137
+ iOS看门狗终止(Watchdog Termination / FOOM,前台 OOM)的事后推断采集。App在前台被系统看门狗终止时无任何信号可捕获,表现为无提示"闪退",现有崩溃管线天然采集不到;开启本能力后,SDK在运行期持续持久化 App 状态快照,下次冷启动时用排除法推断上次是否发生看门狗终止,并通过标准 exception 事件链路上报(`type='crash'` + `subtype='oom'`,name 为 `WatchdogTermination`)。
138
+
139
+ ```typescript
140
+ armsRum.init({
141
+ endpoint: '<your-endpoint>',
142
+ collectors: {
143
+ oom: true,
144
+ },
145
+ });
146
+ ```
147
+
148
+ **能力范围与限制**:
149
+
150
+ - 仅支持 iOS,且仅覆盖**前台激活状态**被杀的推断(后台被杀不判定不上报);Android 无此能力(Java `OutOfMemoryError` 已由崩溃采集链路捕获)
151
+ - 启发式推断存在精度上限:无堆栈(`stack` 为空),`timestamp` 为估算值,事件通过 `snapshots.estimated: true` 结构化标记推断性质
152
+ - 每次启动最多上报 1 条 OOM 事件;首次安装后被杀、调试器附加期间被杀、设备重启等场景不判定(业界同类能力同款排除条件)
153
+ - 判定依据为上次会话持久化的状态快照,需重新构建原生 App(如 `expo run:ios` / `pod install` + 重新编译)后生效
154
+
155
+ > **注意**:
156
+ > - `oom` 默认为 `false`,需显式开启(`oom: true`);其开关方向与崩溃采集相反(崩溃采集默认开启,配置 `crash: false` 才关闭)。
157
+ > - 建议与崩溃采集同时开启(保持 `crash` 默认开启即可)。崩溃采集关闭时,原生崩溃监控仍会安装、KSCrash 崩溃报告照常写入但不会被读取和清理;残留的陈旧报告会使紧跟崩溃之后的 OOM 判定让位崩溃链路(防双报,预期行为),整体方向保守——OOM 倾向被抑制(漏判方向),而非误报增多。
158
+
134
159
  ## tracing 链路追踪配置
135
160
 
136
161
  支持布尔值开关或详细配置对象:
@@ -4,6 +4,20 @@
4
4
 
5
5
  ## 版本列表
6
6
 
7
+ ### v0.1.4(2026年09月)
8
+
9
+ iOS 看门狗终止(OOM)推断采集与发布产物混淆修复。
10
+
11
+ #### v0.1.4-beta.1(2026年09月23日)
12
+
13
+ 新增 iOS 看门狗终止(OOM)事后推断采集。
14
+
15
+ - 新增 iOS OOM 采集,默认关闭需显式开启
16
+ - 崩溃与 OOM 配置独立,判定互斥防双报
17
+ - OOM 事件英文证据式表述,estimated 标记推断性质
18
+ - 锁定 KSCrash 依赖版本
19
+ - 修复发布流程,生产产物启用代码混淆压缩
20
+
7
21
  ### v0.1.3(2026年07月)
8
22
 
9
23
  原生崩溃采集安全加固与自监控系统集成。
@@ -0,0 +1,69 @@
1
+ #import <Foundation/Foundation.h>
2
+
3
+ NS_ASSUME_NONNULL_BEGIN
4
+
5
+ /**
6
+ * RumAppStateRecorder
7
+ *
8
+ * iOS 看门狗终止(OOM)事后推断采集(P1 阶段,方案见
9
+ * dev-docs/OOM采集调研与实施方案.md 4.2 节)。负责:
10
+ * - 运行期持久化 App 状态快照(app_state.json):生命周期通知驱动、仅状态变化时写
11
+ * - 下次启动时按 10 项排除条件判定上次是否发生看门狗终止(判定逻辑纯函数化,见下)
12
+ * - 判定通过时构造 oom_{timestamp}_{uuid}.json 事件文件,交由 JS 侧回捞上报
13
+ * (原生落盘、JS 回捞,保持 Ack 删文件链路的可靠性)
14
+ *
15
+ * 与 RumCrashReporter 的职责边界:RumCrashReporter 管信号/崩溃(KSCrash),
16
+ * 本类管状态记录与 OOM 推断,不使用信号处理器、不与 KSCrash 冲突。
17
+ * 判定逻辑(RumWatchdogTerminationLogic)与本类同文件实现。
18
+ */
19
+ @interface RumAppStateRecorder : NSObject
20
+
21
+ /**
22
+ * 安装 OOM 采集(幂等,dispatch_once 保证判定只执行一次)。
23
+ *
24
+ * 驱动方:RumSdkReactnative.updateCollectorsConfig——JS 侧 OomCollector 在
25
+ * SDK init 且 collectors.oom === true 时调用 updateCollectorsConfig("{\"oom\":true}")
26
+ * 触发;未开启时本方法不会被调用:不安装 Recorder、不执行判定、不产生
27
+ * 任何 OOM 相关 I/O(D6 默认关闭)。
28
+ *
29
+ * 上次会话是否开启由 app_state.json 的存在性隐式承载(上次未开启则无快照,
30
+ * 判定条件①不通过,不会误判),无需独立的开关持久化。
31
+ */
32
+ + (void)setup;
33
+
34
+ /** 获取待上报的 OOM 事件(已解析为字典数组,逐文件处理,不一次性全量读入拼接) */
35
+ + (NSArray<NSDictionary *> *)pendingOomReports;
36
+
37
+ /** 按 oomId 删除已上报的 OOM 事件文件 */
38
+ + (void)clearOomReportsWithIds:(NSArray<NSString *> *)oomIds;
39
+
40
+ /**
41
+ * 看门狗终止判定(纯函数化:输入上次快照 + 当前环境 + 崩溃证据,输出是否判定,
42
+ * 便于后续经桥伪造输入测试或 XCTest)。
43
+ *
44
+ * 10 项排除条件全部满足才判定(方案 4.2.2,D5/D7 硬约束):
45
+ * ① 存在上次快照;② 非模拟器;③ appVersion 未变;④ osVersion 未变;
46
+ * ⑤ systemBootTime 未变;⑥ vendorId 一致且非空;⑦ 上次非调试态;
47
+ * ⑧ 上次非正常终止;⑨ 上次前台激活(D5 前台限定);
48
+ * ⑩ 上次运行内无崩溃证据(crashed_last_run.flag 不存在 且 KSCrash reportStore
49
+ * 无晚于上次快照 updatedAt 的 pending 报告——时间范围限定排除陈旧报告,
50
+ * D7 判定层互斥)。
51
+ *
52
+ * @param previousState 上次会话的 app_state.json 快照(不存在时传 nil)
53
+ * @param currentState 本次会话采集的当前环境快照
54
+ * @param flagExists crashed_last_run.flag 是否存在
55
+ * @param hasPendingReports 上次运行内是否存在待处理崩溃报告(调用方对 KSCrash
56
+ * pending 报告施加时间范围限定后传入:仅最新报告时间戳
57
+ * 晚于上次快照 updatedAt 时为 YES,陈旧报告不计入)
58
+ * @param isSimulator 是否运行在模拟器(生产路径由 TARGET_OS_SIMULATOR
59
+ * 编译宏求值;参数化便于模拟器上运行的测试伪造真机分支)
60
+ */
61
+ + (BOOL)evaluateWatchdogTerminationFromPreviousState:(nullable NSDictionary *)previousState
62
+ currentState:(NSDictionary *)currentState
63
+ crashedLastRunFlagExists:(BOOL)flagExists
64
+ hasPendingCrashReports:(BOOL)hasPendingReports
65
+ runningOnSimulator:(BOOL)isSimulator;
66
+
67
+ @end
68
+
69
+ NS_ASSUME_NONNULL_END