外观
连接与系统路由
Perfowl 当前以 USB 主链连接 iOS 真机,同时可发现 usbmuxd 已知的 Network/Wi-Fi 拓扑;不同 iOS 版本走不同的系统通道,路由会被显式记录进采集事件。
系统路由矩阵
| iOS 版本 | 通道 | 预期路由 | Perfowl 状态 |
|---|---|---|---|
| iOS 15.x | D1 Legacy | Lockdown / usbmux | 路由合同 E2;本页无真机 E4 |
| iOS 16.x | D1 Legacy | Lockdown / usbmux | ✅ 真机实测(iOS 16.6.1:发现、Lockdown、Developer image、DVT 只读链全部通过) |
| iOS 17.0 – 17.3 | D2 Early 17 | 受控 privileged tunneld(RemoteXPC) | 代码路由已实现,真机回包待验证(B-VAL 门禁) |
| iOS 17.4–17.x | D3 Modern | macOS native / no-root 优先 | Host 选择 route 与 provider 实际 route 同时入事件;真机待验收 |
| iOS 18.x | D3 Modern | macOS native / no-root 优先 | 已有 iOS 18.2 E4 路由证据 |
| iOS 26.x / 27.x | D3 Modern | usbmux 请求,native remoted 优先,userspace/tunneld 回退 | 2/2 平台路由与 Collector --native 参数已通过 E2 Fixture;真机通道、schema 与值待 E4 |
路由判定不靠猜:Host 选择的 route(如 --connection-route)与设备侧 provider 实际使用的 route 会一起写入采集事件,供事后审计。
Host 要求
| 项 | 当前状态 |
|---|---|
| 操作系统 | macOS;Intel已有历史验证。Apple Silicon已有源码E2及本次只读通道E3,完整冻结产品、GUI与指标验收仍待 |
| Xcode / xctrace | 可选。缺失 Xcode 时基础采集完全可用;xctrace 仅用于按需深度诊断增强 |
| Developer Mode | 目标设备需开启,并完成配对信任(Trust) |
连接方式边界
- USB:当前正式主链。Perfowl 只对
usbmux list --usb返回的物理路由显示 USB,usbmuxd 事件驱动刷新,不把 Network 变化冒充 USB 插拔。 - Wi-Fi:可通过
usbmux list --network --simple发现拓扑,随后在后台以 4 秒有界lockdown info --udid DEVICE并行验证。可达时补全真实名称/型号/版本并允许进入 App/DVT 准备;不可达时标记“当前离线”,不冒充在线设备。成功身份只记在本机 Application Support,不进入 Session、文档或提交;Network 查询与身份水化均不阻塞 USB 发现。 - 模拟器:不用于任何指标结论。
发现、可达与就绪是三个状态
| 状态 | 含义 | 界面行为 |
|---|---|---|
| 已发现 | usbmuxd 存在 USB 或 Network 拓扑记录 | 允许在选择器中展示,不渲染为绿色 Ready |
| 可达 | Lockdown 身份查询在有界时间内成功 | 允许继续读取 User App 与准备系统服务 |
| 已就绪 | App 目录和所选路由的 DVT 服务完成 | 顶部状态点才显示绿色,且可开始测试 |
无缓存且离线的 Network 记录统一归入“历史 Wi-Fi 设备”;有缓存但离线的记录可显示已记住名称并提供重试。只有本轮验证为 reachable 的 Network 行才响应选择并进入设备准备。
后台拓扑刷新不再把已就绪设备降级为“正在准备”;只有 App 列表正在读取或连接服务正在准备时,工作台才显示阻塞遮罩。
常见限制
- 首次连接需在设备上完成信任确认;Developer image 需已挂载(Perfowl 只读使用,不修改设备);
- 采集链不修改、不注入、不重签目标 App;用户开始测试时可通过系统 ProcessControl 启动所选 App,Startup 使用唯一一次受控冷启动,见无侵入边界。
版本历史
| 版本 | 日期 | 变更 |
|---|---|---|
| v9 | 2026-10-18 | 完整ARM内部冻结候选与开发签名核验(E2);静态OpenSSL、symlink闭包检查及安装门分层。 |
| v8 | 2026-10-18 | 区分iOS开发签名与Mac Developer ID;字段目录按实际类型留证;ARM源码及只读通道不升级为指标E4。 |
| v7 | 2026-10-18 | 全新验收与历史迁移分别准入;固定依赖解析需检查完整TLS日志,版本存在、wheel架构匹配、安装与运行资格分别核对。 |
| v6 | 2026-10-18 | 新Apple Silicon主机的源码编译与工具资格分层;Swift6.1兼容修复仅E2,不代表Intel冻结工具、签名包或设备通道恢复。 |
| v5 | 2026-10-17 | 显式native在精确USB缺项异常下直接核真实RSD 身份/版本;物理USB、枚举与服务可用分层,软件及只读资格不等于正常UI指标验收。 |
| v4 | 2026-09-08 | 显式加入 iOS 26/27 modern route E2 candidate,修正自动启动与无侵入边界的表述 |
| v3 | 2026-09-07 | USB 先返回,Network 后台有界水化;增加本机身份缓存、reachable/offline 语义与历史记录分组 |
| v2 | 2026-09-07 | 明确 USB 主链与 Wi-Fi 拓扑发现/按需可达性验证;冻结发现、可达、就绪三态及有界失败语义 |
| v1 | 2026-09-04 | 首次发布;整理自 F0 连接冒烟、Batch A 路由分层与 B 批次路由审计 |
来源批次:P4 Wi-Fi 身份与停止/时间轴结果 · P4 设备发现与准备状态机修复 · F0 连接冒烟 · Batch A · B 批次
物理已直连,但USB枚举仍缺项 · 2026-10-17(E2/E3)
表现与判断:本批硬件USB序列正规化后精确匹配目标,CoreDevice列wired,usbmux却只有Network;USB专用Lockdown入口报DeviceNotFoundError。设备是否插线、某份枚举是否当前包含USB、实际DVT是否可用必须分开核对,不能仅凭一个列表让用户重复插线,也不靠CoreDevice缓存宣称可采集。枚举缺项的系统根因尚未确认。
已验证机制与避免方式:对Owner明确选择的native路线,且只在USB缺项这一特定异常下,用同一精确目标一次打开系统原生RSD并核实际设备身份与iOS≥17;错误/缺身份或坏版本关断,配对/权限/取消等其他错误仍原样失败,不跨路由、不自动重试、不建常驻隧道。没有改变USB拓扑标签,不能把Network行冒充物理USB事件;iOS16正常USB路径保持。源码控制15项、核心54/启动390/实时60通过,实际新入口只读双查询可通。
限制:这是特定现场的有界服务资格,不是所有系统/设备可用或正常产品UI全流程通过。参考与产品仍共享系统服务、缓存新鲜度未知;ProviderLease的关闭返回不独立证明所有底层关闭完整。匹配包/正常UI正式五轮未完成前不登记指标通过。开发记录 · 快照。
换机时分开核源码、架构与设备资格 · 2026-10-18(E1 / E2 / E3)
表现与定位:旧Intel主机能构建的源码,在Apple Silicon的Xcode16.4 / Swift6.1.2上首次完整构建报两个Optional Bool switch穷尽性错误和一个图表表达式类型检查错误。拆分表达式后进一步定位到CGFloat/Double运算符歧义。这是本次编译器组合的实际诊断,不能据此认定手机指标数值错误,也未证明所有旧版Swift都有同样问题。
已验证处理:显式匹配Optional三态、拆分有类型的图表数据与绘制表达式、显式转换坐标比例后,完整ARM GUI/Core release源码编译通过;Lab当前9源也在真实iPhoneOS18.5 SDK完成unsigned链接。原始缺值分段、极值采样与轴计算没有变更。复现时保留失败日志、编译器/SDK和源码SHA;先验证源码,不通过放宽指标门解决编译失败。
恢复限制与避免方式:ARM源码编译通过,不意味着旧Intel冻结包可用。当前冻结脚本及libdeflate归档仍有x86_64限制,必须核Python、native模块、动态库和GUI实际选择的工具目录;Rosetta下解释器能启动只是其中一项。只读CoreDevice列表可见也不证明物理USB、Lockdown、DTX 或配方通道就绪;应分别绑定同一设备核对。新候选签名/安装、实际run容量、新主机工具资格和新诊断齐备后才准入正式采集。历史迁移缺失单列审计缺口,不要求完整旧归档先迁齐;需要归位的手机原件可直接导出到新机并逐件核SHA后保留归位,不能省略保全或伪填容量收据。旧attempt的四成功轮与第五失败保持,不拼接补轮。
本节是新主机软件兼容与只读恢复知识,未新增指标E4,也未宣布Apple Silicon整包原生可用。方案、失败与实际结果。
固定依赖报“找不到版本”时先核TLS与架构 · 2026-10-18(E1 / E3)
表现与机制:pip的末尾可以同时出现No matching distribution found,而真正的早期错误是CERTIFICATE_VERIFY_FAILED、导致索引被跳过。本次默认Python3.12的CA路径无有效证书文件,首次原始stdout已记录证书错误;只看stderr中的最后一行会误判成固定版本不存在。
判断与避免:保留完整stdout/stderr和执行环境;先使用本机现有系统CA对官方固定版本元数据做验证,再分别核版本、Python条件、wheel架构/最低OS与摘要。CA配置只传给该命令,不禁用TLS、不以换版本掩盖索引连接失败。官方元数据能读取只证明网络和文件声明,仍需实际解析、安装、加载与运行核对。
适用范围与限制:本次系统CA验证成功,pymobiledevice3 11.3.1的wheel/sdist摘要与已提交锁相同;102个固定版本均有官方元数据,但cryptography 50.0.1没有匹配本机Intel目标的macOS wheel,hexdump 3.3仅有sdist。缺wheel仍需评估固定版本源码构建或先文档化架构方案,不能解释成整个库不存在,也不能直接修改锁。此结果不证明新采集环境、签名包或手机通道可用。恢复开发记录 · 固定上游发布文件 · 固定冻结器发布文件。
签名类别与服务返回类型分别核对 · 2026-10-18(E2 / E3)
签名表现与判断:Mac的Developer ID Application身份未检出,不足以判断iOS自有Lab无法签名。本次用户指出CodeSign4QC存有profile后,实际找到可匹配的开发资料。判断时逐项核有效期、Team、应用覆盖、设备覆盖、证书和entitlements,再对新构建副本实际签名、严格验证、提取leaf及独立解包核SHA;只看到证书名称或profile文件不足以证明私钥可用。同Team/应用兼容也不证明旧安装leaf相同。
适用边界与避免方式:本次新Lab签名和解包核同通过E2,未安装,未证明Mac包满足Developer ID交付要求。证书/profile/设备身份只放私有证据,不导出私钥或密码,不通过通用重签/注入流程处理目标App。自有测试Lab的开发签名不改变无侵入产品边界。
服务类型表现与处理:固定SDK的sysmon字段目录在本机实际返回set,初版资格脚本因list断言而失败。先保存实际响应及类型,再检查内容与字段覆盖;将检查器类型假设错误与服务连接故障分开,不能只凭一次断言失败判定DTX或指标失败。该只读链已核物理USB、现有配对、RSD同目标及DTX字段目录(E3),没有验证字段实际采样、刷新或配方执行。未知schema仍应停止并保留unknown,不能为通过检查放宽数值门。
ARM冻结包的链接、缓存和安装边界 · 2026-10-18(E2)
表现与机制:旧Intel冻结脚本对本机ARM及固定依赖的静态OpenSSL布局不适用。依赖版本相同不代表native布局相同;静态cryptography/sslpsk不能要求存在另一组host动态库。缓存若包含脚本调用路径,也会因相对/绝对路径差异而重复冻结。
验证与避免方式:固定同一版本列表,分架构固定native输入,核真实Mach-O及OpenSSL依赖;仅动态布局携带相应库,并保留私有pair隔离。缓存键核源/native/metadata字节和ABI,不以目录存在即命中;按内容构造稳定键,缓存返回仍执行真实probe。新机实际三runtime缓存执行文件SHA/mtime保持,不能用此推断设备采集性能。
symlink诊断:PyInstaller的包内依赖可能通过symlink别名位于根目录,真实文件则在包子目录。扫描器应保留链接并按实际模块及load/rpath上下文核闭包,不将别名路径的误解析认作缺库;禁止靠host搜索路径掩盖真正缺项。本批首个检查器失败保留,修正后318个ARM Mach-O包内闭包及签名后真实命令通过。官方symlink说明。
证据边界:完整ARM App及DMG已用现有Apple Development私钥签名、严格验证和独立只读挂载全树核同(E2),89个冻结Core模块与当前源码核同;未安装或启动GUI。开发签名不等同Mac Developer ID交付,Gatekeeper实测未通过;标准安装签名类别需按Owner决定处理。新GUI、参考/开销、配方、诊断、实际容量和完整五轮仍待;没有新增指标验收。方案与失败/结果 · 快照。
Python入口与参考配置的恢复检查 · 2026-10-18(E2 / E3)
Python入口表现:对venv的Python可执行入口使用Path.resolve()可能跟随符号链接到基础解释器;该基础解释器缺少venv依赖,即使此前在venv里测试通过,子进程仍会导入失败。本次失败发生在SDK导入前、手机调用0。调用时保留venv入口的绝对路径,记录实际解释器与依赖版本,不能因为包已经安装就假定任何同名Python都有它。
配置检查表现:自有Lab的CPU有效配置仅在中断参考开启时写入interruptReferenceEnabled及API字段,OFF时这些字段缺席;明确关闭值仍须在plan及完整请求中核同,全部原生reference须为null。应依据当前源码和原件条件字段做检查;不得把检查器的缺字段错误判成手机执行失败,也不能把任意未知缺项默认成关闭。该结论仅适用本次固定Lab schema;其他版本重新核源码。
通道边界:当前机新一次Apple CoreDevice只读详情返回成功且目标身份核同,不能替代payload-URL配方、同生命回执、产品Session及完整指标诊断。DTX参数配方与Apple命令通道分层记录。上述方法与失败原件来源:新机attempt方案及增量。
| 修订 | 日期 | 内容与来源 |
|---|---|---|
| 恢复检查补充1 | 2026-10-18 | venv符号链接入口、参考条件字段、Apple只读与配方分层;同上恢复devlog。 |
安装超时与实际落地分开核对 · 2026-10-21(E2 / E3)
表现:自有测试台候选先后两次安装等待超时,第二次有完整阶段证据:IPA上传/回读SHA通过、命令发送返回,但90秒内没有completion/progress;当时查询仍旧版本。保存全部失败与暂存后,核同封口/无待执行请求,只正常退出已封口自有生命一次;后续两次查询实际新版本、暂存为空,期间没有第三次安装命令。
判断与避免:主机等待超时不能等同系统未执行。把上传、包SHA、发送意图/发送返回、completion及新鲜实际版本查询分别记录;任何发送后异常仍为unknown,保留包与证据,先核版本、身份、旧数据和执行器终态。不能立即重发,不能只凭progress、目录为空或connected状态宣布安装成功。单次正常退出后落地是本机观察顺序,尚未证明进程占用为根因,也不能区分两个未知事务中哪一个完成;正常退出前须确认同生命及全部负载封口,不反复追逐新生命。该案例仅适用于自有App开发测试安装,不授权操作第三方App。
通道与日志边界:本机native RSD安装代理只读lookup成功,而Apple CoreDevice lockState在连接阶段失败;paired/wired/connected不等于所有Apple命令通道可用,更不能据失败推断锁屏。日志导出请求16MiB软限仍增长,主机32MiB硬限停止后仅有不完整archive;log show拒绝解析,未获得根因证据,不把部分归档当完整日志或继续无界下载。
版本历史增量:installation-phase-reconciliation/1,2026-10-21;E2九项transport及28项既有升级控制、E3版本/暂存/封口观察,指标正式状态不变。方案、实际结果及限制。