Implementation Result · Phase 1
Perfowl Mac 第一阶段:设备基座与原生客户端
按已批准方案与四张参考界面,实现“连接 iOS USB 设备 → 选择设备 → 读取 User App → 选择测试应用”的第一条真实产品链。性能图表仍是明确的后续占位,本阶段不宣称已经采集 FPS、CPU 或网络数据。
Delivered scope
本阶段交付了什么
| 能力 | 实现 | 结果 |
|---|---|---|
| USB 设备感知 | /var/run/usbmuxd 事件流、Attached/Detached、断线重连、4 MB 帧保护 | 已实现 |
| 设备目录 | pymobiledevice3 只读设备快照,仅保留 USB,按 UDID 去重 | 真机通过 |
| 应用目录 | 读取 User App,按名称排序,支持搜索、刷新、选择和 60 秒缓存 | 真机通过 |
| 状态一致性 | 设备/App 异步请求 generation 隔离、任务取消、旧结果写回防护 | 测试通过 |
| Mac 客户端 | PerfDog 式设备/App 选择链、左侧上下文栏、共享时间轴工作区、状态与日志 | 运行通过 |
| 本地 App | Perfowl.app、Info.plist、内置 sidecar/runtime、本地 ad-hoc 签名 | 构建通过 |
Product design
UI 与交互设计结果
产品设计先完成 IA、Design Plan、Anti-Slop 和三个 page.ui.yaml,再进入 SwiftUI 落地。参考界面中保留的是核心工作模式,而不是照搬账号、多平台、工具箱等第一阶段无关区域。
保留的交互骨架
- 设备选择位于首要入口。
- 设备选定后才开放测试应用。
- 设备信息持续显示在左侧。
- 右侧使用共享时间轴图表工作区。
- 服务初始化和加载状态可见。
Perfowl 差异化
- 猫头鹰观测眼与性能曲线作为唯一品牌记忆点。
- 明确显示 USB、Lockdown 和基座状态。
- 未采集指标统一标注“待采集”。
- 首阶段只呈现 iOS USB,不展示空壳平台。
- 状态栏和日志便于现场排障。
Anti-Slop:PASS。
设计未采用通用后台卡片堆叠,而是围绕“设备 → App → 测试工作区”单一任务链组织信息。当前环境未提供 Figma MCP,因此本阶段保留可追踪 Spec 并直接实现为原生 SwiftUI。
Runtime evidence
实际运行界面
设备选择弹层
打包后的 App 实际识别到一台 iOS USB 设备,并在弹层中显示机型、系统版本与 USB 路由。
设备已连接与应用目录就绪
选择设备后,设备信息写入左侧上下文区,User App 数量为 34,应用选择入口开放。
隐私说明:证据仅保留用户已在当前本机界面可见的设备名称;未在文档中记录设备标识、应用名称清单或其他唯一标识。
Verification ledger
验证结果按证据层分开记录
| 层级 | 检查 | 结果 | 边界 |
|---|---|---|---|
| 代码测试 | usbmux 分帧与 reducer、设备去重、App 解析、选择链、刷新竞态和取消 | 8/8 通过 | Fixture,不等同真机 |
| Release 构建 | Swift release、Info.plist、App Bundle、本地严格签名校验 | 通过 | 当前为 ad-hoc |
| 产物结构 | 主程序与 pymobiledevice3 sidecar/runtime | 完整 | 当前主机 x86_64 |
| 真机设备 | iPhone14,5、iOS 16.6.1、USB | 1 台识别成功 | 只读发现 |
| 真机应用 | User App 目录 | 34 个读取成功 | 未启动 App |
| UI 运行 | 首屏、设备弹层、选择设备、状态与应用数量 | 通过 | 本机实际窗口 |
Codesign4QC extraction
为什么是剥离而不是复制整个项目
第一阶段已经从 Codesign4QC 剥离了可复用的底层思想和窄能力:usbmuxd 事件监控、pymobiledevice3 设备/App 读取、超时取消和状态隔离。没有把大型 AppModel、签名、注入、Probe 与原产品 UI 一起复制。
直接复用的正确粒度。
复用稳定协议和经过验证的边界,重新命名并建立 Perfowl 自有模块;这样避免把 Codesign4QC 的签名业务、侵入链路、视图状态和历史兼容包袱带入无侵入性能产品。
Known limits
当前明确未完成
- FPS、CPU、Memory、GPU、Network 等性能采集与指标校准。
- 开始/暂停/继续/结束、Marker、Session 落盘与恢复。
- xctrace 增强、云端上传、后端 Run 与 Web 报告。
- iOS 17+ tunnel/provider 路由和更多设备矩阵。
- 通用发行所需的 arm64/universal2、Developer ID、公证与最终 GPL-3.0 交付审查。
Next phase
建议第二阶段
- 将 Codesign4QC 的性能采集能力按 Sidecar 协议剥离,先接入目标进程绑定与基础 CPU/Memory/FPS 原始流。
- 建立 SessionOrchestrator、Metric Registry、质量字段和 append-only 本地事件包。
- 把真实样本接入当前共享时间轴,开放开始/停止,但未校准指标继续标记 Experimental。
- 在同一设备上完成 pymobiledevice3、xctrace 与 PerfDog 对照,再决定指标命名和误差门槛。
下一阶段仍需单独批准。
本次本地提交只覆盖第一阶段基座、UI 与文档,不启动性能采集开发。