外观
P2/P5 指标自校准与产品闭环结果
结论
- 搜索筛选后选中 App 的代码闭环已修复:UI 传递完整
DeviceAppRecord,基座校验记录仍属于当前设备快照后才选中;过期搜索结果 fail-closed。 - 开始测试默认为
controlled-launch:发送一次 launch,不强杀已运行进程,再用 Bundle ID → PID → process list 核验身份;失败时会显式报错。 - P2 的 11 个指标已全部进入自校准器;USB iOS 17 受控启动真机 Session 为 11/11 internally-calibrated。
- P5 的 13 个指标已全部进入自校准器;公式 invariant 13/13 通过,真机源 13/13 observed,其中 9/13 取得有效数值。剩余四项不写 0:Battery Current / Voltage / Power 受外供电物理条件阻塞,ThermalStatus 缺稳定当前值源。
- 自校准只证明 Perfowl raw → Metric 的公式、单位、scope 和质量语义;按用户决定,本批不执行 PerfDog 同窗对照,L4 保持
not-tested。
产品修复
应用搜索与选中
AppPickerPopover 不再只回传 Bundle ID,而是回传当前可见列表中的完整记录。DeviceFoundation.selectApp(_:) 先对当前 apps 快照做包含校验,选中成功才收起弹层。Swift 测试覆盖:
- 筛选结果能选中精确 App。
selectedApp与用户点击记录一致。- 列表刷新后的过期记录被拒绝,已选 App 不被覆盖。
最终打包工具的后端读取也已验证:USB iOS 17 为 73 个 User App,Wi-Fi iOS 18 为 31 个 User App(E4)。原生 UI 人工点击回归按用户要求留待后续。
开始即尝试启动目标 App
Mac App 将 controlled-launch 显式传入 Collector Core。启动请求的 host monotonic 起点在 DTX launch 调用前保存,Lifecycle 以 0.5 秒轮询寻找同 generation 第一个 running / foreground 终点。
USB iOS 17 上选择一个测试前未运行的匿名银行 App:
| 证据 | 结果 |
|---|---|
| launch 请求 | 1 |
| identity verified attach | 1 |
| sample / raw | 18 / 427 |
| drop / error / pending-task warning | 0 / 0 / 0 |
| observed running / foreground ready | 1,292.645 ms / 1,292.645 ms |
| 轮询误差上界 | 500 ms |
因此产品行为是:点击开始后会尝试启动选中 App,启动与身份核验成功才进入指标采集。USB iOS 17 已通过 E4;USB iOS 18 的一个匿名目标由设备返回 launch failure,链路按预期 fail-closed,不扩大为“iOS 18 所有 App 都可启动”。
P2 指标自校准
P2 共 11 个 metricID:APPCpu、TotalCPU raw / normalized、分核 CPU、AvailableMemory、整机 Send / Recv、进程 Send / Recv、两项 StartupTiming。受控启动 Session 全部 11/11 通过 L1 与 L2。
本批另外发现并修正 Debug Gauge 进程网络源时钟问题:某 iOS 18 Wi-Fi 回包的首两个源时间相差约 19 分钟,而 host 收包仅相差约 2 秒;旧公式生成约 2.46 GB/s 人工峰值。转用 NSDate 源时钟的 source-interval-rate.candidate.v2 后,同类 Wi-Fi 复测 Recv 最大值为 7,445,571.45 bytes/s,无人工 GB/s 峰值。完整口径见 Network Send / Recv v2。
P5 指标自校准
已取得有效数值(9/13)
| 组别 | iOS 17 Wi-Fi | iOS 18 Wi-Fi | 证据 |
|---|---|---|---|
| Battery Temperature | 29.00–29.29 ℃ | 30.79–31.00 ℃ | 2 / 3 个条件快照 |
| Energy Total | 416.612–659.693 | 4.450–1,047.334 | 24 / 23 个有效回包 |
| CPU Energy | 0–243.082 | 4.450–106.088 | 非负有限值 |
| GPU Energy | 0 | 0–0.913 | 真实 0 保留 |
| Network Energy | 0 | 0–504.406 | 值响应已观察 |
| Location Energy | 0 | 0 | 稳定 0 是有效观测 |
| Display Energy | 426.612 | 0–440 | 非负有限值 |
| Energy Overhead | 该场景为 source-sentinel | 0–500 | 不将哨兵写成 0 |
仍未取得可发布数值(4/13)
| 指标 | 本批真机事实 | 结论 |
|---|---|---|
| Battery Current | iOS 17/18 Wi-Fi 条件快照均 ExternalConnected=true | null / external-power-connected |
| Battery Voltage | 同上 | null / external-power-connected |
| Battery Power | 同上 | null / external-power-connected |
| ThermalStatus | 两系统快照均无稳定 0–3 字段 | null / source-missing |
Battery 三项的计算和门禁已用确定性 Fixture 完成 L1,且真机原始源已观察;数值 L2/L3 需设备物理断开 USB 与充电器,同时保持 Wi-Fi 配对连接,再运行长于 40 秒的 Session。ThermalStatus 已审计 Battery IORegistry、完整 IOService 平面、MobileGestalt 与当前 DVT/Diagnostics,未发现可靠当前值源;不用温度或 Energy thermal cost 推断。
连接和收口修正
- iOS 17+ Network 使用
wifi-userspace;iOS 15/16 Network 使用新增wifi-lockdown,不再错误追加--userspace。 - USB 物理断开后,同一逻辑设备如被 Network 记录接管,保留已选 App 并重做 DVT 路由核验,不沿用旧 USB snapshot。
Pmd3Subscription.__anext__在外层消费者取消时同步取消并等待内层Queue.gettask。iOS 17/18 Wi-Fi 和 iOS 17 USB 本批复测 pending-task warning 均为 0。
自动化与产物验收
| 项目 | 结果 | 证据层级 |
|---|---|---|
| Python 系统环境 | 116/116 | E2 |
| Python 冻结 CPython 3.12 | 116/116 | E2 |
| Swift | 79/79 | E2 |
| iOS 17 USB controlled launch | 18 sample / 427 raw / identity verified / drop 0 | E4 |
| iOS 17 Wi-Fi passive | 36 sample / 616 raw / identity verified / drop 0 | E4 |
| iOS 18 Wi-Fi passive | 42 sample / 773 raw / identity verified / drop 0 | E4 |
| iOS 18 USB controlled launch | 设备侧 launch failure,fail-closed | E4 失败边界 |
| 原生 UI 搜索→选中→开始 | 未执行 | 由用户后续验收 |
每个 Session 生成 metric-self-calibration.json,并由 foundation-delivery.json 记录哈希;报告保存公式版本、scope/unit、质量分布、最小/最大值、invariant 和 L1–L4 状态。
未关门与下一阶段
- 完成 Battery 三项的 battery-only E4 数值;需要物理断开外供电条件。
- ThermalStatus 保持 source research;在取得可跨 iOS 验证的稳定 0–3 当前值源前不发布。
- 由用户完成原生 UI 的搜索、选中、开始、停止、截图时间线与 Review 回归。
- 上述三项不阻塞 P2 公式/链路代码收口,但 P5 数值门禁仍保持 partial;下一个产品阶段是 P4 人工 UI 关门后,再决定是补 P5 物理场景,还是进入 P6 xctrace 增强研究。
2026-09-06 update:最终测试包构建与签名
本批在代码、公式和真机采集结果冻结后完成最终内部测试包构建,新增证据不回改前述验收数字:
| 项目 | 结果 | 证据层级 |
|---|---|---|
| Mac App | Perfowl.app,1.0.0 (22),x86_64 | E2 |
| Foundation | collector-foundation.1.3-beta | E2 |
| 内置 pymobiledevice3 | 11.3.1 | E2 |
| 内置 Core compatibility probe | ready;9/9 capability;missing 0 | E2 |
| App 签名 | ad-hoc;codesign --verify --deep --strict 通过 | E2 |
| ZIP 独立解包 | 签名通过;13,091 个普通文件与 34 个符号链接和构建目录一致;包内 probe 通过 | E2 |
| Foundation 独立解包 | 281/281 文件哈希通过;内置 probe ready | E2 |
最终内部测试包:MacApp/dist/Perfowl-1.0.0-beta22-x86_64.zip,SHA-256 1de200facb6206da1e5799232bb99fa063df82e61a2e5c35a9f6c51e58d4d9e5。
Foundation 归档:MacApp/dist/collector-core/perfowl-collector-foundation-1.3-beta-x86_64.tar.gz,SHA-256 6d9e8de91012335ac2bc59d2af9a1071d5b7547e94271dc268576ae919aa4a69。
该产物是内部 x86_64、ad-hoc 签名测试版本,未提交公证;arm64 / universal2、Developer ID、公证和 GPL-3.0 法务结论仍属于正式分发门禁。