架构已批准2026-09-01

Architecture 02 · Native Mac + Offline-first + Cloud Report

Perfowl 第一版基座:Mac 负责可信采集,Cloud 负责长期记录与报告

底层正式收敛为 pymobiledevice3 主采集、Apple xctrace 按需增强。第一版采用 PerfDog 式工作流:Mac 客户端连接设备、选择 App、实时采集和标注;结束后先形成完整本地 Session,再断点上传;后端记录每次测试并生成可回溯的 Web 报告。

底层方向已确认严格无侵入Mac + iOS first架构已批准第一阶段基座已交付

Decision

结论先行

推荐基座:原生 Swift Mac App + 独立 pymobiledevice3 Sidecar + 可选 xctrace Adapter + 本地 Session 包 + 模块化单体后端。
这条路线最大化复用 Codesign4QC 已证明的 SwiftUI、DVT、事件背压、会话落盘和离线报告经验,同时把采集协议、产品 UI、云端上传和报告查询重新分层,避免把 Codesign4QC 的大 AppModel、签名注入流程和 Probe 逻辑带入 Perfowl。
本方案批准的是“基座架构”,不是所有 PerfDog 指标已经对齐。
CPU、Footprint Memory、目标进程、基础 FPS/GPU 趋势可以进入首轮真机校准;FrameTime、Jank、Big Jank、能耗物理量、GPU Counter 和网络事务仍按 Experimental 或后置处理。任何未证明口径的指标都不使用 PerfDog 同名承诺。
Native
SwiftUI + AppKit Mac 客户端
1 Core
pymobiledevice3 单采集栈
2 Modes
实时监控 + 按需 Trace

本地优先

采集不依赖公网;上传失败不影响测试完成;Session 可回放、重传和审计。

云端职责

保存每次 Run、建立项目历史、生成报告、区间查询、后续支持比较与团队协作。

ADR-002

架构决策记录

决策项第一版决定理由与后果
产品入口原生 macOS 单窗口客户端与 Codesign4QC 技术栈一致,设备、进程、文件、子进程和 Instruments 集成更自然。
底层采集pymobiledevice3 独立 SidecarPython 私有协议适配速度快;通过稳定进程协议与 Swift 隔离;不把 Python 对象渗透到 UI。
增强诊断xctrace 独立 Adapter,用户主动开启保留 Apple .trace 证据;Xcode 缺失或模板不支持时,基础采集继续工作。
本地数据append-only Session 包 + 可重建 SQLite 索引原始事实不被覆盖;图表、分析和上传均可重算;崩溃后可继续 finalize。
上传Manifest 先行、分块直传、哈希校验、幂等 finalize大 Session 与 Trace 支持断点续传;重复点击不产生重复测试记录。
后端Go 模块化单体 + PostgreSQL + S3/MinIO + 同仓 Worker第一版部署面小,保留 API/处理任务边界;不提前引入微服务和消息中间件。
Web 报告React + TypeScript,服务端提供多分辨率时序查询支持同步十字线、区间统计、异常证据和后续多 Run 对比。
事实来源本地原始 Session 与云端对象存储中的不可变 ArtifactPostgreSQL 只保存元数据、分析和索引;报告缓存损坏后仍可重建。
授权门禁仍保留。
pymobiledevice3 为 GPL-3.0。开始打包前,需要按“独立 Sidecar、随包分发、源码与许可证履行方式、是否修改上游”形成正式交付结论;技术隔离本身不代表授权义务已经完成。

Assumptions

第一版设计假设与容量边界

产品假设

  • 第一版只支持 macOS Host + 一台 iOS 真机 + 一个主目标进程。
  • 基础采集允许完全离线,用户可在测试结束后再联网上传。
  • xctrace 是可选增强,用户安装完整 Xcode 才显示可用。
  • 手工探索是首个主场景,CLI/CI、多设备与自动化后置。

容量假设

  • 基础指标约 1 Hz,单次常见会话 10 分钟至 2 小时。
  • 第一阶段以中小团队为目标,不以万设备同时采集设计。
  • Trace、截图和日志远大于基础时序,全部走对象存储。
  • 没有真实用量前,不以虚构 QPS 决定微服务或时序数据库。

当单 Workspace 的日 Run、单 Run 事件量、报告查询延迟或 Worker 积压达到实际阈值时,再基于观测结果拆分处理服务或引入 ClickHouse;API 与 Artifact 契约保持不变。

Options considered

关键方案取舍

决策推荐备选取舍
Mac UISwiftUI + 必要 AppKitElectron / WebView 壳原生方案更适合设备、子进程、文件、Keychain 和 Instruments 集成;代价是跨平台 UI 不能复用。
Python 集成独立 Sidecar嵌入 CPython / 直接调用 CLISidecar 能做长连接和协议隔离;嵌入增加签名与崩溃面,碎片 CLI 会重复建链且难保证会话一致性。
本地事实存储Chunked JSONL + 可重建 SQLite全部 SQLite / 单个大 JSONJSONL 更适合追加、恢复和协议审计;SQLite 只承担发现与查询缓存,避免高频事务成为唯一事实源。
后端形态Go 模块化单体TypeScript 模块化单体 / 微服务Go 便于单二进制、并发上传和 Worker;若团队 TypeScript 更成熟,可保持同一模块契约替换实现。首版微服务部署成本大于收益。
时序存储对象存储 Raw + PostgreSQL 摘要/索引 + LOD直接引入 ClickHouse在 1 Hz 与未知规模下先减少运维面;当查询量和事件量证明需要时再替换查询后端。
上传入口对象存储预签名分块直传所有数据经过 API直传避免 API 承担大 Trace 带宽;API 仍控制清单、权限、checksum 和 finalize。

Version 1 boundary

第一版能力边界

能力域第一版基座后续对齐 PerfDog承诺等级
设备与目标USB 发现、Trust/Developer Mode/DDI/tunnel 状态、App 列表、运行进程、目标重绑Wi-Fi、多设备并行、App Extension/XPC 多进程编组P0
实时指标App CPU、Footprint/Resident Memory、线程、上下文切换、唤醒、磁盘速率、基础 FPS/GPU 趋势FrameTime、Jank/Big Jank、GPU Counter、稳定能耗、网络细分需 F0 校准
测试操作选择采集项、开始、暂停记录、继续、结束、Marker、场景标签、实时图表区间剪辑、模板、重复轮次、阈值告警、自动化控制P0
本地记录Session 列表、回放、异常结束恢复、导出原始 JSONL/CSV、上传状态跨电脑迁移、批量归档、保留策略P0
深度诊断检测 Xcode/xctrace、录制 .trace、保存模板与版本、打开 Instruments结构化 TOC/表格、与实时曲线区间关联、符号与 dSYM 管理增强
云端登录、Project、每次 Run、断点上传、处理状态、单次 Web 报告团队、任务、基线、多维对比、共享、权限、私有化部署P0
分析概览、时间曲线、区间统计、P50/P90/P95/P99、Marker/场景、质量状态自动瓶颈归因、趋势回归、AI 分析、跨版本质量门禁基础闭环
PerfDog 对标方式。
第一版对齐“使用模式和产品闭环”,即连接设备 → 选择目标与指标 → 实时观察 → 标注 → 结束 → 命名并上传 → Web 报告;指标名称只在数据源、单位、范围和算法均通过对照后对齐。

Codesign4QC extraction

Codesign4QC 如何进入 Perfowl

现有能力处理方式Perfowl 目标模块必须修正
tools/performance_collector.py算法和测试优先复用CollectorSidecar升级为明确 handshake/control 协议;补 Network/Energy 独立通道;属性与单位版本化。
provider、tunnel、4 次退避重构后复用DeviceConnectionBroker当前代码把 iOS 17+ 全部交给 tunneld;Perfowl 应优先使用 pymobiledevice3 当前 macOS native/no-root 路径,仅为 17.0–17.3.1 等场景保留受控 privileged fallback。
PID + executable + generation保留语义TargetBinding加入 bundleID、startTime、process role;累计量差分严格限定在 generation 内。
PerformanceEventRuntime抽成独立 Swift PackagePerfowlEventCore消除 Codesign4QC 命名;增加 chunk rollover、磁盘预算和 crash-safe checkpoint。
Schema v2 Envelope作为 v1 设计起点PerfowlSessionSchema增加 metricDefinitionVersion、clockDomain、unit、scope、collectorBuild 和 upload artifact 元数据。
Marker/Scenario/TestPlan模型可借鉴AnnotationCore修复规则只取首个场景的问题;区分 pause gap、场景和普通 Marker。
PerformanceSessionIndex思路复用LocalRunIndexSQLite 继续是可重建索引;加入 upload state、serverRunID、artifact checksum。
PerformanceView / 大型 AppModel不复制结构新 Feature Store 与 ViewModel设备、采集、Session、上传、报告各自拥有状态;UI 不直接管理进程和文件句柄。
Probe/注入/签名链排除与 Perfowl 无侵入定义冲突,不进入源码、包体或会话协议。

Mac client

Mac 客户端分层

SwiftUI / AppKit设备、目标、指标、图表、Marker、历史、上传
Session Orchestrator状态机、计划冻结、恢复、能力协商
Collectorspymobiledevice3 Sidecar + xctrace Adapter
Event Core时钟、质量、背压、归一化、在线统计
Session Storeappend-only Chunk、索引、Artifact、上传队列
模块职责输入 / 输出边界
DeviceDiscovery监听 USB、读取设备快照、发布连接变化usbmux/lockdown → DeviceSnapshot不打开长 DVT 流
DeviceConnectionBroker选择 lockdown/native/userspace/tunneld 路径,管理能力与恢复预算Device + OS → ProviderLease版本判断集中在此处
TargetCatalogApp/进程列表、目标身份、进程角色和重绑Device → AppIdentity/ProcessIdentityUI 只消费稳定模型
SessionOrchestrator冻结 SessionPlan,协调 collector、pause、stop、finalize 和恢复UserIntent → SessionState/Event不解析 DVT 私有字段
CollectorSupervisorSidecar 生命周期、stdio 协议、心跳、超时、退出原因和版本校验Plan → RawCollectorEventstdout 仅协议,stderr 仅诊断
MetricNormalizer映射 metric ID、单位、scope、generation、质量和算法版本Raw → NormalizedMetric未知/缺失保持 Unknown
ClockMapper保留 source/host/wall/xctrace 时钟并记录映射误差Clock samples → TimeMapping墙上时间不用于短间隔真值
EventIngestor有界队列、优先级、批量写盘、丢弃/乱序/gap 计数Events → Chunk + Quality磁盘 IO 不进入主线程
LiveQuery最近窗口、降采样、在线统计和多曲线同步游标Event stream → ViewStateUI 不保留全量样本
UploadManager创建云 Run、分块、哈希、断点、重试、网络恢复Finalized Session → Cloud Run采集完成不依赖上传成功

Collector contract

pymobiledevice3 Sidecar 设计

进程模型

  • 每个活动 Session 一个长期 Sidecar,避免多个 Python 进程争抢同一 DVT 服务。
  • stdin 接收版本化控制命令;stdout 只输出 NDJSON 事件;stderr 输出人类可读诊断。
  • 首条事件为 hello,包含 protocol、collector、pymobiledevice3、Python、架构与能力。
  • Host 负责终止预算、崩溃分类、最后心跳和 artifact 收尾。

采集通道

  • sysmontap:目标进程 CPU、内存、线程、切换、唤醒、磁盘与累计计数。
  • graphics:前台设备 FPS 与 GPU 趋势,明确 scope 为 foreground-device。
  • network:连接/流量原始事件,先证明归属再生成 App 指标。
  • energy/notifications:按 capability 启动;缺失时记录 Unsupported。

连接策略

  • iOS 16 及更早:Lockdown/usbmux。
  • iOS 17.4+:macOS 优先 native/no-root provider,失败时按固定顺序退化并记录实际 route。
  • iOS 17.0–17.3.1:进入 privileged tunnel 专项路径,并在 UI 显示一次性设置状态。
  • 连接路径属于 Session capability,不只写在日志中。

协议原则

  • 所有事件携带 sessionID、sourceID、sequence、generation、sourceMonotonic、hostReceive、quality。
  • 字段名与单位通过 Metric Registry 声明,Sidecar 不输出 UI 文案。
  • 控制事件 P0、基础 sample P1、高频明细 P2;每类丢弃均可观察。
  • 累计量遇到重启、回绕或缺样时重置差分基线。
对 Codesign4QC 的关键修正。
Codesign4QC 当前 collector 为所有 iOS 17+ 固定查询 tunneld,适合作为已有工程快照,但与 pymobiledevice3 当前 macOS 默认 native/no-root 能力不一致。Perfowl 应重新实现 ProviderLease,不直接复制该分支。

Deep diagnosis

xctrace 增强链

阶段第一版行为产物降级
预检检查完整 Xcode、active developer directory、设备、模板与目标可见性xctrace-capability.json基础采集继续,增强按钮说明缺失项
录制用户选择 Time Profiler / Animation Hitches / Allocations / Game Performance 等已验证模板原始 .trace、命令、模板、Xcode 版本录制失败写入 diagnostic artifact
导出先执行 TOC 探测,再按版本化选择器导出可用表格toc.xml、结构化导出解析器漂移时保留原 Trace 并停止结构化分析
关联记录 Trace 起止和 Host 时间映射;在报告中链接到相同测试区间TraceArtifact + TimeMapping映射误差过大时只显示独立 Artifact
分析第一版优先“打开 Instruments”和证据保留下载/打开入口源码级符号依赖 dSYM 与可调试环境
并发策略。
pymobiledevice3 DVT 与 xctrace 的同场并发在 F0 验证前保持关闭。验证证明服务互斥、采样开销和数据偏差可接受后,再允许“实时曲线 + Trace”同一 Session 并行;此前采用先停止普通采集或独立增强 Run 的方式。

Offline-first artifact

本地 Session 包与事实模型

Perfowl Sessions/<session-id>/
├── manifest.json                 # 身份、状态、版本、开始/结束、失败原因
├── session-plan.json             # 开始前冻结的目标、指标、选项与开销预算
├── capabilities.json             # 设备、route、DVT/xctrace、实际支持项
├── metric-registry.json          # metric ID、单位、scope、来源、算法版本
├── events/
│   ├── events-000001.jsonl       # append-only 统一事件 Chunk
│   └── events-000002.jsonl
├── raw/
│   ├── collector-000001.jsonl    # 未归一化 Sidecar 事实
│   └── sidecar.stderr.log
├── annotations.json              # Marker、场景、pause gap
├── quality.json                  # drop/gap/reorder/writer/clock/route 质量
├── analysis/
│   ├── summary.json              # 可重建摘要
│   └── lod/                      # 本地回放多分辨率曲线缓存
├── traces/<trace-id>/            # .trace、TOC、导出与诊断
├── upload.json                   # serverRunID、分块哈希与重试状态
└── checksums.json                # 不可变 Artifact SHA-256

不可变事实

原始 collector、统一事件、Marker/场景控制事件、Trace 和 capability snapshot。云端接收后按 checksum 保存,不做原地修改。

可重建派生

SQLite 索引、图表 LOD、统计、规则结论、HTML/Web 报告缓存。算法升级时保留旧版本并生成新 analysis revision。

Metric Definition 最小字段

{
  "id": "ios.process.cpu.non_normalized",
  "displayName": "App CPU",
  "unit": "percent",
  "scope": "process",
  "source": "dvt.sysmontap",
  "aggregation": ["avg", "p50", "p95", "max"],
  "definitionVersion": "1",
  "support": "validated | experimental | unsupported",
  "qualityRequirements": ["target_bound", "unit_verified"]
}

Cloud foundation

后端与 Web 报告架构

Mac UploadManagerRun 草稿、清单、分块、断点、哈希
API Modular Monolith身份、Project、Run、上传、查询
Object StorageRaw、Event、Trace、导出与报告 Artifact
PostgreSQL元数据、状态、统计、索引、分析版本
Worker + Web校验、LOD、规则、报告、可视化

后端模块

模块职责第一版部署
Identity登录、token 刷新、用户与最小 Workspace 权限API 进程内模块
ProjectsProject、AppIdentity、成员最小关系PostgreSQL
Runs每次测试身份、设备/App 快照、状态、客户端版本、质量摘要PostgreSQL
Uploads上传会话、分块计划、签名 URL、幂等 finalize、checksumAPI + S3/MinIO
Processing完整性验证、事件扫描、统计、LOD、规则和报告版本同仓独立 Worker;任务表使用 PostgreSQL 锁
Reports概览、曲线窗口、区间统计、Marker、质量、Artifact 下载API 查询 + Web
Audit上传、重算、删除、分享等操作记录PostgreSQL append-only 记录

核心 API 契约

接口用途幂等键 / 关键结果
POST /v1/runs创建云端 Run 草稿clientSessionID 唯一;返回 serverRunID
POST /v1/runs/{id}/upload-plan提交 artifact manifest 与 checksum返回缺失分块和直传地址
PUT signed-object-url分块直传对象存储按 artifact/chunk checksum 去重
POST /v1/runs/{id}/finalize确认上传完成并进入处理重复调用返回同一 processing revision
GET /v1/projects/{id}/runs测试记录列表、筛选和状态游标分页
GET /v1/runs/{id}/series按 metric、时间窗口和分辨率读取曲线返回 min/max/avg/count 与质量
GET /v1/runs/{id}/report报告概览、统计、异常和 Artifact带 analysisVersion
第一版不建立高频时序数据库。
1 Hz 基础指标与有限用户规模下,原始 Chunk 放对象存储,PostgreSQL 保存摘要和区间索引,Worker 预生成 1s/5s/30s 等多分辨率 LOD 即可支撑报告。达到真实容量阈值后,再用同一查询契约替换为 ClickHouse 或其他时序存储。

Domain model

云端核心数据模型

实体关键字段说明
Workspaceid, name, retentionPolicy团队与数据边界;第一版权限只做 Owner/Member。
Projectid, workspaceID, name, appKeysPerfDog“测试项目/任务”中的稳定归档容器。
AppIdentitybundleID, executable, displayName跨版本稳定身份;版本/build 保存在 Run 快照。
TestRunclientSessionID, projectID, state, startedAt, endedAt, appSnapshot, deviceSnapshot, quality每次测试一条记录;本地 Session 与云 Run 一一对应。
ArtifactrunID, kind, objectKey, checksum, size, immutableraw/event/trace/log/export/report 等文件。
MetricDefinitionmetricID, unit, scope, source, definitionVersion报告名称和比较合法性的基础。
MetricSummaryrunID, metricID, window, count, avg, p50, p95, p99, min, max全局与场景统计;派生数据可重算。
AnnotationrunID, type, name, start/end, sourceMarker、场景和 pause gap 使用同一时间轴。
AnalysisRevisionrunID, algorithmSet, state, resultArtifact同一原始 Run 支持多版本分析,旧报告仍可追踪。
UploadSessionrunID, artifactPlan, completedChunks, expiresAt断点、重试和清理孤儿对象。
比较键提前进入模型。
第一版报告只做单 Run,但每个 Run 已保存 device model、iOS、App version/build、collector build、metric definition、route 与 refresh-rate capability;后续加入多维对比时不需要重写历史数据。

Security & privacy

安全、隐私与数据生命周期

客户端

  • 访问令牌只进入 macOS Keychain,不写 Session、日志或 UserDefaults。
  • Session 默认只采集明确启用的指标;日志、截图、Trace 单独显示数据敏感提示。
  • 上传使用 TLS,预签名地址短时有效;日志对路径、token 和账号信息脱敏。
  • 本地 Session 的删除、保留和自动清理由用户可见策略控制。

后端

  • Workspace/Project/Run 每次查询都执行租户授权,不能只依赖前端隐藏。
  • Artifact 服务端加密,checksum 防止静默损坏;对象键不包含原始文件名或账号信息。
  • 上传、下载、重算、分享和删除进入 Audit;第一版分享功能保持关闭。
  • 删除采用“标记 → 后台清理对象 → 审计完成”的可追踪流程,并明确保留期。
数据最小化。
性能指标本身也可能暴露应用行为;系统日志、截图、Trace 和包标识可能包含业务或个人数据。它们必须在采集前可见、上传前可取消,并支持 Project 级禁用与保留策略。

PerfDog-like workflow

Mac 产品信息架构与交互

  1. 登录与项目

    登录后选择 Workspace/Project;token 已缓存且网络中断时仍允许本地采集,结束后进入待上传队列。

  2. 连接设备

    顶部设备选择器展示连接、Trust、Developer Mode、DDI、Tunnel 和 iOS 版本;问题直接给出下一步,不只显示“连接失败”。

  3. 选择 App/进程

    按 App 名、Bundle ID、运行状态筛选;默认绑定主进程,支持目标退出后按 stable identity 重绑并标出 generation。

  4. 配置指标

    左侧指标区采用“采集 / 显示”分离:关闭、采集但隐藏、采集并显示;每项展示 scope、开销和支持等级。

  5. 开始测试

    开始前冻结 SessionPlan,显示实际 route 与缺失能力;进入主视图后图表共享时间轴和十字线。

  6. 暂停记录与继续

    暂停只停止测试样本写入,保持设备与采集器连接;时间轴写入 pause gap,继续时新建连续片段,避免把空白当成 0。

  7. Marker 与场景标签

    单点 Marker 标记事件,场景标签表示时间区间;快捷键、颜色和命名可编辑,所有标注进入统一事实流。

  8. 结束与确认

    先停止采集并完成本地 finalize,再弹出名称、Project、备注与“保存并上传”;上传可在后台继续。

  9. 历史与回放

    本地记录展示完成/异常/待上传/上传中/云端已就绪;打开后使用与实时页同一图表组件回放。

  10. Web 报告

    浏览器展示概览、同步曲线、区间统计、场景、异常证据、数据质量、设备/App 快照和原始 Artifact。

主窗口布局建议

测试工作台

顶部:Project、设备、App/进程、连接状态;左栏:指标采集/显示与当前值;中央:多曲线时间轴;右上:开始、暂停、继续、结束;底部:Marker、场景、日志与质量状态。

历史与上传

左侧导航切换“实时测试 / 本地记录 / 上传队列 / 设置”;历史列表按 App、设备、版本、时间和上传状态筛选;报告在客户端回放与浏览器云端之间保持相同术语。

UI 仿照边界。
本方案先对齐 PerfDog 的操作心智和信息层级,不锁定像素。当前公开文档足以确认主流程,但付费版当前 UI、保存上传弹窗、报告对比和错误状态仍需用真实账号逐屏录制后,才能冻结原型与交互规格。

Web report v1

第一版报告结构

页面区块内容证据要求
Run Header名称、Project、App 版本、设备/iOS、开始/结束、时长、客户端/collector 版本、状态全部来自不可变 manifest 快照
Overview关键指标 avg/p95/max、采样数、场景数、错误和质量徽标展示 definitionVersion 和有效样本比
TimelineCPU、Memory、FPS、GPU、Network 等共享时间轴,缩放、拖动、同步十字线每个点保留 scope 与 quality
Interval Inspector框选区间统计、起止、变化量、P50/P90/P95/P99、异常点查询携带 resolution,关键 extrema 不被降采样吞掉
Scenes & Markers场景带、Marker、pause gap、注释来源可追到统一事件 ID
Qualityroute、能力、drop/gap/reorder、断连、重绑、写盘、上传和时钟误差质量异常不隐藏在脚注
Deep Tracexctrace 模板、起止、状态、Trace 下载/打开、结构化摘要原始 .trace 始终保留
Artifacts原始事件、CSV、诊断、Manifest、Checksum下载操作进入审计

State machines

关键状态机

设备

disconnected → detected → trusted → developerReady → routeReady → available;任何失败都保存 code、action 和 lastGoodState。

本地 Session

draft → validating → preparing → recording ↔ paused → stopping → finalizing → completed,旁路为 degraded / failed / cancelled / recovered

Collector

idle → launching → handshaking → streaming → recovering → stopping → stopped;恢复预算耗尽后 Session 进入 degraded 或 failed。

上传

localOnly → planning → uploading → verifying → processing → reportReady,错误进入 retryable / blocked / rejected 并保留已完成分块。

云 Run

draft → receiving → uploaded → validating → analyzing → ready,异常为 incomplete / invalid / processingFailed

进程绑定

targetResolved → waiting → attached(generation N) → ended → rebinding → attached(N+1);累计指标不跨 generation。

Non-functional requirements

基座质量目标

目标第一版验收标准验证方法
长时稳定60 分钟基础会话不因 UI、网络或后台上传中断;accepted 与 persisted 可对账固定设备矩阵重复长测,保存事件与 Host/Device 开销
实时延迟1 Hz 基础指标 source→UI p95 目标 ≤ 1.5 秒;延迟样本保留原时间source、host receive、UI present 三阶段时间戳
内存有界实时 UI 和写入队列不随会话时长线性增长120 FPS 压力事件 + 慢盘/暂停/后台切换
异常恢复客户端重启可识别 unfinished Session 并完成恢复或失败收尾强制结束 App、拔线、Sidecar crash、磁盘满、Mac 休眠
上传可靠网络中断后从缺失 chunk 续传;重复 finalize 只产生一个 Run代理断网、token 过期、对象重复、checksum 错误
报告可追溯任一统计可追到 metric definition、原始 chunk、区间和 analysisVersion抽样从 Web 数值反查原始事件
离线运行移走源码目录、干净用户目录下仍可采集、回放、导出并排队上传arm64/x86_64 App/DMG、签名、Sidecar 哈希和无网启动
无侵入包体、运行进程和会话中不存在 Probe、重签、注入或 WDA 默认依赖静态包检查 + 真机进程/安装前后对照

Delivery gates

建议实施顺序

阶段交付进入条件退出条件当前状态
F0 真值与基座验证pymobiledevice3 route、字段/单位、CPU/Memory/FPS/GPU、并发 xctrace、开销和 60 分钟稳定实验底层方向已确认固定 fixture、Metric ADR、支持矩阵、授权交付结论A Conditional Pass · B Partial / E2
M0 工程骨架Swift Package 边界、Mac Shell、Sidecar handshake、Session Schema/Store、模拟事件F0 中协议与指标字段冻结;当前以 Experimental 并行落地无需真机可完整演示 Session 生命周期和恢复已实现 · Fixture PASS
M1 本地采集闭环设备/App、基础指标、实时图表、Marker/场景、本地历史与回放M0 通过60 分钟、断连/重绑、异常恢复、干净 DMG 验收部分完成 · 待 Marker/历史/稳定性
M2 云端单报告登录、Project/Run、断点上传、Worker、Web 单次报告Session Schema 稳定上传幂等、报告追溯、对象与数据库恢复演练未开始
M3 xctrace 增强预检、录制、Trace Artifact、TOC-first 导出、报告关联并发/开销实验通过模板矩阵和 Schema 漂移降级可复现未开始
M4 PerfDog 高阶对齐FrameTime/Jank、能耗、GPU Counter、多 Run 比较、任务/团队、CLI/CI对应数据源逐项通过真值验证算法、兼容与开销门禁通过后置
开发批准依然拆分。
截至 2026-09-02,设备/App 第一阶段与 Collector/Session/实时曲线第二阶段已分别获得明确批准并交付;指标继续标记 Experimental,不替代 F0 校准门禁。Marker/本地历史/稳定性、M2 云端与 M3 xctrace 仍需分批批准。

PerfDog evidence request

付费账号与文档什么时候需要

架构 v1 不依赖付费账号;冻结 UI 与功能验收时需要。
公开资料已足以确认无侵入、桌面实时采集、指标选择、标注、保存/上传、云端记录和报告对比等主链。付费账号用于把“产品心智对齐”进一步落实为逐屏交互规格。
  1. Mac 客户端全流程录屏

    登录、设备连接、App/进程、指标面板、开始/暂停/继续/结束、Marker/Label、区间选择、保存上传和本地回放。

  2. 当前付费指标矩阵

    iOS 各指标名称、单位、帮助说明、USB/Wi-Fi 限制、版本/机型限制和错误状态。

  3. 真实 Web 报告

    单次报告、区间统计、报告对比、趋势、项目/任务、分享权限、导出格式和处理状态。

  4. 真实 Session 与导出

    一份普通 App、一份游戏、一份 App 重启或断连样本;包括本地导出、云端报告和同场 PerfDog 采样。

  5. 异常与边界录屏

    设备锁屏、Developer Mode/镜像问题、指标灰置、上传失败、短测试、断线、App 退出和 xctrace 冲突。

账号使用建议通过已经登录的浏览器会话完成,不在文档或聊天中保存密码。你后续提供的官方文档地址将登记到本页“依据”并标注版本/访问日期。

Risk register

最高风险与控制

风险概率/影响控制降级
DVT 私有服务随 iOS 变化高 / 高Provider/Collector 隔离、能力快照、固定原始 fixture、版本矩阵明确 Unsupported;保留已验证基础项和 xctrace Artifact
指标名称看似相同但口径不同高 / 高Metric Registry、单位/scope/算法版本、同场 Xcode/PerfDog 对照改用中性名称并标 Experimental
pymobiledevice3 授权与闭源交付冲突中 / 高F0 完成具体交付形态审查、许可证与源码履行方案暂停商业打包决策,不建设第二运行时
xctrace 与 DVT 并发互斥或放大开销中 / 高默认关闭并发;按模板、Xcode/iOS 固定实验独立增强 Run 或先结束普通采集
Mac 客户端成为大型单体中 / 高Swift Package 边界、领域状态机、Sidecar 协议、模块 ViewModel功能模块独立关闭,不影响 Session Store
上传/云端过早拖慢采集中 / 高本地 finalize 优先、后台分块上传、磁盘与网络隔离队列保持 localOnly,稍后重传
报告海量点导致交互卡顿中 / 中多分辨率 LOD、极值保留下采样、窗口查询降低分辨率并保留区间统计准确性
UI 只模仿外观而流程不一致中 / 中付费账号逐屏行为录制、状态/错误清单、可用性走查先保持自洽工作流,再做视觉贴合

Approval boundary

已批准的架构决策

批准记录已更新。
2026-09-01 批准本架构方向与 F0 范围;2026-09-02 分别批准并交付设备/App 第一阶段,以及 Sidecar、目标绑定、Session 落盘和基础实时曲线第二阶段。Go + PostgreSQL + S3/MinIO + React 云端组合仍仅在架构基线,尚未进入开发。

已进入架构基线

  • pymobiledevice3 是唯一主采集栈。
  • xctrace 是用户按需增强。
  • 原生 Mac 客户端负责采集和本地 Session。
  • Go + PostgreSQL + S3/MinIO + React 云端记录每次 Run 并提供 Web 报告。
  • 首版限定单设备、单 App 主进程、单次报告。

完成 F0 B 批次前待确认

  • iOS 16 USB 只读冒烟已完成,动态断连/重绑场景尚缺。
  • 是否允许完善、构建、签名并安装 PerformanceProbeFixture。
  • A2 商店 App 与 A3 高刷样本。
  • PerfDog 官方文档地址与付费账号已登录实测窗口。

当前已新增 Mac App 与 Sidecar 本地采集代码;后端、Web、数据库、上传和部署代码仍未启动。

设计依据

  1. Perfowl 无侵入底层能力决策 v1 — pymobiledevice3 主链、xctrace 增强、指标边界与 F0。
  2. Perfowl Gate F0 真机能力与指标校准计划 v1 — 设备矩阵、实验清单、误差门槛、证据产物与停止条件。
  3. Codesign4QC 性能采集专项分析 — DVT、generation、Schema v2、背压、质量、Session、场景与报告。
  4. Apple Instruments 专项调研 — Trace/Template/Instrument、xctrace 和验证基准。
  5. PerfDog 官方客户端说明 — 无侵入、Mac/iOS、实时指标、Marker/Label、停止、上传与 Web 管理。
  6. PerfDog 官方产品页 — 实时监控、报告分析、全平台与自动化产品方向。
  7. pymobiledevice3 iOS 17+ tunnel 指南 — macOS native/no-root 默认路径与 17.0–17.3.1 privileged tunneld 边界。
  8. pymobiledevice3 DVT API — Process、Sysmontap、Network、Energy、Graphics、ActivityTrace、CoreProfile 等入口。
  9. Apple Xcode command-line tool reference — xctrace 录制、导入、导出与符号化定位。
  10. Perfowl 调研与开发规则 — 先分析、批准后开发、HTML 归档和本地提交。