Skip to content

P2 Startup Mach Clock Bridge v1 修订方案

修订结论

ActivityTrace 与 CoreProfile 虽可在同一 pymobiledevice3 DvtProvider 打开不同 DTX channel,但 iOS 17 真机同窗探针显示两个 trace tap 会争用设备侧 trace 会话:单 provider 与双 provider 均为 ActivityTrace 有回包、CoreProfile 0 条;CoreProfile 单源对照可解码 401,517 条记录。因此 ActivityTrace 不进入实时 StartupTiming 链,也不为它增加第二个 DTX owner。

本批改用 Fixture 直接记录 mach_absolute_time() 原始 tick。Fixture 停止后再通过 House Arrest 读取 marker 文件,与 CoreProfile KDebug 的 machTicks 在同一 Mach absolute 时间轴上审计。该能力只用于可控 Fixture 校准,不进入任意被测 App 的产品依赖。

数据流

text
受控 Fixture 启动
  ├─ CoreProfile(唯一 DTX owner)→ KDebug machTicks + timeConfig
  └─ Fixture 公开生命周期回调 → mach_absolute_time + mach_timebase_info → 沙箱 JSONL

采集停止
  └─ House Arrest 顺序读取 JSONL → SHA-256 → startup-clock-bridge-report.json

House Arrest 在 CoreProfile 停止后使用,不与 DTX trace 会话并发。产品测试普通 App 时不读取其容器。

门禁

  1. Fixture marker 必须有 phaseedgemachAbsoluteTicksmachNumermachDenom、注入延迟与单调序号。
  2. marker 与 CoreProfile numer/denom 必须相等且合法;同 phase 必须唯一 begin/end、严格递增、耗时非负。
  3. marker 时间窗必须落入 CoreProfile 解码记录的最小/最大 Mach tick 窗口;跨 generation、重连或时间倒退即失败。
  4. markerDurationMs 与注入延迟误差不超过 max(5 ms, injectedDelayMs × 5%),先证明 Fixture 本身执行正确。
  5. 语义因果门禁仍使用 control/delayed 各至少 3 次、max(20 ms, injectedDelayMs × 20%);只有完整 CoreProfile Span 可进入审计。
  6. 任何缺失保持 null/—,不以 0 补值;本批不根据邻近事件直接命名 fingerprint。

实施

  1. Fixture 生命周期 marker 追加 Mach tick JSONL,启动第一条 marker 前原子清空旧文件。
  2. run-startup-evidence.py 在 trace 结束后顺序读取 marker 文件,写入本地证据并计算 SHA-256。
  3. 新增纯函数 startup_clock_bridge:验证 schema、时间基、配对、窗口与 marker 注入误差,输出 fail-closed 报告。
  4. Python 测试覆盖正常、缺失、时间基变化、旧文件污染、逆序与窗口外;Fixture/站点构建通过。
  5. iOS 17/18 各做短 Session;若同钟门禁通过,再重跑 control/will/did 各至少 3 次并复算 Semantic Evidence。

回滚

删除 Fixture marker 文件写入与离线桥接工具即可;Collector Core 产品链、唯一 DTX owner、CoreProfile raw 和现有启动展示不变。

Perfowl · Performance Observer