Build52 启动交接修复验收

日期:2026-09-13 · 证据:E2 + E4 命令级 · 状态:implemented · partial

回归根因

一次复测出现九阶段全部 missing。失败 Session 的 core-profile.source-loss.raw 显示目标身份核验期间启动源仍在高速产出,而正式消费任务尚未接管;live queue 丢失一个约 12.6 MiB 块,fail-closed 语义因此将启动 Total 与阶段全部置空。问题在 Collector 交接时序,不是界面把合法值隐藏。

修复

激活同一 tap 后立即启动有界 early drain:bootstrap 先进入单一 Raw writer,身份核验期间持续消费并解码;身份确认后用可中断 Queue handoff 将剩余队列交给常规 startup/frame consumer。异步写入共用一个 writer lock,launch envelope 不再与早期 Raw 并发写入。source-loss fail-closed、64-byte gap 对齐、三类条件回调 mapping 均保持不变。

当前设备连续两次受控冷启动

项目live-fix4live-fix5
Total1845.593 ms1812.319 ms
核心阶段有值6/66/6
首个完整启动快照5431.564 ms5216.357 ms
启动 live queue drop00
目标归因记录2324
普通 sample1616

六个稳定核心阶段均有真实值:System Interface Initialization、Static Runtime Initialization、UIKit Initialization、UIKit Scene Creation、didFinishLaunchingWithOptions()、Initial Frame Rendering。两个中间 launch-trace revision 在停止前已得到完整 Total。

willFinishLaunchingWithOptions()、sceneWillConnectTo()、sceneWillEnterForeground() 两轮均未从目标观测到,保持真实 missing,不补 0。

回归边界

普通受控启动的一轮已运行态反例不计入成功轮;此前 live queue drop、bufferMode=1 缺 Total、frame drain timeout 与普通全源 drop 仍保留在证据链。两轮整体 Session 仍为 partial,不把启动源零丢包外推为全源零丢包。

当前内部测试包

ZIP:MacApp/dist/Perfowl-internal-test-Build52-x86_64.zip,107,609,825 bytes,SHA-256 8b9c35adad739204df086d86bf562a8a5e95376bf3a3961017f9f552c5a71d20;DMG:MacApp/dist/Perfowl-internal-test-Build52-x86_64.dmg,140,192,014 bytes,SHA-256 e67ecdc6dd843c73442905f8ba14e4fab054acaf57eec1dfbae3cf1ff25d5d38。App、ZIP 独立解包及 DMG 挂载后的严格签名验证均通过。当前无 notarytool Keychain profile,尚未 notarize/staple,GPL-3.0 法务门禁仍开放,因此包状态为 partial。

结论

启动源交接修复已在 E4 命令级连续两次冷启动中通过:核心阶段与 Total 恢复,启动源 live queue drop 为 0。

整体交付仍为 partial:首个完整快照约 5.15/5.19 秒,未达到 ≤1 秒;完整报告≤2秒、frame drain、普通全源队列、原生 UI 像素、Notary/stapling 与 GPL-3.0 法务门禁继续开放。