Skip to content

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 冒充完整启动时间。

已实现产品行为

  1. StartupTiming 被选择时固定使用 controlled-cold-launch
  2. CoreProfile 在 launch 前完成 setConfig/start ACK;Frame Time 与 StartupTiming 同选时合并过滤器,仍只有一个 CoreProfile adapter。
  3. ProcessControl 使用 py-ios-device 冻结链对应的 lifecycle 环境:OS_ACTIVITY_DT_MODE=1HIPreventRefEncoding=1DYLD_PRINT_TO_STDERR=1
  4. KDebug 按 Mach timestamp 重排,再进行 PID/TID 归因、同线程 Span stack 配对;同一 transition 固定 END 在 BEGIN 前处理。
  5. 0x31CA0006 只有能闭合 UIKit code=12 打开的 Initial Frame Rendering 时才是启动终点;普通后续帧不被误判为首帧。
  6. 实时 wire 只提前发布完整 candidate;Session finalizer 会补发最终 partial/missing 报告供 UI 替换。
  7. 工作台固定展示 9 类阶段;有值阶段显示毫秒数和时间条,缺失阶段显示 — · missing,重复 UIKit Scene Creation 保留多行。

指标与公式

指标scope / unit公式或映射
App Launch Totalprocess / msinitialFrameEndTimestampNs - systemInterfaceBeginTimestampNs
System Interface Initializationprocess / ms0x1F07 code=130x2BDC code=4 arg0=10
Static Runtime Initializationprocess / ms0x2BDC code=4 arg0=100x1F07 code=1 func=end
UIKit Initializationprocess / ms0x2B87 code=90 arg0=0x32code=21
UIKit Scene Creationprocess / ms所有完整同名 Span 求和,原始 Span 不合并
willFinishLaunchingWithOptions()process / mscode=23code=24
didFinishLaunchingWithOptions()process / mscode=25code=26
sceneWillConnectTo()process / mscode=300code=301
sceneWillEnterForeground()process / mscode=312code=313
Initial Frame Renderingprocess / mscode=12 → 与之配对的 0x31CA0006

完整原始字段、窗口、聚合、重置、取整、质量和算法版本见 StartupTiming 启动阶段指标 v4

自动化与构建(E2)

验收项结果
冻结 CPython 3.12 全量测试146/146
启动 decoder 定向测试11/11
Swift 全量测试80/80
Registry64 个静态 metricID,其中启动分析新增 10 项
Mac App1.0.0 (24),x86_64,ad-hoc 深度严格签名通过
App ZIP 独立解包13,091 个普通文件、34 个符号链接;签名和主程序一致性通过
Foundationcollector-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 原始来源)

系统身份 / dropdecoder结果
iOS 16 · 设备 C / 目标 App Averified / 0632,579 records;4 spanspartial;UIKit Initialization 6.663 ms、UIKit Scene Creation 合计 24.044 ms、didFinishLaunching 2.396 ms;总耗时 null
iOS 17 · 设备 A / 目标 App Averified / 01,452,935 records;2 spanspartial;UIKit Scene Creation 0.420 ms、Initial Frame Rendering 7.961 ms;总耗时 null
iOS 18 · 设备 B / 目标 App Averified / 01,166,020 records;0 spansmissing;旧 lifecycle 映射未命中;总耗时 null

这些结果证明 RAW、Mach timebase、PID/TID 与离线派生链真实可用,同时也证明旧映射不能被扩大解释为 iOS 17/18 完整阶段支持。

最终二进制真机验收(E4)

事实iOS 17 · 设备 A / 目标 App AiOS 18 · 设备 B / 目标 App A
Session raw event642508
目标身份verifiedverified
drop high-water00
KDebug records1,120,6991,599,332
目标 lifecycle class records139435
旧映射未知事件139430
最终状态missingmissing
App Launch Totalnullnull

两台设备均完成 provider、ready-before-launch、受控启动、attach、sample、stop、finalize 和 launch_trace wire 全链。missing 是兼容性门禁的正确结果,不是采集失败;最终二进制没有输出伪 0 或错误总耗时。匿名聚合证据见 启动分析 E4 JSON

仍未关门

  1. iOS 17/18 新 lifecycle code 缺权威语义名称,现有 DeviceInfo trace-code 表也没有公开这些私有 App Launch 阶段名称;不能仅凭相邻顺序猜测映射。
  2. iOS 15 与 iOS 17.4–17.x 尚无同批真机覆盖。
  3. App Launch Total 尚未在 iOS 15+ 真机观察到完整 System Interface begin → Initial Frame end 双锚点。
  4. 阶段值尚未与 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 云端尚未开始。

Perfowl · Performance Observer