4. 链路数据流设计:从主线程卡顿到ANR上报的完整数据流图

本章正式定义数据边界,明确每个参与组件在生产、消费、转换数据时的信任边界。只有将“主线程卡顿”这一物理现象,经过分层抽象,最终变成可上报的 ANRReportItem,才能确保链路可观测、可回溯。

4.1 数据流全景

整个数据流分为4层:采样层 → 聚合层 → 判定层 → 上报层。每层只与其相邻层发生数据交换,不允许跨层直接访问。下图展示了完整数据流路径:

数据流图:主线程卡顿 → ANR上报 主线程运行统计 信号源轮询 堆栈采样器 实时采样缓存 SignalHandler 卡顿聚合器 ANR触发判定 ANRRuleStore 数据加工管道 ANR上报Payload 信任链路起点 信号源轮询→实时采样缓存 第一次数据校验 数据聚合边界 SignalHandler 写入缓存 聚合器读取 → 去重 数据完整性校验点 ANR触发判定 → ANRRuleStore 校验规则 采集层 聚合层 判定层 上报层

4.2 参与组件与数据边界

组件所属层数据边界(输入→输出)信任等级
主线程运行统计采集层逐帧耗时 → 帧率波动曲线T1 (直接测量)
信号源轮询采集层Signal 事件 → 原始 Log / TraceT1 (系统级)
堆栈采样器采集层线程快照 → StackFrame[]T1 (原生级)
实时采样缓存聚合层原始数据块 → 时间窗口切片T2 (校验后)
SignalHandler聚合层信号捕获 → 结构化消息T2 (边界转换)
卡顿聚合器判定层切片列表 → 卡顿SegmentT3 (关联分析)
ANR触发判定判定层Segment + Rule → 判定结果T3 (决策级)
ANRRuleStore判定层远端规则 → 本地规则快照T2 (校验后)
数据加工管道上报层判定结果 → ReportItemT3 (输出级)
ANR上报Payload上报层ReportItem → JSON/ProtobufT4 (序列化)
信任链路设计要点:从采集层到上报层,每经过一次边界转换,都进行一次数据校验。信号源轮询与实时采样缓存之间的“第一次数据校验”是整个链路的信任起点——一旦原始数据被错误丢弃,后续所有分析都不可靠。

4.3 逐层详解:数据转换与关键指标

4.3.1 采集层 → 聚合层:原始信号切片

采集层只负责记录,聚合层负责初步清洗与窗口化。SignalHandler 收到 SIGQUIT 信号后,立即将当前线程堆栈写入 实时采样缓存。缓存采用环形缓冲区,只保留最近 30 秒的数据。

// 聚合层消费接口示意(非完整代码)
sig_atomic_t stack_seq_id = 0;
void on_signal_received(int sig) {
    // 采集层与聚合层的信任边界:原子递增 ID + 时间戳
    stack_snapshot_t snap;
    snap.seq = __sync_fetch_and_add(&stack_seq_id, 1);
    snap.ts_ns = get_monotonic_ns();
    collect_stack_trace(&snap.frames);
    ring_buffer_push(&g_ring_buf, &snap);
}

4.3.2 聚合层 → 判定层:构建卡顿特征

卡顿聚合器以 500ms 时间窗口为粒度,将缓存中的堆栈切片按照 seq 排序,合并为 LagSegment,包含:

  • 起始时间与结束时间
  • 堆栈出现频次 Top-N
  • CPU 等待占比(通过 SignalHandler 记录的 CPU 时间戳计算)
字段类型来源边界校验
window_start_nsint64环形缓冲区头部时间戳须小于 window_end_ns
window_end_nsint64当前聚合时刻 - 1ms距今不超过 60s
top_stack_hashuint32[]堆栈采样器 + 去重去重后长度 ≥ 1
frame_drop_ratefloat主线程运行统计0.0 ~ 1.0
signal_countintSignalHandler 计数≥ 0

4.3.3 判定层 → 上报层:规则匹配与序列化

ANR触发判定将 LagSegment 与 ANRRuleStore 中的规则逐条比较。一旦命中规则,立即生成 AnrTriggerEvent,传递给数据加工管道。

// 规则片段示例(JSON 格式)
{
  "rule_id": "anr_rule_004",
  "conditions": {
    "frame_drop_rate": { "gt": 0.8 },
    "signal_count":   { "gte": 3 },
    "top_stack":      { "contains": "android.app.ActivityThread" }
  },
  "probability_threshold": 0.85,
  "expire_at_ms": 1710000000000
}
风险点:规则冷启动 在 App 首次启动时,ANRRuleStore 可能尚未拉取远端规则。此时应使用内置安全规则作为兜底,避免因规则缺失导致 ANR 无法识别。

4.4 数据流完整性校验点

  • P1 – 信号源轮询→实时采样缓存:校验堆栈序列 seq 是否连续,不连续则标记数据缺失。
  • P2 – SignalHandler→卡顿聚合器:校验时间戳单调递增,超过 2 秒的 gap 必包含系统 ANR 通知。
  • P3 – 判定层输出:ANR触发判定发出事件后,必须等待数据加工管道返回 ACK,否则重试一次。

4.5 本章小结

数据流设计明确了4层3界2校验的规律。每层只关心自己边界的输入与输出,出借权限被严格限制。信任链路从“信号源轮询”开始,到“ANR上报Payload”结束,中间任何一次边界转换都附带数据校验,确保即使原始信号存在噪声,也能在聚合层和判定层被甄别出来。