外观
P2 Startup Mapping v3 方案
目标
在不修改、不注入目标 App 的前提下,为 iOS 17/18 的 CoreProfile 启动事件建立可复查的候选清单,并且只把有独立语义证据、跨启动稳定且可完整配对的事件提升为正式阶段映射。
本批不根据事件先后顺序猜名称,不把 xctrace 总耗时拆成 Perfowl 内部阶段,也不把一次 App 的偶然 code 扩大为系统版本规则。
先冻结的映射门禁
每条新映射必须同时满足:
- CoreProfile 在受控冷启动前 ACK-ready,目标身份 verified,drop high-water 为 0。
- 事件通过目标 PID/TID 归因;跨 generation、无归因记录和非目标线程不参与。
- BEGIN/END 在同一线程闭合,Mach timestamp 单调,负时长和未闭合 Span 一律拒绝。
- 同一系统小版本至少 3 次冷启动重复出现,并在至少 2 个不同 App 中保持相同角色。
- 有 Apple Instruments/xctrace 同窗标记、设备 trace-code 符号或可控 Fixture marker 之一作为独立语义证据;只有“位置相邻”不算证据。
- 没达到 1–5 的 code 只进入匿名 census,状态保持
unmapped,业务指标继续missing/partial。
数据与公式
指标公式沿用 core-profile-app-lifecycle.candidate.v2,本批不更改已有 phase 时长和 App Launch Total 公式。新增的是映射审计:
text
baseDebugID = debugID & 0xFFFFFFFC
func = debugID & 0x3
code = (debugID & 0xFFFC) >> 2
relativeOffsetMs = (eventTimestampNs - firstTargetLifecycleTimestampNs) / 1,000,000
occurrenceRate = sessionsContainingFingerprint / eligibleSessionCount- fingerprint 由
baseDebugID + func构成,避免把同一事件携带的长度、计数或地址拆成大量伪 code。 arg0作为 fingerprint 下的独立直方图:仅在0...65535时保留数值,更大的值归为large-or-pointer;它只能作为后续 predicate 证据,不能单独赋予阶段语义。- 聚合只输出 session 数、App 别名数、系统版本数和出现率,不输出设备标识、Bundle ID、PID 或 TID。
完整质量语义先入档于 StartupTiming 启动阶段指标 v5。
实施顺序
- 增加确定性
startup-map审计器,读取冻结 Session,输出匿名 code census 与映射门禁结果。 - 为报告补 schema、参数归一化、确定性排序、空 Session、错误身份和多 Session 聚合测试。
- 对现有 iOS 16/17/18 RAW 回放,确认旧映射与 unknown census 不互相污染。
- 在当前 iOS 17/18 设备上对两个不同目标 App 重复冷启动;如 xctrace 可用则录制 App Launch 同窗 trace。
- 只有证据满足门禁才修改
_lifecycle_actions;否则交付“采集与审计完成、映射保持开放”的诚实结果。
停止条件
- xctrace 设备离线、Fixture 无签名或缺少第二 App 不阻止 census 工具交付,但会阻止新 code 提升。
- 任一真机 Session identity 非 verified、drop 非 0 或 raw 校验失败,停止该样本进入映射候选集。
- 文档与匿名证据中不得出现设备名、UDID、Bundle ID、PID、证书或账号信息。