Skip to content

能耗、电池与热状态总览:三层证据模型与边界 ​

先看结论

  • Process Energy Cost 是 Apple 私有加权算法给出的软件成本分,不是物理单位瓦特(W)或焦耳(J),不能换算成毫安时(mAh)耗电量。
  • Battery Current/Voltage/Power 只在设备真正处于纯电池放电状态时才有物理意义;插着 USB 时这三项正确地保持空值,这是 fail-closed 保护,不是采集故障。
  • Thermal Status 是系统给出的状态枚举,不是 Perfowl 根据电池温度反推出来的派生值;当前团队没有找到可跨 iOS 版本验证的稳定当前值来源,不用固定温度数字(如 35/38/41℃)映射 nominal/fair/serious/critical。
  • 电池温度 ≠ SoC 温度 ≠ 机身表面温度,三者是不同测量点,长稳测试中性能下降与温升同窗出现只能提示 thermal 影响的可能性,不能单独作为确诊依据。

Energy、Battery Electrical、Battery Temperature 与 Thermal Status 的边界

图:四层信号不能互相换算;尤其不能用固定电池温度阈值反推出系统 Thermal Status。


0. 当前实现摘要 ​

本领域覆盖三个独立的证据层:Process Energy Cost(七项 source-native 成本分,经 com.apple.xcode.debug-gauge-data-providers.Energy DTX debug gauge 采集)、Battery Electrical(Current/Voltage/Power 三项设备级电学量,经 com.apple.mobile.diagnostics_relay 诊断接口采集,需 battery-only 门禁成立)、Battery Temperature 与 Thermal Status(同样经诊断接口采集,20 秒固定节拍)。四页由旧版 energy-battery-thermal.md 拆分而来,拆分与冻结依据详见 Energy/Battery/Thermal 技术演进与实验。

1. 这个领域到底观察什么 ​

本领域回答三个不同层级的问题:目标 App 的 source-native Energy cost 如何变化;设备在 battery-only 门禁成立且字段语义得到验证时,电池电流/电压/功率候选值如何;设备当前的电池温度与系统热状态如何。三层不能互相替代,也不能强行折算成同一个“能耗健康分”。

2. iOS 系统原理:三层证据为什么彼此独立 ​

text
[第 1 层:进程软件能耗成本分]
ios.process.energy.* —— Apple Debug Gauge 闭源加权算法给出的相对评分(0 起,无固定上限说明)
  │  与第 2 层的关系:相关但不等价——高 Energy 分不直接等于高放电电流
  ▼
[第 2 层:设备物理电池电学量]
ios.device.battery.current / voltage / power —— 系统电源管理维护的真实物理量,仅 battery-only 时有意义
  │  与第 3 层的关系:相关但不等价——高放电电流不直接等于高温
  ▼
[第 3 层:电池温度 / 系统热状态枚举]
ios.device.battery.temperature_* / ios.device.thermal.status —— 热敏传感器读数 与 系统状态枚举,两者也不是同一件事

Energy 的加权算法是 Apple 闭源实现,Perfowl 无法也不应重新推导;Battery 电学量的物理意义依赖"是否处于纯电池放电状态"这一前提条件;Thermal Status 概念上类似公开 API ProcessInfo.thermalState 的 nominal/fair/serious/critical 四态,但当前 source 是诊断接口字段,尚未证实与公开 API 语义完全一致。

3. 本领域指标地图 ​

指标metricIDscope回答什么问题
Process Energy Costios.process.energy.total_cost 等 7 项process目标 App 的 source-native Energy cost 相对趋势
Battery Electricalios.device.battery.current / .voltage / .powerdevicebattery-only 条件下的放电电学量候选;当前产品状态 Unsupported
Battery Temperatureios.device.battery.temperature_raw / .temperature_celsiusdevice电池自身温度
Thermal Statusios.device.thermal.statusdevice系统热压力状态;不等价于“已经发生具体降频”

4. Perfowl 当前怎样取得这些事实 ​

Energy 经 pymobiledevice3 原生 EnergyMonitor(provider, [pid]) 按目标 PID 订阅 Debug Gauge 通道;Battery Electrical / Temperature / Thermal Status 均经 Lockdown 通道下的 com.apple.mobile.diagnostics_relay 诊断服务读取 IOPMPowerSource 电源信息,按"首次立即 + monotonic 固定 deadline 20 秒"节拍采样,超时跳过已错过窗口、不做追赶式补发(详见演进文章第 6 节)。

5. Scope / Identity / Runtime Condition ​

  • Process Energy Cost 是 process scope,经目标 PID 与身份核验过滤;
  • Battery Electrical / Temperature / Thermal Status 均是 device scope,反映整机状态,不针对目标 App 单独归因;
  • Battery Electrical 额外依赖 battery-only 门禁(ExternalConnected=false 且 IsCharging=false 且 InstantAmperage<=0),门禁不成立时三项一律 missing,不产出 0 或符号不明的数值;
  • Battery Temperature 的采集独立于该电学门禁,USB 连接时仍可正常产出。

6. 指标应该怎样组合阅读 ​

排查“发热/掉电”类问题的推荐顺序:先看 Process Energy Cost 的 source-native 分项趋势 → 若要观察电池物理放电,再看 Battery Electrical(前提:battery-only 门禁成立且字段语义已验证;当前产品状态仍是 Unsupported)→ 关注长稳场景是否伴随温升与帧表现变化,同时看 Battery Temperature 与 FrameTime → Thermal Status(当前来源仍不稳定)只能提供系统热压力状态线索,不能单独证明 CPU/GPU 已经发生具体降频。

7. 常见异常形态:观察 → 候选原因 → 交叉验证 → 不能确认 ​

观察到的现象候选原因(需交叉验证)下一步验证不能确认的结论
页面静止但某个 Energy 分项持续偏高未停止的定位监听、未停止的后台任务等候选方向检查对应能力声明(定位精度/后台模式)与代码是否及时停止不能仅凭 Energy 分值判断具体是哪一行代码
长时间高负载后帧率明显下降热压力影响、CPU/GPU 高负载或其他资源竞争都可能参与结合 Thermal Status(若证据可信)、Battery Temperature 趋势、APP CPU/GPU 综合判断并做冷却复测Thermal Status 或温度变化都不能单独证明“CPU/GPU 已经发生具体降频”
Energy Total 出现负值源端哨兵行为(source-sentinel),不是真实负成本检查该窗口质量字段是否为 source-sentinel,不要当作真实负值展示不能把负值当作"能耗为负"的物理事实
USB 连接下 Battery Current/Voltage/Power 显示为空fail-closed 保护正常工作确认设备是否连接外部电源;若需要电学数据需物理断开 USB 并保持 Wi-Fi不是采集故障,不应尝试"修复"这个空值

8. 连续性、质量、missing / 0 / warmup ​

  • Energy 七项:Total 为负时整帧关闭为 source-sentinel;单项为负只使该项 missing;身份未核验为 identity-unverified;真实 0 予以保留;
  • Battery Electrical:battery-only 门禁不成立、字段缺失或电流为正(非放电方向)→ 三项均 missing(标记 external-power-connected);
  • Battery Temperature:字段存在且在合理范围 → candidate;字段缺失 → missing;判定独立于 Battery Electrical 的门禁;
  • Thermal Status:字段存在且可解析 → candidate;来源不稳定或缺失 → missing(source-missing)。

9. 当前证据与平台覆盖(如实披露,这是本领域证据强度差异最大的部分) ​

  • Process Energy Cost:证据状态最好。CORE-19(2026-09-05)iOS 17/18 真机已证明来源、身份核验、负值哨兵与交付闭环;跨领域自校准器复测显示 13 项中 9 项取得有效数值,Energy 相关分项全部在内。仍未完成:负载响应场景覆盖不全(静止短场景无有效数值变化)、与 PerfDog 等第三方工具的同窗数值对齐。
  • Battery Electrical:产品状态 Unsupported。CORE-20(2026-09-05)已验证 fail-closed 门禁与 20 秒节拍本身工作正确(E4:iOS 17/18 各产生 2 个 Device Condition raw,间隔 19.983/19.987 秒),但两次真机验收时设备均处于外接电源状态,截至最新已整理的 devlog 时间线,从未取得过一次真实的 battery-only 放电数值。
  • Battery Temperature:产品状态 Partial。已在 iOS 17/18 真机验证可独立于电学门禁正常产出(如 33.09–34.39℃ 范围的真实读数)。
  • Thermal Status:产品状态 Partial。已审计 Battery IORegistry、完整 IOService 平面、MobileGestalt 与当前 DVT/Diagnostics 接口,未发现可跨 iOS 版本验证的稳定 0–3 当前值来源,两组真机条件快照均为 missing。

详见 Energy/Battery/Thermal 技术演进与实验 的完整实验记录。

10. 常见误区 ​

  • 把 Energy Cost 分值当作物理瓦特/焦耳单位,或据此推算 mAh 耗电量;
  • 把"USB 连接下 Battery 三项显示为空"当作采集故障,尝试绕过这个保护;
  • 用固定温度数字(如"超过 40℃")直接断定已触发系统 Thermal Throttling;
  • 把电池温度当作 SoC 温度或机身表面温度使用;
  • 用电池温度或 Energy thermal cost 反推 Thermal Status——这不是当前团队验证过的方法;
  • 把 Unsupported(Battery Electrical)或 Partial(Temperature/Thermal Status)当作已经生产可用。

11. 指标 Canonical 与技术演进入口 ​

12. 继续阅读 ​

Perfowl · Performance Observer