@arms/rum-reactnative 0.1.1 → 0.1.3-beta.0

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 (178) hide show
  1. package/README.md +399 -15
  2. package/RumSdkReactnative.podspec +28 -0
  3. package/android/build.gradle +83 -0
  4. package/android/gradle.properties +6 -0
  5. package/android/src/main/AndroidManifest.xml +13 -0
  6. package/android/src/main/java/com/rumsdkreactnative/RumSdkReactnativeModule.kt +512 -0
  7. package/android/src/main/java/com/rumsdkreactnative/RumSdkReactnativePackage.kt +33 -0
  8. package/android/src/main/java/com/rumsdkreactnative/crash/CrashContextManager.kt +157 -0
  9. package/android/src/main/java/com/rumsdkreactnative/crash/CrashHandler.kt +444 -0
  10. package/android/src/main/java/com/rumsdkreactnative/crash/CrashInitProvider.kt +50 -0
  11. package/android/src/main/java/com/rumsdkreactnative/crash/NdkCrashHandler.kt +66 -0
  12. package/android/src/main/jni/CMakeLists.txt +21 -0
  13. package/android/src/main/jni/rum_backtrace.c +144 -0
  14. package/android/src/main/jni/rum_crash_handler.c +200 -0
  15. package/android/src/main/jni/rum_crash_writer.c +442 -0
  16. package/android/src/main/jni/rum_module_info.c +316 -0
  17. package/android/src/main/jni/rum_module_info.h +54 -0
  18. package/android/src/main/jni/rum_test_crash.cpp +55 -0
  19. package/app.plugin.js +11 -0
  20. package/docs/ReactNative SDK/351/205/215/347/275/256/345/217/202/350/200/203.md" +671 -0
  21. package/docs/SDK /347/211/210/346/234/254/350/257/264/346/230/216.md" +12 -0
  22. package/docs//346/216/245/345/205/245ReactNative/345/272/224/347/224/250.md +238 -0
  23. package/ios/PrivacyInfo.xcprivacy +93 -0
  24. package/ios/RumCrashReporter.h +38 -0
  25. package/ios/RumCrashReporter.mm +861 -0
  26. package/ios/RumSdkReactnative.h +5 -0
  27. package/ios/RumSdkReactnative.mm +291 -0
  28. package/ios/fishhook/fishhook.c +264 -0
  29. package/ios/fishhook/fishhook.h +76 -0
  30. package/lib/commonjs/NativeRumSdkReactnative.js +50 -0
  31. package/lib/commonjs/collector/action/index.js +108 -0
  32. package/lib/commonjs/collector/exception/crash.js +148 -0
  33. package/lib/commonjs/collector/exception/index.js +238 -0
  34. package/lib/commonjs/collector/index.js +42 -0
  35. package/lib/commonjs/collector/resource/api.js +286 -0
  36. package/lib/commonjs/collector/view/perf.js +79 -0
  37. package/lib/commonjs/collector/view/pv.js +88 -0
  38. package/lib/commonjs/expoConfigPlugin.js +37 -0
  39. package/lib/commonjs/index.js +29 -0
  40. package/lib/commonjs/package.json +1 -0
  41. package/lib/commonjs/plugin.js +47 -0
  42. package/lib/commonjs/processor/default-processor.js +27 -0
  43. package/lib/commonjs/processor/session-processor.js +47 -0
  44. package/lib/commonjs/reporter/index.js +148 -0
  45. package/lib/commonjs/reporter/monitor-reporter.js +43 -0
  46. package/lib/commonjs/shell.js +91 -0
  47. package/lib/commonjs/types/client.js +6 -0
  48. package/lib/commonjs/types/crash.js +37 -0
  49. package/lib/commonjs/types/index.js +2 -0
  50. package/lib/commonjs/utils/action.js +305 -0
  51. package/lib/commonjs/utils/api.js +83 -0
  52. package/lib/commonjs/utils/base.js +95 -0
  53. package/lib/commonjs/utils/crash.js +146 -0
  54. package/lib/commonjs/utils/platform.js +162 -0
  55. package/lib/commonjs/utils/session.js +158 -0
  56. package/lib/commonjs/utils/url.js +59 -0
  57. package/lib/commonjs/utils/view.js +93 -0
  58. package/lib/module/NativeRumSdkReactnative.js +47 -0
  59. package/lib/module/collector/action/index.js +45 -10
  60. package/lib/module/collector/exception/crash.js +143 -0
  61. package/lib/module/collector/exception/index.js +144 -46
  62. package/lib/module/collector/index.js +8 -0
  63. package/lib/module/collector/resource/api.js +6 -6
  64. package/lib/module/collector/view/pv.js +13 -2
  65. package/lib/module/expoConfigPlugin.js +33 -0
  66. package/lib/module/index.js +1 -0
  67. package/lib/module/plugin.js +4 -1
  68. package/lib/module/processor/session-processor.js +22 -0
  69. package/lib/module/reporter/index.js +102 -16
  70. package/lib/module/reporter/monitor-reporter.js +38 -0
  71. package/lib/module/shell.js +32 -7
  72. package/lib/module/types/crash.js +33 -0
  73. package/lib/module/utils/action.js +299 -0
  74. package/lib/module/utils/api.js +10 -10
  75. package/lib/module/utils/base.js +9 -9
  76. package/lib/module/utils/crash.js +141 -0
  77. package/lib/module/utils/platform.js +127 -72
  78. package/lib/module/utils/session.js +23 -4
  79. package/lib/module/utils/view.js +2 -1
  80. package/lib/typescript/commonjs/package.json +1 -0
  81. package/lib/typescript/commonjs/src/NativeRumSdkReactnative.d.ts +49 -0
  82. package/lib/typescript/{src → commonjs/src}/collector/action/index.d.ts +7 -1
  83. package/lib/typescript/commonjs/src/collector/exception/crash.d.ts +28 -0
  84. package/lib/typescript/{src → commonjs/src}/collector/exception/index.d.ts +7 -0
  85. package/lib/typescript/commonjs/src/collector/index.d.ts +6 -0
  86. package/lib/typescript/{src → commonjs/src}/collector/view/pv.d.ts +2 -2
  87. package/lib/typescript/commonjs/src/expoConfigPlugin.d.ts +28 -0
  88. package/lib/typescript/commonjs/src/index.d.ts +6 -0
  89. package/lib/typescript/{src → commonjs/src}/processor/session-processor.d.ts +2 -0
  90. package/lib/typescript/{src → commonjs/src}/reporter/index.d.ts +3 -1
  91. package/lib/typescript/commonjs/src/reporter/monitor-reporter.d.ts +8 -0
  92. package/lib/typescript/commonjs/src/shell.d.ts +57 -0
  93. package/lib/typescript/{src → commonjs/src}/types/client.d.ts +2 -2
  94. package/lib/typescript/commonjs/src/types/crash.d.ts +95 -0
  95. package/lib/typescript/commonjs/src/utils/action.d.ts +63 -0
  96. package/lib/typescript/{src → commonjs/src}/utils/api.d.ts +1 -1
  97. package/lib/typescript/commonjs/src/utils/crash.d.ts +12 -0
  98. package/lib/typescript/commonjs/src/utils/platform.d.ts +22 -0
  99. package/lib/typescript/{src → commonjs/src}/utils/session.d.ts +4 -0
  100. package/lib/typescript/module/src/NativeRumSdkReactnative.d.ts +49 -0
  101. package/lib/typescript/module/src/collector/action/index.d.ts +21 -0
  102. package/lib/typescript/module/src/collector/exception/crash.d.ts +28 -0
  103. package/lib/typescript/module/src/collector/exception/index.d.ts +32 -0
  104. package/lib/typescript/module/src/collector/index.d.ts +6 -0
  105. package/lib/typescript/module/src/collector/resource/api.d.ts +21 -0
  106. package/lib/typescript/module/src/collector/view/perf.d.ts +1 -0
  107. package/lib/typescript/module/src/collector/view/pv.d.ts +16 -0
  108. package/lib/typescript/module/src/expoConfigPlugin.d.ts +28 -0
  109. package/lib/typescript/module/src/index.d.ts +6 -0
  110. package/lib/typescript/module/src/plugin.d.ts +3 -0
  111. package/lib/typescript/module/src/processor/default-processor.d.ts +6 -0
  112. package/lib/typescript/module/src/processor/session-processor.d.ts +11 -0
  113. package/lib/typescript/module/src/reporter/index.d.ts +18 -0
  114. package/lib/typescript/module/src/reporter/monitor-reporter.d.ts +8 -0
  115. package/lib/typescript/module/src/shell.d.ts +57 -0
  116. package/lib/typescript/module/src/types/client.d.ts +27 -0
  117. package/lib/typescript/module/src/types/crash.d.ts +95 -0
  118. package/lib/typescript/module/src/types/index.d.ts +118 -0
  119. package/lib/typescript/module/src/utils/action.d.ts +63 -0
  120. package/lib/typescript/module/src/utils/api.d.ts +59 -0
  121. package/lib/typescript/module/src/utils/base.d.ts +8 -0
  122. package/lib/typescript/module/src/utils/crash.d.ts +12 -0
  123. package/lib/typescript/module/src/utils/platform.d.ts +22 -0
  124. package/lib/typescript/module/src/utils/session.d.ts +41 -0
  125. package/lib/typescript/module/src/utils/url.d.ts +17 -0
  126. package/lib/typescript/module/src/utils/view.d.ts +13 -0
  127. package/package.json +61 -26
  128. package/LICENSE +0 -20
  129. package/lib/module/collector/action/index.js.map +0 -1
  130. package/lib/module/collector/exception/index.js.map +0 -1
  131. package/lib/module/collector/resource/api.js.map +0 -1
  132. package/lib/module/collector/view/perf.js.map +0 -1
  133. package/lib/module/collector/view/pv.js.map +0 -1
  134. package/lib/module/index.js.map +0 -1
  135. package/lib/module/plugin.js.map +0 -1
  136. package/lib/module/processor/default-processor.js.map +0 -1
  137. package/lib/module/processor/session-processor.js.map +0 -1
  138. package/lib/module/reporter/index.js.map +0 -1
  139. package/lib/module/shell.js.map +0 -1
  140. package/lib/module/types/client.js.map +0 -1
  141. package/lib/module/types/index.js.map +0 -1
  142. package/lib/module/utils/api.js.map +0 -1
  143. package/lib/module/utils/base.js.map +0 -1
  144. package/lib/module/utils/platform.js.map +0 -1
  145. package/lib/module/utils/session.js.map +0 -1
  146. package/lib/module/utils/url.js.map +0 -1
  147. package/lib/module/utils/view.js.map +0 -1
  148. package/lib/typescript/src/collector/action/index.d.ts.map +0 -1
  149. package/lib/typescript/src/collector/exception/index.d.ts.map +0 -1
  150. package/lib/typescript/src/collector/resource/api.d.ts.map +0 -1
  151. package/lib/typescript/src/collector/view/perf.d.ts.map +0 -1
  152. package/lib/typescript/src/collector/view/pv.d.ts.map +0 -1
  153. package/lib/typescript/src/index.d.ts +0 -4
  154. package/lib/typescript/src/index.d.ts.map +0 -1
  155. package/lib/typescript/src/plugin.d.ts.map +0 -1
  156. package/lib/typescript/src/processor/default-processor.d.ts.map +0 -1
  157. package/lib/typescript/src/processor/session-processor.d.ts.map +0 -1
  158. package/lib/typescript/src/reporter/index.d.ts.map +0 -1
  159. package/lib/typescript/src/shell.d.ts +0 -26
  160. package/lib/typescript/src/shell.d.ts.map +0 -1
  161. package/lib/typescript/src/types/client.d.ts.map +0 -1
  162. package/lib/typescript/src/types/index.d.ts.map +0 -1
  163. package/lib/typescript/src/utils/api.d.ts.map +0 -1
  164. package/lib/typescript/src/utils/base.d.ts.map +0 -1
  165. package/lib/typescript/src/utils/platform.d.ts +0 -15
  166. package/lib/typescript/src/utils/platform.d.ts.map +0 -1
  167. package/lib/typescript/src/utils/session.d.ts.map +0 -1
  168. package/lib/typescript/src/utils/url.d.ts.map +0 -1
  169. package/lib/typescript/src/utils/view.d.ts.map +0 -1
  170. /package/lib/typescript/{src → commonjs/src}/collector/resource/api.d.ts +0 -0
  171. /package/lib/typescript/{src → commonjs/src}/collector/view/perf.d.ts +0 -0
  172. /package/lib/typescript/{src → commonjs/src}/plugin.d.ts +0 -0
  173. /package/lib/typescript/{src → commonjs/src}/processor/default-processor.d.ts +0 -0
  174. /package/lib/typescript/{src → commonjs/src}/types/index.d.ts +0 -0
  175. /package/lib/typescript/{src → commonjs/src}/utils/base.d.ts +0 -0
  176. /package/lib/typescript/{src → commonjs/src}/utils/url.d.ts +0 -0
  177. /package/lib/typescript/{src → commonjs/src}/utils/view.d.ts +0 -0
  178. /package/lib/typescript/{package.json → module/package.json} +0 -0
package/README.md CHANGED
@@ -1,39 +1,423 @@
1
- # rum-sdk-reactnative
1
+ # @arms/rum-reactnative
2
2
 
3
- Aliyun RUM SDK For ReactNative
3
+ 阿里云ARMS用户体验监控React Native SDK,用于在React Native应用中采集前端性能、异常及用户行为数据,并上报至ARMS控制台。
4
4
 
5
- ## Installation
5
+ ## 功能特性
6
6
 
7
+ - **API性能监控** — 自动拦截 XMLHttpRequest / fetch 请求,采集耗时、状态码等指标
8
+ - **JS错误捕获** — 自动捕获 JavaScript 运行时异常
9
+ - **控制台错误监听** — 监听 `console.error` 输出
10
+ - **链路追踪** — 支持多种传播协议的分布式链路追踪
11
+ - **页面导航追踪** — 集成 React Navigation,自动追踪页面切换
12
+ - **自定义事件上报** — 支持自定义业务数据、异常、资源、视图等事件上报
13
+ - **Session管理** — 自动管理用户会话,支持采样率和超时配置
14
+
15
+ ## 安装
7
16
 
8
17
  ```sh
9
18
  npm install @arms/rum-reactnative
10
19
  ```
11
20
 
21
+ > 自 `0.1.3` 起,SDK 内置原生持久化实现(iOS `NSUserDefaults` / Android `SharedPreferences`),不再依赖 `@react-native-async-storage/async-storage`,无需额外安装。详见下方 [存储说明](#存储说明)。
22
+
23
+ SDK 包含原生崩溃采集模块(iOS:ObjC++ + KSCrash;Android:C/C++ + CMake),安装后**必须重新构建原生工程**,否则会报 TurboModule 方法缺失:
24
+
25
+ - **iOS(bare workflow)**:`cd ios && pod install`,再在 Xcode 重新 Build。
26
+ - **Android(bare workflow)**:Gradle Sync 后重新 Build。
27
+ - **Expo**:`expo prebuild --clean` 后再 `expo run:ios` / `expo run:android`。
28
+
29
+ > **原生编译环境**:Android 需安装 NDK 与 CMake(可在 Android Studio 的 SDK Manager 中安装),iOS 需 CocoaPods(`pod install` 时自动拉取并编译 KSCrash)。由于崩溃采集模块以源码方式编译,首次构建耗时会略有增加,后续增量构建不受影响。
30
+
31
+
32
+ ## 快速开始
33
+
34
+ 在应用入口处初始化SDK:
35
+
36
+ ```ts
37
+ import armsRum from '@arms/rum-reactnative';
38
+
39
+ armsRum.init({
40
+ endpoint: '<your-endpoint>'
41
+ });
42
+ ```
43
+
44
+ > **说明**:`endpoint` 可在ARMS控制台创建应用后获取;
45
+
46
+ ## 配置项
47
+
48
+ ### 基础配置
49
+
50
+ | 配置项 | 类型 | 必填 | 默认值 | 说明 |
51
+ |-------|------|------|-------|------|
52
+ | endpoint | string | 是 | - | 数据上报地址 |
53
+ | env | string | 否 | `'prod'` | 环境:`'prod'` \| `'gray'` \| `'pre'` \| `'daily'` \| `'local'` |
54
+ | version | string | 否 | - | 应用版本号 |
55
+ | user | object | 否 | - | 用户信息配置 |
56
+ | collectors | object | 否 | - | 采集器配置 |
57
+ | tracing | boolean \| object | 否 | `false` | 链路追踪配置 |
58
+ | filters | object | 否 | - | 事件过滤配置 |
59
+ | properties | object | 否 | - | 全局自定义属性 |
60
+ | reportConfig | object | 否 | - | 上报配置 |
61
+ | sessionConfig | object | 否 | - | Session配置 |
62
+ | beforeReport | function | 否 | - | 上报前钩子函数 |
63
+ | parseViewName | function | 否 | - | 自定义解析页面名称 |
64
+ | parseResourceName | function | 否 | - | 自定义解析资源名称 |
65
+ | evaluateApi | function | 否 | - | 自定义API事件解析 |
66
+
67
+ ### user 用户配置
68
+
69
+ | 字段 | 类型 | 说明 |
70
+ |------|------|------|
71
+ | name | string | 用户名称(建议关联业务账号) |
72
+ | tags | string | 用户标签 |
73
+
74
+ > **注意**:`user.id` 由SDK自动生成并维护,不可自行设置。
75
+
76
+ ### collectors 采集器配置
77
+
78
+ | 采集器 | 类型 | 默认值 | 说明 |
79
+ |--------|------|-------|------|
80
+ | api | boolean \| object | `true` | API请求监控(XMLHttpRequest / fetch) |
81
+ | jsError | boolean \| object | `true` | JavaScript运行时错误捕获 |
82
+ | consoleError | boolean \| object | `true` | `console.error`监听 |
83
+
84
+ ### sessionConfig Session配置
85
+
86
+ | 字段 | 类型 | 默认值 | 说明 |
87
+ |------|------|-------|------|
88
+ | sampleRate | number | `1` | 采样率,范围 [0, 1],0.5 表示 50% 采样 |
89
+ | maxDuration | number | `86400000` | Session最大持续时间(毫秒),默认24小时 |
90
+ | overtime | number | `3600000` | Session超时时间(毫秒),默认1小时无活动则过期 |
91
+
92
+ ### reportConfig 上报配置
93
+
94
+ | 字段 | 类型 | 默认值 | 说明 |
95
+ |------|------|-------|------|
96
+ | flushTime | number | `3000` | 上报时间间隔(ms),范围 [0, 10000],0 表示立即上报 |
97
+ | maxEventCount | number | `20` | 单次上报最大事件数,范围 [1, 100] |
98
+
99
+ ### tracing 链路追踪
100
+
101
+ 支持布尔值开关或详细配置对象:
102
+
103
+ ```ts
104
+ tracing: {
105
+ enable: true,
106
+ sample: 0.1, // 10% 采样
107
+ propagatorTypes: ['tracecontext', 'b3'],
108
+ allowedUrls: [
109
+ { match: 'https://api.example.com/', propagatorTypes: ['tracecontext'] }
110
+ ]
111
+ }
112
+ ```
113
+
114
+ 支持的传播协议:
115
+
116
+ | 协议 | 说明 |
117
+ |------|------|
118
+ | `tracecontext` | W3C Trace Context |
119
+ | `b3` | Zipkin B3 单头传播 |
120
+ | `b3multi` | Zipkin B3 多头传播 |
121
+ | `jaeger` | Jaeger |
122
+ | `sw8` | SkyWalking |
123
+
124
+ ### filters 事件过滤
125
+
126
+ ```ts
127
+ filters: {
128
+ resource: ['https://cdn.example.com/', /localhost/i],
129
+ exception: [/^Script error/, (msg) => msg.includes('ignore')],
130
+ view: ['/internal/']
131
+ }
132
+ ```
133
+
134
+ 过滤规则支持以下类型:
135
+
136
+ | 类型 | 说明 |
137
+ |------|------|
138
+ | 字符串 | 前缀匹配,匹配到则过滤 |
139
+ | 正则表达式 | 正则匹配,匹配到则过滤 |
140
+ | 函数 | 返回 `true` 表示过滤该事件 |
141
+
142
+
143
+ ## API方法
144
+
145
+ ### armsRum.init(config)
146
+
147
+ 初始化SDK,应在应用启动时调用。调用后SDK将根据配置自动开始数据采集和上报。
148
+
149
+ ### armsRum.setConfig(key, value) / armsRum.setConfig(config)
150
+
151
+ 动态更新SDK配置。
152
+
153
+ ```ts
154
+ // 单个配置更新
155
+ armsRum.setConfig('version', '1.2.0');
156
+
157
+ // 批量配置更新
158
+ armsRum.setConfig({
159
+ version: '1.2.0',
160
+ env: 'pre',
161
+ });
162
+ ```
163
+
164
+ ### armsRum.getConfig()
165
+
166
+ 获取当前SDK配置对象。
167
+
168
+ ### 事件上报
169
+
170
+ | 方法 | 说明 |
171
+ |------|------|
172
+ | `armsRum.sendCustom(payload)` | 上报自定义业务数据 |
173
+ | `armsRum.sendException(payload \| Error)` | 上报自定义异常 |
174
+ | `armsRum.sendResource(payload)` | 上报自定义资源事件 |
175
+ | `armsRum.sendView(payload)` | 上报自定义视图事件 |
176
+ | `armsRum.sendEvent(payload)` | 上报自定义事件 |
177
+
178
+ ### 页面导航追踪
179
+
180
+ | 方法 | 说明 |
181
+ |------|------|
182
+ | `armsRum.startTrackingViews(navigationRef)` | 启动页面追踪 |
183
+ | `armsRum.stopTrackingViews()` | 停止页面追踪 |
184
+
185
+ ## 高级用法
186
+
187
+ ### React Navigation 集成
188
+
189
+ **方式一:onReady 回调模式**
190
+
191
+ ```tsx
192
+ import React, { useRef } from 'react';
193
+ import { NavigationContainer } from '@react-navigation/native';
194
+ import armsRum from '@arms/rum-reactnative';
195
+
196
+ export default function App() {
197
+ const navigationRef = useRef(null);
198
+
199
+ return (
200
+ <NavigationContainer
201
+ ref={navigationRef}
202
+ onReady={() => {
203
+ armsRum.startTrackingViews(navigationRef.current);
204
+ }}
205
+ >
206
+ {/* 路由配置 */}
207
+ </NavigationContainer>
208
+ );
209
+ }
210
+ ```
211
+
212
+ **方式二:Hook 模式(推荐)**
213
+
214
+ ```tsx
215
+ import React, { useEffect } from 'react';
216
+ import { useNavigationContainerRef } from '@react-navigation/native';
217
+ import armsRum from '@arms/rum-reactnative';
218
+
219
+ export default function App() {
220
+ const navigationContainerRef = useNavigationContainerRef();
221
+
222
+ useEffect(() => {
223
+ armsRum.startTrackingViews(navigationContainerRef.current);
224
+ }, []);
225
+
226
+ return (
227
+ <NavigationContainer ref={navigationContainerRef}>
228
+ {/* 路由配置 */}
229
+ </NavigationContainer>
230
+ );
231
+ }
232
+ ```
233
+
234
+ ## Expo 接入
235
+
236
+ SDK 提供一个零依赖的 Expo config plugin,便于在 Expo 工程中通过 `app.config` 声明 SDK 配置,避免在 JS 入口硬编码 `endpoint`。
237
+
238
+ 在 `app.config.ts` 中:
239
+
240
+ ```ts
241
+ const config = {
242
+ expo: {
243
+ plugins: [
244
+ ['@arms/rum-reactnative', { endpoint: '<your-endpoint>', env: 'prod' }],
245
+ ],
246
+ },
247
+ };
248
+ export default config;
249
+ ```
250
+
251
+ 随后照常 `expo prebuild` / EAS Build。运行时通过 `Constants.expoConfig?.extra?.rumSdk` 读取该配置:
252
+
253
+ ```ts
254
+ import { Constants } from 'expo-constants';
255
+ import armsRum from '@arms/rum-reactnative';
256
+
257
+ const cfg = (Constants.expoConfig?.extra as any)?.rumSdk;
258
+ armsRum.init({ endpoint: cfg?.endpoint, env: cfg?.env });
259
+ ```
260
+
261
+ > 即便不使用 config plugin,Expo 工程在 `npm install` 后执行 `expo prebuild --clean` 即可由 autolinking 自动接入原生模块;plugin 仅提供配置透传的便利。
262
+
263
+ ## 原生代码集成方式
264
+
265
+ SDK 的原生崩溃采集层通过**源码编译**集成,不预编译二进制随 npm 包发布:
266
+
267
+ - **iOS**:KSCrash 通过 CocoaPods 源码依赖(`s.dependency "KSCrash"`)引入,`pod install` 时自动编译。
268
+ - **Android**:`librum_crash.so` 由宿主工程 Gradle 通过 `externalNativeBuild`(CMake)在构建时编译,需 NDK / CMake(RN 工程通常已具备)。
269
+
270
+ 原生模块会在宿主工程构建时自动编译,无需额外的预编译产物或手动步骤。
271
+
272
+ ### 自定义API解析(evaluateApi)
273
+
274
+ 当默认的API事件解析逻辑不满足需求时,可通过 `evaluateApi` 自定义解析。函数接收以下参数:
275
+
276
+ - **request** — 请求信息
277
+ - **response** — 响应信息
278
+ - **error** — 错误信息
279
+ - **xhr** — 原始XHR对象
280
+
281
+ 返回值为 `IApiBaseAttr` 对象:
282
+
283
+ ```ts
284
+ armsRum.init({
285
+ endpoint: '<your-endpoint>',
286
+ evaluateApi: async (request, response, error) => {
287
+ return {
288
+ name: '/api/list',
289
+ success: error ? 0 : 1,
290
+ duration: 100,
291
+ snapshots: JSON.stringify({ params: 'page=1' }),
292
+ };
293
+ }
294
+ });
295
+ ```
296
+
297
+ ### 自定义事件上报示例
298
+
299
+ ```ts
300
+ // 自定义业务事件
301
+ armsRum.sendCustom({
302
+ name: 'order_placed',
303
+ properties: { order_id: 'ORD-12345', amount: 99.99 }
304
+ });
305
+
306
+ // 手动上报异常
307
+ try {
308
+ // 业务逻辑
309
+ } catch (error) {
310
+ armsRum.sendException(error);
311
+ }
312
+ ```
313
+
314
+ ### beforeReport 钩子
315
+
316
+ 在事件上报前进行修改或过滤:
12
317
 
13
- ## Usage
318
+ ```ts
319
+ armsRum.init({
320
+ beforeReport(event) {
321
+ // 返回修改后的event,返回 false 则丢弃该事件
322
+ return event;
323
+ }
324
+ });
325
+ ```
14
326
 
327
+ ## 完整配置示例
15
328
 
16
329
  ```ts
17
330
  import armsRum from '@arms/rum-reactnative';
18
331
 
19
332
  armsRum.init({
20
- pid: '${pid}',
21
- endpoint: '${endpoint}',
22
- // 设置环境信息,参考值:'prod' | 'gray' | 'pre' | 'daily' | 'local'
333
+ // 基础配置
334
+ endpoint: '<your-endpoint>',
23
335
  env: 'prod',
336
+ version: '1.0.0',
337
+
338
+ // 用户配置
339
+ user: {
340
+ name: 'zhangsan',
341
+ tags: 'vip',
342
+ },
343
+
344
+ // 采集器配置
24
345
  collectors: {
25
346
  api: true,
26
- // JS错误监听开关,默认开启
27
347
  jsError: true,
28
- // 控制台错误监听开关,默认开启
29
- consoleError: true
348
+ consoleError: true,
349
+ },
350
+
351
+ // 链路追踪
352
+ tracing: {
353
+ enable: true,
354
+ sample: 0.1,
355
+ propagatorTypes: ['tracecontext'],
356
+ allowedUrls: [
357
+ { match: 'https://api.example.com/', propagatorTypes: ['tracecontext'] }
358
+ ],
359
+ },
360
+
361
+ // 事件过滤
362
+ filters: {
363
+ resource: ['https://cdn.example.com/'],
364
+ exception: [/^Script error/],
30
365
  },
31
- // 链路追踪配置开关,默认关闭
32
- tracing: false,
33
- });
34
366
 
367
+ // 全局自定义属性
368
+ properties: {
369
+ channel: 'appstore',
370
+ },
371
+
372
+ // 上报配置
373
+ reportConfig: {
374
+ flushTime: 5000,
375
+ maxEventCount: 30,
376
+ },
377
+
378
+ // Session配置
379
+ sessionConfig: {
380
+ sampleRate: 1,
381
+ maxDuration: 86400000,
382
+ overtime: 3600000,
383
+ },
384
+
385
+ // 上报前钩子
386
+ beforeReport(event) {
387
+ return event;
388
+ },
389
+ });
35
390
  ```
36
391
 
37
- ## Help
38
- https://help.aliyun.com/zh/arms/user-experience-monitoring/
392
+ ## 存储说明
393
+
394
+ SDK 仅持久化一个键 `_arms_uid`(匿名用户 UID),用于跨冷启动保持 UV 稳定。底层采用各平台原生轻量级 KV 存储:
395
+
396
+ | 平台 | 实现 | 命名空间 |
397
+ |------|------|----------|
398
+ | iOS | `NSUserDefaults`(独立 suite) | `com.aliyun.arms.rum.reactnative` |
399
+ | Android | `SharedPreferences`(独立 prefs 文件) | `com.aliyun.arms.rum.reactnative` |
400
+
401
+ ### 原生存储 API
402
+
403
+ 原生模块提供以下能力(全部为异步 Promise,且仅作用于上表的独立命名空间,不会读写宿主 App 的偏好数据):
404
+
405
+ | 方法 | 返回 | 说明 |
406
+ |------|------|------|
407
+ | `getItem(key)` | `Promise<string \| null>` | 读取字符串值,不存在返回 `null` |
408
+ | `setItem(key, value)` | `Promise<void>` | 写入字符串值 |
409
+ | `removeItem(key)` | `Promise<void>` | 删除指定 key |
410
+ | `clear()` | `Promise<void>` | 清空 SDK 命名空间下的所有 key |
411
+ | `getAllKeys()` | `Promise<string[]>` | 列出 SDK 命名空间下的所有 key |
412
+
413
+ > 该原生模块主要服务于 SDK 内部,不属于公开 API;如有定制场景需要直接调用,可从 `@arms/rum-reactnative` 内部模块引入,**未来版本可能调整签名**。
414
+
415
+ ### 升级 / 接入注意事项
416
+
417
+ 1. **必须重新构建原生工程**:新增了 TurboModule 方法,升级或首次接入后需要重新执行 iOS 的 `pod install`、Android 的 Gradle Sync;Expo 工程请执行 `expo prebuild --clean` 后再编译,否则会报 protocol method 缺失。
418
+ 2. **隔离命名空间,不污染宿主 App**:iOS 走独立 `NSUserDefaults` suite、Android 走独立 prefs 文件,与宿主 App 自身的偏好数据互不干扰;用户卸载 / 抹机时会一并清除。
419
+ 3. **从旧版本(依赖 AsyncStorage)升级会重置一次 UID**:原 AsyncStorage 中的 `_arms_uid` 不会自动迁移到新存储,老用户首次升级后会被分配新 UID(仅影响一次 UV 统计的连续性,不影响功能与后续使用)。如对历史 UID 连续性有强诉求,请提 issue。
420
+
421
+ ## 相关文档
39
422
 
423
+ - [ARMS用户体验监控文档](https://help.aliyun.com/zh/arms/user-experience-monitoring/)
@@ -0,0 +1,28 @@
1
+ require "json"
2
+
3
+ package = JSON.parse(File.read(File.join(__dir__, "package.json")))
4
+
5
+ Pod::Spec.new do |s|
6
+ s.name = "RumSdkReactnative"
7
+ s.version = package["version"]
8
+ s.summary = package["description"]
9
+ s.homepage = package["homepage"]
10
+ s.license = package["license"]
11
+ s.authors = package["author"]
12
+
13
+ s.platforms = { :ios => min_ios_version_supported }
14
+ s.source = { :git => "https://code.alibaba-inc.com/aliyun-rum/rum-sdk-reactnative.git", :tag => "#{s.version}" }
15
+
16
+ s.source_files = "ios/**/*.{h,m,mm,c,cpp}"
17
+ s.private_header_files = "ios/**/*.h"
18
+
19
+ s.resource_bundles = {
20
+ "RumSdkReactnativePrivacy" => ["ios/PrivacyInfo.xcprivacy"]
21
+ }
22
+
23
+ # KSCrash 通过 CocoaPods 源码依赖引入。KSCrash 不发布官方 XCFramework,
24
+ # 故不自行预编译,直接由宿主工程 `pod install` 时源码编译。
25
+ s.dependency "KSCrash", "~> 2.0"
26
+
27
+ install_modules_dependencies(s)
28
+ end
@@ -0,0 +1,83 @@
1
+ ext.getExtOrDefault = {name ->
2
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties['RumSdkReactnative_' + name]
3
+ }
4
+
5
+ apply plugin: "com.android.library"
6
+ apply plugin: "kotlin-android"
7
+
8
+ apply plugin: "com.facebook.react"
9
+
10
+ def getExtOrIntegerDefault(name) {
11
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties["RumSdkReactnative_" + name]).toInteger()
12
+ }
13
+
14
+ android {
15
+ namespace "com.rumsdkreactnative"
16
+
17
+ compileSdkVersion getExtOrIntegerDefault("compileSdkVersion")
18
+
19
+ defaultConfig {
20
+ minSdkVersion getExtOrIntegerDefault("minSdkVersion")
21
+ targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
22
+
23
+ ndk {
24
+ abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
25
+ }
26
+
27
+ // librum_crash.so 由宿主工程构建时通过 CMake 源码编译,不预编译随 npm 包发布。
28
+ // 显式指定 c++_shared STL:rum_test_crash.cpp 使用 C++ 异常(<stdexcept>),
29
+ // 精简的 system STL 不支持。RN 工程本身即依赖 c++_shared。
30
+ externalNativeBuild {
31
+ cmake {
32
+ cFlags "-fno-omit-frame-pointer", "-Wno-format"
33
+ arguments "-DANDROID_STL=c++_shared"
34
+ }
35
+ }
36
+ }
37
+
38
+ externalNativeBuild {
39
+ cmake {
40
+ path "src/main/jni/CMakeLists.txt"
41
+ }
42
+ }
43
+
44
+ buildFeatures {
45
+ buildConfig true
46
+ }
47
+
48
+ buildTypes {
49
+ release {
50
+ minifyEnabled false
51
+ }
52
+ }
53
+
54
+ lintOptions {
55
+ disable "GradleCompatible"
56
+ }
57
+
58
+ compileOptions {
59
+ sourceCompatibility JavaVersion.VERSION_1_8
60
+ targetCompatibility JavaVersion.VERSION_1_8
61
+ }
62
+
63
+ sourceSets {
64
+ main {
65
+ java.srcDirs += [
66
+ "generated/java",
67
+ "generated/jni"
68
+ ]
69
+ }
70
+ }
71
+ }
72
+
73
+ repositories {
74
+ mavenCentral()
75
+ google()
76
+ }
77
+
78
+ def kotlin_version = getExtOrDefault("kotlinVersion")
79
+
80
+ dependencies {
81
+ implementation "com.facebook.react:react-android"
82
+ implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
83
+ }
@@ -0,0 +1,6 @@
1
+ RumSdkReactnative_kotlinVersion=2.0.21
2
+ RumSdkReactnative_minSdkVersion=24
3
+ RumSdkReactnative_targetSdkVersion=34
4
+ RumSdkReactnative_compileSdkVersion=35
5
+ # NDK 版本由宿主 App 决定;SDK 自身不强制特定 NDK,使用宿主已安装的版本即可。
6
+
@@ -0,0 +1,13 @@
1
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android">
2
+ <application>
3
+ <!--
4
+ 崩溃处理器自启动:通过 ContentProvider 在 Application.onCreate() 之前安装
5
+ Thread.UncaughtExceptionHandler,无需宿主 App 显式调用 SDK 初始化方法。
6
+ -->
7
+ <provider
8
+ android:name="com.rumsdkreactnative.crash.CrashInitProvider"
9
+ android:authorities="${applicationId}.rum-crash-init"
10
+ android:exported="false"
11
+ android:initOrder="100" />
12
+ </application>
13
+ </manifest>