MacBook Air 合盖异常掉电与蓝牙唤醒风暴排查报告¶
生成时间: 2026-08-13T00:11:41+0800
1. 问题描述¶
MacBook Air 在充满电后持续合盖约 18 小时,电量从 100% 降至 47%。用户期间没有主动使用电脑,电池健康状态正常,因此需要确认是电池故障、应用后台耗电,还是系统未能正常深睡。
2. 环境和范围¶
- 设备:MacBook Air(
Mac17,3,Apple M5) - 系统:macOS 26.6.1(25G76)
- 无线芯片:Apple N1,蓝牙固件
1.544.0.0 - 电池:循环 29 次、健康“正常”、最大容量 100%
- 附近设备:同一 Apple 账户的 Mac mini、Huawei FreeBuds Pro 3、Logitech M720 等
- 排查范围:只读检查
pmset、电源管理 ASL 日志、统一日志及蓝牙状态;未改 Wi-Fi、Handoff 或 Mac mini 配置
设备序列号和蓝牙地址未写入本报告。
3. 症状和复现¶
异常夜晚的电量曲线在屏幕关闭期间持续下降。活动监视器曾显示 ChatGPT 的“12 小时电源”很高,但该值是相对能耗评分,不能直接证明它唤醒了系统。
系统日志显示,18:00 至次日 12:02 共发生 2,275 次 DarkWake,约 126 次/小时。绝大多数唤醒原因相同:
DarkWake from Deep Idle [CDNP] :
due to smc.sysState.Wake(0x70070000)
wifibt SMC.OutboxNotEmpty centauri-beta
机器不断执行“深睡 → 蓝牙/SMC 后台唤醒 → Maintenance Sleep → 再次深睡”,平均约每 28.5 秒一次。屏幕直到用户开盖时才真正点亮,排除了合盖传感器失效和人为开屏。
4. 排查时间线¶
- 检查电池:循环次数低、健康正常、最大容量 100%,排除明显电池衰减。
- 检查睡眠断言:未发现能够解释整夜问题的普通应用防睡眠断言。
- 分析电源日志:定位到数千次
wifibt/SMC.OutboxNotEmpty/centauri-betaDarkWake。 - 对比外设使用时间:04:00 关闭 M720、开始使用 FreeBuds 后,04:00–06:59 每小时仅 4–5 次正常唤醒;07:03 后风暴才重新出现。因此 FreeBuds 持续连接不是主要解释。
- 分析蓝牙统一日志:07:03 后出现蓝牙控制器
HostwakeReport、扫描停止后仍收到设备发现事件等异常;随后明确记录同一 Apple 账户的 Mac mini 建立加密 BLE/GATT 连接。 - A/B 验证:2026-08-12 12:37:44 关闭 MacBook Air 蓝牙,保持 Wi-Fi、Handoff 和 Mac mini 不变。
5. 根本原因¶
已确认的根因范围:MacBook Air 的蓝牙路径引发睡眠唤醒风暴。
关闭本机蓝牙后,异常唤醒原因从数千次降为零,合盖耗电恢复正常,因此根因不是 ChatGPT、Clash Verge、电池老化或普通 Power Nap。
高概率但尚未单独完成 A/B 证明的具体触发器:同一 Apple 账户的 Mac mini 邻近通信。 日志明确出现 Mac mini 的 BLE/GATT 建连、加密和断开,以及以下服务组件:
CloudPairing
WirelessProximity
Wiprox
FindMyBluetooth
SPLocalBeaconManager
WPDSearchPartyAgent
最合理的解释是:Mac mini 的正常 BLE/连续互通广播触发了 MacBook Air 的 Apple N1 蓝牙控制器或 macOS 26.6.1 睡眠状态机缺陷,进而被异常放大为高频 DarkWake。Mac mini 更像外部触发条件,MacBook Air 的 N1/macOS 处理异常更像底层缺陷。
6. 已做更改¶
- 用户关闭了 MacBook Air 蓝牙,并决定日常保持关闭。
- 未修改 Wi-Fi、Handoff、Power Nap、
tcpkeepalive、SleepServices 或 Mac mini 设置。 - 未卸载 ChatGPT、Clash Verge、FreeBuds 或 M720。
该规避措施的影响是无法使用本机蓝牙耳机、鼠标、键盘,以及部分 Handoff、通用控制、Apple Watch 解锁和附近设备功能。
7. 验证¶
关闭蓝牙后的观测结果:
| 指标 | 蓝牙开启、异常夜晚 | 蓝牙关闭后 |
|---|---|---|
| 观察时长 | 约 18 小时 | 约 11.5 小时 |
| DarkWake | 2,275 次 | 40 次 |
| 平均 DarkWake | 约 126 次/小时 | 约 3.5 次/小时 |
wifibt/SMC.OutboxNotEmpty/centauri-beta |
大量出现 | 0 次 |
| 合盖电量 | 100% → 47% | 基本不变 |
DarkWake 频率下降约 97%。关闭蓝牙后保留的唤醒主要是正常的 rtc/SleepService、Maintenance 和推送维护;从 17:46 到次日 00:02,电源日志持续报告电量为 85%,没有出现可见百分点下降。
8. 调试中遇到的问题¶
- 活动监视器“12 小时电源”容易误导:它不能直接映射为耗电百分比,也不能证明某个 App 是唤醒发起者。
pmset -g log数据量很大,直接读取会产生数十 MB 输出;最终改为按日期读取/var/log/powermanagement/*.asl并按时间和事件类型过滤。- 蓝牙日志会隐藏部分设备信息,不能仅凭通用
wifibt字样锁定具体外设;需要结合 GATT 建连日志和分时 DarkWake 统计。 - FreeBuds 最初看似可疑,但 04:00–06:59 使用耳机期间睡眠正常,属于被时间线证伪的假设。
9. 可复用经验¶
- 合盖异常掉电应优先比较“本地健康 → 睡眠断言 → DarkWake 次数 → 唤醒原因 → 外设 A/B”,不要只看活动监视器累计评分。
wifibt/SMC.OutboxNotEmpty高频出现时,先做可逆的蓝牙关闭实验;一小时通常已经足够区分每小时个位数和上百次唤醒。- 必须区分“外部触发器”和“底层缺陷”:附近设备广播可能正常,真正异常的是睡眠中的 Mac 对事件处理失控。
- 若以后需要恢复蓝牙,可做短时对照:FreeBuds 入盒、M720 关闭,仅切换 Mac mini 蓝牙,分别合盖 30–60 分钟。
- 若系统更新后复发,可收集
sysdiagnose并向 Apple 提交 Apple N1、HostwakeReport和centauri相关证据。
10. 附录:可复用命令¶
查看电池健康与当前电量¶
system_profiler SPPowerDataType
pmset -g batt
查看当前睡眠设置和防睡眠断言¶
pmset -g custom
pmset -g assertions
查看近期睡眠与唤醒原因¶
pmset -g log | grep -E 'DarkWake|Entering Sleep|FullWake|Wake Requests'
查看蓝牙控制器状态¶
system_profiler SPBluetoothDataType
统计指定电源日志中的异常唤醒¶
/usr/bin/syslog -f /var/log/powermanagement/YYYY.MM.DD.asl 2>/dev/null \
| grep -c 'wifibt SMC.OutboxNotEmpty centauri-beta'
检查蓝牙与附近设备日志¶
/usr/bin/log show --start 'YYYY-MM-DD HH:MM:SS' \
--end 'YYYY-MM-DD HH:MM:SS' --style compact --info --debug \
--predicate 'process == "bluetoothd" OR process == "audioaccessoryd"'