外观
iOS 15+ 连接与指标兼容矩阵
Perfowl 的“支持某个 iOS 版本”包含三层独立结论:
- 连接可达:能发现设备、完成 Trust / Lockdown;
- 开发服务可达:Developer image 与 DVT / RSD 服务可用;
- 指标可信:目标身份、字段、单位、scope、公式与误差完成该系统版本的校准。
前两层通过不代表第三层自动通过。Perfowl 也不会把仓库 README 的能力声明直接记成自己的真机支持。
iOS 版本与连接路线
| iOS | USB / DVT 路线 | Developer Mode | Developer image | 管理员权限 | 当前证据 |
|---|---|---|---|---|---|
| 15.x | USBMux + Lockdown,DVT 直连 | 不适用(该开关从 iOS 16 引入) | 需要与系统兼容的 Developer image | 通常不需要 | 待 Perfowl E4 |
| 16.x | USBMux + Lockdown,DVT 直连 | 需要 | 需要 | 通常不需要 | iOS 16.6.1 的部分主链已 E4;不外推整个 16.x |
| 17.0–17.3.1 | RemotePairing / RemoteXPC tunnel → RSD | 需要 | 个性化 Developer image / 对应开发支持 | 当前可靠主路需要 privileged tunnel | 待 E4,高风险版本段 |
| 17.4–18.1 | CoreDeviceProxy Lockdown tunnel → RSD | 需要 | 同上 | macOS native / userspace 可无管理员权限 | 待 E4;17.4.0 单独验 |
| 18.2+ | CoreDeviceProxy TCP;RemotePairing 改用 TLS-PSK TCP | 需要 | 同上 | 取决于实际 tunnel provider | 待 E4;不得继续假定 QUIC |
| 26.x | 运行时 capability 协商 | 需要 | 最新兼容开发支持 | 取决于协商结果 | 待 E4,不从 18.x 推断 |
设备连接前置检查
- 设备解锁,并与 Mac 完成 Trust / pairing;
- iOS 16+ 开启 Developer Mode;iOS 15 没有这一设置;
- Developer image 已挂载或相应个性化开发支持可用;
- iOS 17+ 的 RSD route 已建立并能列出 DVT service;
- 产品显示实际协商路由,不只显示 Host 原计划;
- 任一步缺失都显示 missing / degraded 与原因,不使用
0表示连接状态。
指标与设备要求
| 指标族 | 原始服务候选 | 最低系统路线 | 硬件 / 场景要求 | 质量与发布要求 |
|---|---|---|---|---|
| APP CPU、内存、线程、CSwitch、Wakeups、Disk | DVT Sysmontap | iOS 15+ DVT;17+ 经 RSD | 无特定 SoC;目标 App 需存在可验证 PID | Bundle ID → PID → generation;首点、缺值、计数器重置不可写 0 |
| TotalCPU、分核 CPU、系统内存 | DVT Sysmontap system fields | 同上 | 分核向量和核数须由设备回包 | raw 多核值与归一化候选分存;不同版本字段能力探测 |
| 秒级 FPS、Renderer / Tiler / Device GPU | DVT Graphics | 同上 | 目标 App 前台;大于 60 FPS 需 ProMotion 设备 | scope 为 foreground-device;秒级 FPS 不等于逐帧 FrameTime |
| FrameTime、SmallJank、Jank、BigJank、Stutter | CoreProfile / KDebug raw frame events | 私有事件源,按大版本验证 | 60Hz 与 120Hz 都需覆盖;动态刷新率单列 | 事件码、mach timebase、首三帧、后台与丢事件全部入质量报告 |
| Network Send / Recv(设备级) | DVT NetworkMonitor | iOS 15+ DVT;17+ 经 RSD | 无特定硬件;需制造上传 / 下载流量 | 当前 Registry 是 device scope;interval、空窗与 reset 规则不变 |
| Network Send / Recv(进程级候选) | Xcode NetworkStatistics debug gauge | 服务能力探测 | 必须绑定 PID / generation;覆盖扩展和多进程 | 未证明完整归属前不替换 device 指标,不与设备流量混名 |
| Energy Usage | DVT EnergyMonitor / Xcode Energy debug gauge | 服务能力探测 | 目标 PID;前台 / 后台场景分开 | raw payload 先保存;单位、窗口和 scope 校准后发布 |
| GPU Counter | DVT GPU counter service | 服务能力探测 | counter schema 取决于 SoC 与 iOS | 运行时枚举 counter;未知 schema 显式 unsupported,禁止按机型硬编码 |
| StartupTiming | CoreProfile / lifecycle events | 私有事件源,按大版本验证 | 被动观察或用户选择的受控冷启动 | 两种模式分开;事件时间基与启动边界先入档 |
| Battery、Battery Temperature、Thermal Status | Diagnostics / IORegistry / 条件服务 | 具体服务能力探测 | 字段可能受机型、供电和系统状态影响 | device scope;不可归因到目标 App;缺字段保持 missing |
| ScreenShot | DVT Screenshot | iOS 15+ DVT;17+ 经 RSD | 无特殊硬件;设备需可返回有效 PNG | 低频辅助证据,不是逐帧真值;失败不复用旧图 |
120Hz 与 ProMotion
逐帧采集协议不应按“60Hz 实现”和“120Hz 实现”拆成两套算法。Perfowl 保存每个 raw frame timestamp,再由同一条 FramePipeline 计算 FrameTime 与窗口 FPS。
但验收设备必须包含至少一台 60Hz 和一台 ProMotion:
- 60Hz 设备只能证明 60Hz 场景与低刷新率行为;
- ProMotion 用于验证大于 60 FPS、动态刷新率与 120Hz 阈值场景;
- 秒级
CoreAnimationFramesPerSecond只能做概览和交叉检查,不能反推出每一帧时间; - 若逐帧事件丢失或时间基未知,Jank 类指标必须显示 unavailable / candidate。
Provider 路由原则
| 层 | 默认候选 | 备用 / 研究候选 | 不变规则 |
|---|---|---|---|
| 设备与基础 DVT | pymobiledevice3 | go-ios 基础服务 | UI 不依赖具体库名称 |
| iOS 17+ tunnel | pymobiledevice3 native / userspace | go-ios userspace / kernel | 同设备只有一个 tunnel owner;实际 route 入 Session |
| 逐帧 / 深度指标 | pymobiledevice3 raw CoreProfile | py-ios-device Research Provider | 同 Session 只有一个主 DTX reader;输出 raw,不直接信任格式化指标 |
| 校准 | xctrace / 自有 Fixture / PerfDog 同场样本 | 第二 Provider 交叉回放 | 未经 E4 不从 Experimental 升级 |
当前 Perfowl 支持声明
- 当前只有 iOS 16.6.1 的设备发现、Developer image、基础 DVT 与部分短采集拥有历史 E4;
- iOS 15、17、18、26 仍是设计支持范围,不是已验证范围;
- pymobiledevice3
4.21.3 → 11.3.1、go-ios tunnel 与 py-ios-device 深度指标均处于研究 / 候选状态; - 商店 App 可以保持原包进行无侵入 attach,但第三方 App 的源码级符号与业务阶段不可保证;
- GPL-3.0 分发结论仍是对外发布门禁。
建议设备矩阵
| 优先级 | 设备 | 主要验证目标 |
|---|---|---|
| P0 | iOS 17.0–17.3.1 · 60Hz | early-17 privileged RemotePairing、重连与长稳 |
| P0 | iOS 17.4.0 | CoreDeviceProxy 分界与 go-ios 17.4.0 路由边界 |
| P0 | iOS 18.2+ · ProMotion | TCP 路径、QUIC 禁用、120Hz raw frame |
| P0 | iOS 26.x | 当前最新系统 capability 与字段漂移 |
| P1 | iOS 15.7.x · 60Hz | legacy DVT、无 Developer Mode 场景 |
| P1 | 现有 iOS 16.6.1 | 回归基线、旧 / 新 pmd3 对照 |
| P1 | iOS 17.4–18.1 · ProMotion | native / userspace / kernel tunnel A/B |
每台设备至少执行:30 次建链、拔插恢复、锁屏 / 解锁、Mac 睡眠恢复、30 分钟采集;默认路由候选再执行 8 小时长稳。所有报告使用“设备 A / 目标 App A”别名。
版本历史
| 版本 | 日期 | 变更 |
|---|---|---|
| v2 | 2026-09-04 | 扩展到 iOS 15+;增加三 Provider、iOS 18.2+ TCP、指标硬件要求与证据边界 |
| v1 | 2026-09-04 | 连接与系统路由 |
来源:三底座能力评估与架构调整草案 · pymobiledevice3 iOS 17+ tunnels · py-ios-device · go-ios · Apple Developer Mode