外观
P4 工作台指标支持收口结果
结论
“添加指标”的 17/17 个入口现在都可选择:14 项标为“可用”,Battery、Thermal Status、GPU Counter 3 项标为“条件可用”,不再出现“部分支持 / 后续批次 / 暂未支持”的静态禁用项。支持状态描述产品链是否已接通;数值仍通过 candidate、missing、条件原因和 E1–E4 证据表达,不用改标签冒充数据能力。
本批完成 StartupTiming、CPU Core Usage、Frame Time 与 GPU Counter 的 raw → 公式 → wire → Session/CSV → 工作台闭环。Foundation 升级为 collector-foundation.1.4-beta,Mac App 升级为 1.0.0 (23)。
产品交付
| 添加项 | 产品状态 | 已接通能力 | 当前边界 |
|---|---|---|---|
| ScreenShot | 可用 | 1 秒频率、Session 时间线与附件 | 原生 UI 人工回归开放 |
| StartupTiming | 可用 | Running、Foreground Ready、轮询误差上界 | 外部观察时间,不等于 main/首帧/可交互 |
| FPS | 可用 | 前台画面 FPS | foreground-device,非目标 PID 独占 |
| Frame Time | 可用 | 选中后启用 CoreProfile,实时 FTime 与 Session 帧报告 | 当前 exact debugid 为 candidate;进程归因开放 |
| CPU Core Usage | 可用 | 按真实向量动态生成 Core 0…N-1 | 整机 scope;缺核心保留 null 槽位 |
| CPU Usage | 可用 | APPCpu + TotalCPU | TotalCPU normalized 仍为 candidate |
| Memory Usage | 可用 | 五类进程内存 + 整机 AvailableMemory | XcodeMemory 是 candidate alias |
| GPU Usage | 可用 | Renderer / Tiler / Device | foreground-device |
| CSwitch / Wakeups / Disk | 可用 | 同 PID+generation 差分速率 | warmup/reset 不写 0 |
| Battery Temperature | 可用 | Diagnostics 温度换算 | centi-°C candidate |
| Network | 可用 | 进程优先、整机回退,同 scope 成对 | 进程源时钟 candidate |
| Energy Usage | 可用 | Total + 六分项 source-native cost | 单位/等级未对齐 PerfDog |
| Battery | 条件可用 | Current / Voltage / Power 公式与链路 | 仅 Wi-Fi、无外供电、未充电时发布 |
| Thermal Status | 条件可用 | 0…3 枚举承接与 fail-closed | 当前设备未返回稳定当前值源 |
| GPU Counter | 条件可用 | 选中后启用 GPU service,动态 schema 可解析,data row 仅在设备实际返回时发布 | source-native-count;本轮最终冻结复测未返回 data row,设备公式/单位和跨 SoC 校准开放 |
公式与质量落实
公式先写入 P4 工作台指标支持收口方案,详细长期口径进入:
关键修正规则:
- 分核 CPU 中间缺值保留 null 槽位,不压缩数组导致核心编号漂移。
- Frame Time 仅来自 CoreProfile accepted presented-frame timestamp,相邻差分;不使用
1000/FPS伪造。 - GPU Counter 使用静态 Registry
ios.device.gpu.counter.source_native加动态counterdimension;非_或require=true直通,_且require=false才差分。 - GPU Counter 不执行设备下发 JavaScript,不猜 percent/GB/s;未知 schema、宽度错误、首行和 reset 均保持 missing。
- 高成本的 CoreProfile 与 GPU service 只在用户选择对应指标时启动,仍共用唯一 pymobiledevice3 DTX owner。
自动化验收
| 项目 | 结果 | 证据 |
|---|---|---|
| 冻结 CPython 3.12 全量测试 | 132/132 | E2 |
| Swift 全量测试 | 79/79 | E2 |
| Workbench 添加入口 | 17/17 可选择;14 可用 + 3 条件可用 | E2 |
| Registry | 54 个静态 metricID,唯一且可追踪 | E2 |
| CSV | 54 列,Startup / Frame Time / GPU Counter 保留缺值 | E2 |
| Collector Core | 构建与 probe 通过 | E2 |
| VitePress | 构建通过 | E2 |
| Mac App | 1.0.0 (23) 构建、ad-hoc 严格签名通过 | E2 |
| 内部测试包 | Perfowl-1.0.0-beta23-x86_64.zip;SHA-256 6ec4ce72…edb2f7b9;ZIP 完整性通过 | E2 |
| Foundation 离线包 | perfowl-collector-foundation-1.4-beta-x86_64.tar.gz;SHA-256 b73204f0…2ddaae0;tar 完整性与包内 probe 通过 | E2 |
匿名 iOS 17 真机验收
使用当前连接的设备 A 和目标 App A,执行 controlled launch 并选择 StartupTiming、CPU Core Usage、Frame Time、GPU Counter。公开记录不保存设备、App、Bundle ID 或 PID。
| 事实 | 结果 |
|---|---|
| 身份 | verified |
| Startup Running / Foreground Ready | 1,325.933 ms / 1,325.933 ms |
| 轮询误差上界 | 500 ms |
| 分核 CPU | 6 个核心槽位;150/150 个派生值非空 |
| Frame source | 1,557,045 records / 32 accepted / unknown chunk 0 / unknown byte 0 |
| GPU Counter | schema-ready 1;119 条两整数 heartbeat;无 decoded row;无非空 Metric value(保持 missing) |
| Raw / drop | 624 / 0 |
因此 StartupTiming、分核 CPU 与 Frame Time 达到 E4 candidate。GPU Counter 的 service 控制、设备 schema 和端到端缺值语义达到 E4,但本轮最终冻结二进制没有收到可解码 data row,数值门禁仍开放;旧的“decoded row 8 / 280 values”未被最终冻结证据复现,本结果不保留该结论。Battery 与 Thermal 仍按条件门禁保持 null,不因本批入口可选而升级数值结论。
未关门门禁
- GPU Counter:补 iOS 16/18、更多 SoC 的 schema;研究设备公式后再发布 percent、带宽等工程单位。
- ThermalStatus:取得可跨 iOS 验证的稳定 0…3 当前值源。
- Battery:设备物理断开 USB/充电器、保持 Wi-Fi,完成 battery-only E4。
- Frame Time:长时连续性、目标进程专属归因与 PerfDog 同窗校准。
- StartupTiming:main、首帧、首个可交互等更精确阶段定义与来源。
- TinyJank / Smooth:不在添加菜单中,等待可信定义;不以近似值补齐。
- 原生 UI 搜索→选中→开始→停止→截图/Review 的人工验收仍由用户完成。
下一阶段与整体进度
下一阶段先做 P4 原生 UI 人工关门 + P5 条件指标真机补证,随后再进入 P6 xctrace 增强和精确启动阶段研究。整体八阶段中 P0、P1、P2、P3 的代码链已完成;P4 为产品链完成、人工验收开放;P5 为 13/13 公式与来源接入、Battery/Thermal 条件门禁开放;P6 研究中;P7 未开始。
冻结归档:P4 工作台指标支持收口结果 HTML。