外观
P2 CoreProfile 启动阶段分析结果
结论
启动分析的产品链已经落地:选中 StartupTiming 后,Perfowl 在受控冷启动前打开唯一 CoreProfile tap,通过 pymobiledevice3 11.3.1 的同一个 DTX owner 保存 KDebug RAW v2,绑定 ProcessControl 返回的目标 PID,并生成 App Launch Total、9 类阶段、重复 Span、Gantt 时间轴及最终质量状态。
py-ios-device 2.4.26 中有这条私有协议和旧事件映射,但它不是 iOS 15+ 稳定公开契约。最终真机证据显示,iOS 17/18 的实际 lifecycle code 已明显超出旧映射;因此本批完成的是采集、归因、解码、质量和 UI 基座,跨版本阶段映射门禁仍是 partial。缺少完整开始锚点时 App Launch Total 保持 null,未匹配阶段显示 — · missing,不会把局部耗时或 0 冒充完整启动时间。
已实现产品行为
- StartupTiming 被选择时固定使用
controlled-cold-launch。 - CoreProfile 在 launch 前完成 setConfig/start ACK;Frame Time 与 StartupTiming 同选时合并过滤器,仍只有一个 CoreProfile adapter。
- ProcessControl 使用 py-ios-device 冻结链对应的 lifecycle 环境:
OS_ACTIVITY_DT_MODE=1、HIPreventRefEncoding=1、DYLD_PRINT_TO_STDERR=1。 - KDebug 按 Mach timestamp 重排,再进行 PID/TID 归因、同线程 Span stack 配对;同一 transition 固定 END 在 BEGIN 前处理。
0x31CA0006只有能闭合 UIKitcode=12打开的 Initial Frame Rendering 时才是启动终点;普通后续帧不被误判为首帧。- 实时 wire 只提前发布完整
candidate;Session finalizer 会补发最终partial/missing报告供 UI 替换。 - 工作台固定展示 9 类阶段;有值阶段显示毫秒数和时间条,缺失阶段显示
— · missing,重复 UIKit Scene Creation 保留多行。
指标与公式
| 指标 | scope / unit | 公式或映射 |
|---|---|---|
| App Launch Total | process / ms | initialFrameEndTimestampNs - systemInterfaceBeginTimestampNs |
| System Interface Initialization | process / ms | 0x1F07 code=13 → 0x2BDC code=4 arg0=10 |
| Static Runtime Initialization | process / ms | 0x2BDC code=4 arg0=10 → 0x1F07 code=1 func=end |
| UIKit Initialization | process / ms | 0x2B87 code=90 arg0=0x32 → code=21 |
| UIKit Scene Creation | process / ms | 所有完整同名 Span 求和,原始 Span 不合并 |
| willFinishLaunchingWithOptions() | process / ms | code=23 → code=24 |
| didFinishLaunchingWithOptions() | process / ms | code=25 → code=26 |
| sceneWillConnectTo() | process / ms | code=300 → code=301 |
| sceneWillEnterForeground() | process / ms | code=312 → code=313 |
| Initial Frame Rendering | process / ms | code=12 → 与之配对的 0x31CA0006 |
完整原始字段、窗口、聚合、重置、取整、质量和算法版本见 StartupTiming 启动阶段指标 v4。
自动化与构建(E2)
| 验收项 | 结果 |
|---|---|
| 冻结 CPython 3.12 全量测试 | 146/146 |
| 启动 decoder 定向测试 | 11/11 |
| Swift 全量测试 | 80/80 |
| Registry | 64 个静态 metricID,其中启动分析新增 10 项 |
| Mac App | 1.0.0 (24),x86_64,ad-hoc 深度严格签名通过 |
| App ZIP 独立解包 | 13,091 个普通文件、34 个符号链接;签名和主程序一致性通过 |
| Foundation | collector-foundation.1.5-beta,x86_64,283/283 checksum 通过 |
内部测试包:MacApp/dist/Perfowl-1.0.0-beta24-x86_64.zip,SHA-256 7334ceb7df73e070ad77ab328376b803f394eb222ca21df4ea09e1cab157adcf。
Foundation 包:MacApp/dist/collector-core/perfowl-collector-foundation-1.5-beta-x86_64.tar.gz,SHA-256 638e081b6664ae7b421012ed94a21740680e055a60e80696884b09003afc0698。
录制回放验收(E4 原始来源)
| 系统 | 身份 / drop | decoder | 结果 |
|---|---|---|---|
| iOS 16 · 设备 C / 目标 App A | verified / 0 | 632,579 records;4 spans | partial;UIKit Initialization 6.663 ms、UIKit Scene Creation 合计 24.044 ms、didFinishLaunching 2.396 ms;总耗时 null |
| iOS 17 · 设备 A / 目标 App A | verified / 0 | 1,452,935 records;2 spans | partial;UIKit Scene Creation 0.420 ms、Initial Frame Rendering 7.961 ms;总耗时 null |
| iOS 18 · 设备 B / 目标 App A | verified / 0 | 1,166,020 records;0 spans | missing;旧 lifecycle 映射未命中;总耗时 null |
这些结果证明 RAW、Mach timebase、PID/TID 与离线派生链真实可用,同时也证明旧映射不能被扩大解释为 iOS 17/18 完整阶段支持。
最终二进制真机验收(E4)
| 事实 | iOS 17 · 设备 A / 目标 App A | iOS 18 · 设备 B / 目标 App A |
|---|---|---|
| Session raw event | 642 | 508 |
| 目标身份 | verified | verified |
| drop high-water | 0 | 0 |
| KDebug records | 1,120,699 | 1,599,332 |
| 目标 lifecycle class records | 139 | 435 |
| 旧映射未知事件 | 139 | 430 |
| 最终状态 | missing | missing |
| App Launch Total | null | null |
两台设备均完成 provider、ready-before-launch、受控启动、attach、sample、stop、finalize 和 launch_trace wire 全链。missing 是兼容性门禁的正确结果,不是采集失败;最终二进制没有输出伪 0 或错误总耗时。匿名聚合证据见 启动分析 E4 JSON。
仍未关门
- iOS 17/18 新 lifecycle code 缺权威语义名称,现有 DeviceInfo trace-code 表也没有公开这些私有 App Launch 阶段名称;不能仅凭相邻顺序猜测映射。
- iOS 15 与 iOS 17.4–17.x 尚无同批真机覆盖。
- App Launch Total 尚未在 iOS 15+ 真机观察到完整 System Interface begin → Initial Frame end 双锚点。
- 阶段值尚未与 PerfDog 或 Instruments 同窗对齐,继续保持
candidate/partial/missing。
下一阶段与整体进度
下一阶段优先建立 Startup Mapping v3:对 iOS 17/18 使用可控自有 Fixture 和 Instruments/xctrace 同窗标记采集,将新 code 与阶段逐一对齐;每条映射必须至少有事件序列、目标 PID/TID、重复启动稳定性和跨 App 证据,不能从单次相邻顺序推断。映射证据不足时继续返回 missing。
整体上 P0/P1 完成,P2 主体指标完成但启动内部阶段兼容门禁开放,P3 逐帧链完成但仍待业务校准,P4 产品链完成、人工 UI 验收开放,P5 条件指标部分完成,P6 xctrace 增强研究中,P7 云端尚未开始。