跳转到主要内容
本文介绍 HarmonyOS SDK 的核心配置、RUM 配置、隐私控制、Trace 关联、崩溃采集和符号上传。所有配置均来自当前 ArkTS SDK 公开 API。

核心配置

核心配置通过 ConfigurationBuilder 创建,并传给 Flashcat.initialize()
import {
  ConfigurationBuilder,
  FlashcatSite
} from '@flashcatcloud/core';

const config = new ConfigurationBuilder('<CLIENT_TOKEN>', 'production')
  .setService('shopping-app')
  .setVariant('default')
  .useSite(FlashcatSite.CN)
  .setBatchUploadFrequencyMs(5000)
  .build();
方法 / 参数类型默认值说明
new ConfigurationBuilder(clientToken, env)string, string必填clientToken 用于客户端上报鉴权;env 表示环境名称
setService(service)string应用 bundle id服务名称,写入 RUM 事件的 service 字段
setVariant(variant)string""构建变体名称,用于区分不同产物
useSite(site)FlashcatSiteFlashcatSite.CN数据接收站点;生产环境使用 https://browser.flashcat.cloud
setCustomEndpoint(endpoint)string""覆盖上报 host,常用于本地代理或私有化转发;SDK 仍会追加 /api/v2/rum
setBatchUploadFrequencyMs(frequencyMs)number5000前台批量上报调度间隔,单位为毫秒
setVerbose(enabled)booleanfalse输出 SDK 内部 HiLog,日志标签为 Flashcat
Flashcat.initialize() 同一个实例名只会初始化一次。重复初始化会返回已存在实例,不会重新注册功能模块。

隐私同意状态

初始化时需要传入 TrackingConsent。你也可以在运行时通过 Flashcat.setTrackingConsent() 修改。
import { Flashcat, TrackingConsent } from '@flashcatcloud/core';

Flashcat.setTrackingConsent(TrackingConsent.PENDING);
Flashcat.setTrackingConsent(TrackingConsent.GRANTED);
状态行为
GRANTED写入主上传目录并启动批量上传
PENDING事件写入单独的 pending 缓冲区,不上传;变更为 GRANTED 后迁移并上传
NOT_GRANTED丢弃新事件,清空 pending 缓冲区并停止上传
Trace header 也受同意状态控制。只有状态为 GRANTED 时,SDK 才会向请求注入可关联的 traceparenttracestate

RUM 配置

RUM 配置通过 RumConfigurationBuilder 创建,并传给 FlashcatRum.enable()
import {
  FlashcatRum,
  RumConfigurationBuilder
} from '@flashcatcloud/rum';

FlashcatRum.enable(
  new RumConfigurationBuilder('<APPLICATION_ID>')
    .setSessionSampleRate(50)
    .setTrackUserInteractions(true)
    .setTrackNavigation(true)
    .setTrackNetworkRequests(true)
    .build()
);
方法 / 参数类型默认值说明
new RumConfigurationBuilder(applicationId)string必填RUM 应用 ID,写入 application.id
setSessionSampleRate(rate)number100会话采样率,取值范围按百分比理解;100 表示全部采集,0 表示不采集事件
setTrackUserInteractions(enabled)booleanfalse控制 FlashcatRum.trackTap() 是否记录 tap action
setTrackNavigation(enabled)booleanfalse控制 FlashcatRum.startViewTracking() 是否注册 ArkUI routerPageUpdate 监听
setTrackNetworkRequests(enabled)booleanfalse控制 Trace 发布的网络生命周期是否转换为 RUM resource
setTrackFrustrations(enabled)booleanfalse保留开关;当前版本尚未生成 frustration 事件
setEventMapper(mapper)functionnull在事件写入磁盘前修改或丢弃 view、action、error、resource 事件

事件过滤和脱敏

setEventMapper() 可以在事件上报前做轻量处理。返回修改后的事件表示继续上报,返回 null 表示丢弃事件。
import { RumConfigurationBuilder } from '@flashcatcloud/rum';

const rumConfig = new RumConfigurationBuilder('<APPLICATION_ID>')
  .setEventMapper((event) => {
    if (event.type === 'resource') {
      const resource = event.resource as Record<string, Object>;
      const url = resource.url;
      if (typeof url === 'string') {
        resource.url = url.split('?')[0];
      }
    }

    if (event.type === 'action') {
      const action = event.action as Record<string, Object>;
      const target = action.target as Record<string, Object>;
      if (String(target.name).includes('secret')) {
        return null;
      }
    }

    return event;
  })
  .build();
事件过滤函数运行在 SDK 写入路径上,应保持快速、同步且不抛异常。SDK 会兜底处理异常并保留原始事件,但复杂逻辑会增加端侧开销。

全局属性和用户信息

全局属性会合并到后续事件的 context 对象中。
import {
  GlobalRumMonitor,
  RumErrorSource
} from '@flashcatcloud/rum';

const monitor = GlobalRumMonitor.get();

monitor.addAttribute('tenant', 'acme');
monitor.addError('checkout failed', RumErrorSource.CUSTOM);
monitor.removeAttribute('tenant');
用户信息通过核心实例设置。idnameemail 会写入后续事件的 usr 对象。
import { Flashcat } from '@flashcatcloud/core';

Flashcat.getInstance().setUserInfo({
  id: 'user-1001',
  name: 'Alice',
  email: 'alice@example.com'
});
当前 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
import {
  FlashcatTrace,
  TraceConfigurationBuilder
} from '@flashcatcloud/trace';

FlashcatTrace.enable(
  new TraceConfigurationBuilder()
    .setSampleRate(100)
    .setFirstPartyHosts(['api.example.com'])
    .build()
);
方法类型默认值说明
setSampleRate(rate)number100控制 traceparent flags 和 tracestate 中 sampled 标记的比例
setFirstPartyHosts(hosts)string[][]限制 FlashcatHttp 只向指定一方域名及其子域名注入 Trace header;空数组表示所有 host
当前 setFirstPartyHosts() 只由 FlashcatHttp 包装器使用。rcp 拦截器本身就是每个 session 的显式接入点,因此添加拦截器的 session 会对其请求注入 Trace header。请求已带有 traceparent 时,SDK 不会覆盖已有 Trace 上下文;已有 tracestate 会保留其他 vendor,并把更新后的 dd= 成员放在最前。

崩溃采集配置

Crash 模块通过 HarmonyOS hiAppEvent 监听 APP_CRASHAPP_FREEZE。系统会在下一次启动时回放故障事件,SDK 再通过 RUM error 管道上报。
import {
  FlashcatCrash,
  CrashConfigurationBuilder
} from '@flashcatcloud/crash';

FlashcatCrash.enable(
  new CrashConfigurationBuilder()
    .setTrackCrashes(true)
    .setTrackAppHangs(true)
    .setSampleRate(100)
    .build()
);
方法类型默认值说明
setTrackCrashes(enabled)booleantrue采集 ArkTS / JS 和 Native C/C++ 崩溃
setTrackAppHangs(enabled)booleantrue采集 APP_FREEZE,即主线程卡死或 watchdog 超时
setSampleRate(rate)number100崩溃和卡死事件采样率,SDK 会将输入值限制在 0100
请在 Flashcat.initialize()FlashcatRum.enable() 之后尽早启用 Crash。Crash 事件通过 RUM feature 写入,如果未启用 RUM,Crash 模块会丢弃收到的崩溃回放。

后台和延迟上传

SDK 默认在前台按 setBatchUploadFrequencyMs() 的间隔上传,并在应用进入后台时触发 flush()。如果需要由 HarmonyOS WorkScheduler 唤醒上传,可以注册延迟上传任务。
const config = new ConfigurationBuilder('<CLIENT_TOKEN>', 'production')
  .setDeferredUploadWork('FlashcatUploadAbility', 71001)
  .setUploadOnWifiOnly(true)
  .setDeferredUploadRequiresCharging(false)
  .build();
方法默认值说明
setDeferredUploadWork(abilityName, workId?)未启用,workId 默认为 71001注册系统 WorkScheduler 任务;宿主应用需要声明对应的 WorkSchedulerExtensionAbility
setUploadOnWifiOnly(enabled)false为延迟上传任务设置 Wi-Fi 网络限制
setDeferredUploadRequiresCharging(enabled)true为延迟上传任务设置充电状态限制
SDK 负责注册 WorkScheduler 任务;你的 WorkSchedulerExtensionAbility 被唤醒后,应调用 Flashcat.flushAndWait() 执行有界批量上传。

上传 HarmonyOS 崩溃符号

如需在控制台还原混淆后的 ArkTS 栈和 Native .so 栈,请使用 @flashcatcloud/hvigor-plugin 上传构建产物。 该插件会上传两类文件:
类型文件用途
ArkTS SourcemapsourceMaps.map,可选 nameCache.json还原 ArkTS / TS 文件、函数、行列号
Native 符号未 strip 的 .so 文件根据 GNU build-id 解析 C/C++ 栈帧
该插件以 npm 包发布(在 npm,不在 ohpm),作为构建期开发依赖安装到工程根目录的 package.json,而不是 oh-package.json5
npm install -D @flashcatcloud/hvigor-plugin
然后在模块的 hvigorfile.ts 中注册插件:
hvigorfile.ts
import { hapTasks } from '@ohos/hvigor-ohos-plugin';
import { flashcatSymbolUploadPlugin } from '@flashcatcloud/hvigor-plugin';

export default {
  system: hapTasks,
  plugins: [
    flashcatSymbolUploadPlugin({
      endpoint: 'https://browser.flashcat.cloud',
      apiKey: process.env.FLASHCAT_API_KEY ?? '',
      service: 'shopping-app',
      version: '1.0.0',
      enabled: process.env.FLASHCAT_UPLOAD === '1'
    })
  ]
};
flashcatSymbolUploadPlugin() 还接受两个可选参数:buildDir(构建产物目录,默认 build/default)和 pluginVersion(写入上传请求头 DD-EVP-ORIGIN-VERSION 的版本号,默认 0.1.0)。一般无需设置。
发布构建后执行上传任务:
FLASHCAT_UPLOAD=1 FLASHCAT_API_KEY=*** \
  hvigorw uploadFlashcatSymbols --mode module -p module=entry@default -p product=default
插件会向 {endpoint}/sourcemap/upload 发送 multipart/form-data
Header
DD-API-KEYFlashduty API Key,用于解析账号
DD-EVP-ORIGINflashcat-hvigor-plugin
DD-EVP-ORIGIN-VERSION插件版本
上传事件类型:
事件类型表单字段
harmony_sourcemapeventsource_map、可选 name_cache
harmony_symbol_fileeventsymbol_file
Native 符号依赖 .so 的 GNU build-id。HarmonyOS NDK 默认会生成 build-id;如果你的构建链路关闭了该能力,请为 .so 增加 -Wl,--build-id