Skip to main content
本文介绍 HarmonyOS SDK 的核心配置、RUM 配置、隐私控制、Trace 关联、崩溃采集和符号上传。所有配置均来自当前 ArkTS SDK 公开 API。

核心配置

核心配置通过 ConfigurationBuilder 创建,并传给 Flashcat.initialize()
Flashcat.initialize() 同一个实例名只会初始化一次。重复初始化会返回已存在实例,不会重新注册功能模块。

用户跟踪同意

为遵守 GDPR、CCPA 等隐私法规,SDK 要求在初始化时设置用户跟踪同意状态(Flashcat.initialize() 的第三个参数),并可在初始化后随时变更。

同意状态说明

如果初始化时使用 TrackingConsent.PENDING,SDK 会将事件写入单独的本地缓冲区,但在同意状态更改为 GRANTED 之前不会发送;变更为 GRANTED 后缓冲数据自动迁移并上传,变更为 NOT_GRANTED 则清空缓冲。

应用是同意状态的唯一权威

每次启动都以你传给 Flashcat.initialize 的值为准。 SDK 不会用历史状态覆盖它——这一点与 Android、iOS SDK 完全一致。你的应用负责保存用户的选择,并在每次初始化时传回给 SDK。
如果你的应用在每次启动时都用固定值(例如 GRANTED)初始化 SDK,那么用户撤销授权后重启,采集会重新开启。请在用户做出选择的那一刻调用 setTrackingConsent,并把该选择保存下来、下次启动时传给 initialize
同意状态同时会被持久化到本地,但只服务于一个用途:后台上传使用的 WorkSchedulerExtensionAbility 是独立进程,它面前没有用户、也拿不到应用的判断,只能读取主进程最后一次记录的决定。详见后台和延迟上传 撤销授权时(变更为 NOT_GRANTED),SDK 不仅清空未发送的 pre-consent 缓冲区,还会删除已经落盘、尚未上传的批次。0.2.0 及更早版本只清空缓冲区,已采集批次仍会在恢复授权后发出。 0.3.2 起,撤销授权还会删除用于崩溃归因的本地 view 快照。该快照是一份完整的 view 事件,包含用户 ID、姓名、邮箱和自定义上下文,与已采集批次同样敏感。

设置与更改同意状态

初始化时设置:
初始化后通过 setTrackingConsent API 更改(例如用户在隐私弹窗中做出选择后):
Trace header 也受同意状态控制。只有状态为 GRANTED 时,SDK 才会向请求注入可关联的 traceparenttracestate

RUM 配置

RUM 配置通过 RumConfigurationBuilder 创建,并传给 FlashcatRum.enable()
setTrackErrors(false) 只关闭自动错误采集。崩溃不受影响:启用 Crash 模块后,未捕获异常仍按 JsCrashPolicy 持久化、计数,并作为 is_crash error 回放到崩溃发生的那个会话;手动调用的 addError 属于应用的显式意图,同样照常上报。如需连这两类一起过滤,请使用 setEventMapper()

事件过滤和脱敏

setEventMapper() 可以在事件上报前做轻量处理。返回修改后的事件表示继续上报,返回 null 表示丢弃事件。
事件过滤函数运行在 SDK 写入路径上,应保持快速、同步且不抛异常。SDK 会兜底处理异常并保留原始事件,但复杂逻辑会增加端侧开销。

全局属性和用户信息

全局属性会合并到后续事件的 context 对象中。
用户退出登录时,建议先 clearAttributes() 清掉上一位用户的业务属性,再 stopSession() 结束会话,避免两位用户的行为落在同一个会话里。
用户信息通过核心实例设置。idnameemail 会写入后续事件的 usr 对象。
当前 setUserInfo() 仅用于设置 idnameemail。服务端不接收其他用户字段;如需上报业务维度,请使用 RUM 全局属性或单事件属性写入 context

Trace 配置

Trace 模块负责生成 W3C traceparenttracestate,并把生成的 trace id 和 span id 关联到 RUM resource 的 _dd.trace_id_dd.span_id 字段。tracestate 会携带 Datadog vendor entry:dd=s:{0|1};o:rum
当前 setFirstPartyHosts() 只由 FlashcatHttp 包装器使用。rcp 拦截器本身就是每个 session 的显式接入点,因此添加拦截器的 session 会对其请求注入 Trace header。请求已带有 traceparent 时,SDK 不会覆盖已有 Trace 上下文;已有 tracestate 会保留其他 vendor,并把更新后的 dd= 成员放在最前。

崩溃采集配置

Crash 模块提供两条采集路径:
  • 通过 HarmonyOS hiAppEvent 监听 APP_CRASHAPP_FREEZE,在后续启动时通过 RUM error 管道上报系统回放的故障事件
  • 实时处理主线程上未捕获的 ArkTS 异常,根据 JsCrashPolicy 在进程退出或重启前完成上报
默认的 JS 崩溃策略是 REPORT_THEN_EXIT
0.2.0 开始,默认策略由旧版的进程存活行为改为 REPORT_THEN_EXIT。仅初始化旧版 SDK 会在未捕获 ArkTS 异常后抑制宿主应用退出,使应用在业务状态未定义的情况下继续运行。新默认行为会同步保存崩溃并恢复平台退出语义。如需恢复旧行为,请显式设置 JsCrashPolicy.OBSERVE_ONLY,并确认保留受损进程符合你的业务预期。

REPORT_THEN_EXIT

这是默认策略。发生主线程上未捕获的同步或异步 ArkTS 异常时,SDK 会同步持久化崩溃记录、刷新当前 RUM 写入器,然后退出进程。记录会在下一次启动时回放到 RUM。如果同步写入失败,SDK 会尝试异步上报并仍然退出。

REPORT_AND_RECOVER

SDK 会同步持久化崩溃记录,检查持久化的崩溃循环保护,然后调用 appRecovery.saveAppState()restartApp()。旧进程退出并启动新进程,下一次启动回放的记录会带有 crash.recovered: true 如果无法启用恢复、无法持久化循环记录、保护被触发、无法把记录标记为可恢复,或重启请求失败,SDK 会降级为退出。

OBSERVE_ONLY

SDK 会异步上报异常并让当前进程继续运行。该策略恢复 0.2.0 之前的存活行为,不会退出或重启进程。事件循环可能仍能响应,但未捕获异常可能已经使应用处于损坏或不一致的业务状态。

崩溃循环保护

循环保护仅影响 REPORT_AND_RECOVER。默认配置下,60 秒滚动窗口内前两次崩溃可以重启,第三次崩溃会同步上报但降级为退出,即窗口内第 N 次崩溃禁止重启,最多允许 N-1 次恢复重启。 崩溃时间戳会跨进程持久化,应用重启不会重置保护。保护触发后,每次被阻止的崩溃都会成为最新时间戳;应用需要保持完整的 5 分钟无崩溃冷却期,记录才会重置。将 setCrashLoopThreshold(1) 设为 1 会完全禁用恢复重启:每次崩溃仍同步上报,但都会退出,也不会标记 crash.recovered

恢复宿主应用状态

自动重启不会自行定义需要恢复的页面状态。宿主 UIAbility 需要实现 onSaveState,把需要的状态写入 wantParam,并返回 ALL_AGREE
宿主应用需要在恢复启动的 Want 中读取这些参数,并且只恢复可以安全继续的状态。状态恢复依赖宿主实现 onSaveState,SDK 负责在崩溃时触发状态保存和重启。

能力边界

请在 Flashcat.initialize() 后尽早启用 RUM 和 Crash。JS 崩溃策略的传递不依赖启用顺序:Crash 会把策略推送给 RUM,RUM 启动时也会主动读取策略,因此先启用任一模块都能激活策略。仍建议先调用 FlashcatRum.enable(),再调用 FlashcatCrash.enable(),以便立即回放上一次启动留下的待处理崩溃记录。Crash 事件需要通过 RUM 管道发布。

后台和延迟上传

SDK 默认在前台按 setBatchUploadFrequencyMs() 的间隔上传,并在应用进入后台时触发 flush()。如果需要由 HarmonyOS WorkScheduler 唤醒上传,可以注册延迟上传任务。
SDK 负责注册 WorkScheduler 任务。任务是持久化的(isPersisted,跨重启存活),按 2 小时周期唤醒。

在扩展进程中初始化

WorkSchedulerExtensionAbility独立进程,不共享主进程的 SDK 实例。被唤醒后必须先用 initializeForDeferredUpload 初始化,再调用 flushAndWait()
MyUploadExtensionAbility.ets
initializeForDeferredUploadinitialize 有两点关键差别:
  • 不接收同意状态参数。 扩展进程面前没有用户,只能依据主进程最后一次持久化的决定行事;没有持久化记录(主进程从未初始化过)或记录为 NOT_GRANTED 时,它不读取、不迁移、也不上传任何数据。
  • 只读。 它不会写回同意状态、设备标识或任务注册信息。HarmonyOS Preferences 是按进程的整文件缓存,扩展进程的写入可能覆盖主进程正在进行的撤销操作。
不要在扩展进程里调用 Flashcat.initialize()。它会用你传入的字面值覆盖持久化的同意状态,从而在用户已经撤销授权后仍然上传数据。setTrackingConsent 在扩展进程中也会被忽略并打印错误日志。

上传 HarmonyOS 崩溃符号

如需在控制台还原混淆后的 ArkTS 栈和 Native .so 栈,请使用 @flashcatcloud/hvigor-plugin 上传构建产物。 该插件会上传两类文件: 该插件以 npm 包发布(在 npm,不在 ohpm),作为构建期开发依赖安装到工程根目录的 package.json,而不是 oh-package.json5
然后在模块的 hvigorfile.ts 中注册插件:
hvigorfile.ts
公有云省略 endpoint 时,hvigor-plugin ≥ 0.1.3 默认上传到 https://ci.flashcat.cloud不是 RUM 上报用的 browser.flashcat.cloud)。私有化部署请设置环境变量 FLASHCAT_SOURCEMAP_INTAKE_URL(协议 + 域名,不带路径;同样需要 ≥ 0.1.3),或传 endpoint: 'https://rum.example.com'。旧版 0.1.2 不认 FLASHCAT_SOURCEMAP_INTAKE_URL,可显式写 endpoint,或设置旧环境变量 FLASHCAT_ENDPOINT(0.1.3 起弃用,但仍生效)。flashcatSymbolUploadPlugin() 还接受两个可选参数:buildDir(构建产物目录,默认 build/default)和 pluginVersion(写入上传请求头 DD-EVP-ORIGIN-VERSION 的版本号,默认与插件版本一致)。一般无需设置。
发布构建后执行上传任务:
插件会向 {endpoint}/sourcemap/upload 发送 multipart/form-data 上传事件类型:
Native 符号依赖 .so 的 GNU build-id。HarmonyOS NDK 默认会生成 build-id;如果你的构建链路关闭了该能力,请为 .so 增加 -Wl,--build-id