事件背景
起因是之前发现 21 款的 MBP 电池不耐用了,所以就去 Apple Store 上检测了一下电脑;检测后电池寿命是 82%,还不能换电池……
不过有趣的是,确实和系统设置内的电池健康度不一样(86%):
于是就好奇,是不是有其他地方有电池的日志?
确实有,省流版本,Terminal 运行:
ioreg -rn AppleSmartBattery | awk '/AppleRawMaxCapacity/ {raw=$NF} /DesignCapacity/ {design=$NF} END {printf "电池健康度: %.1f%%\n", raw/design*100}
ioreg 命令
网上冲浪🏄♂️了一下,发现 macOS 自带 ioreg
这个用于查询 I/O 注册表和信息结构:
我们可以用这个命令查询设备树相关信息。常用的命令:
选项 | 说明 |
---|---|
ioreg -l | 显示所有设备的完整属性(比较长) |
ioreg -p IODeviceTree | 查看设备树(类似 Linux 的 lspci ) |
ioreg -p IOService | 默认平面,显示服务层设备信息 |
ioreg -c IOService | 仅显示 IOService 类及其子类的设备 |
ioreg -k BatteryPercent | 查找包含 BatteryPercent 属性的设备(如电池信息) |
ioreg -n AppleSmartBattery | 显示名为 AppleSmartBattery 的设备信息 |
ioreg -a -x | 以 XML 格式输出,适合脚本解析 |
ioreg -r -d 1 | 递归查询并限制深度为 1,即: 仅显示顶层设备(常用) |
电池健康度
查看电池健康就是这个AppleSmartBattery
:
主要的信息,配合 AI 分析,应该是:
电池状态
字段 | 值 | 说明 |
---|---|---|
CurrentCapacity | 100 | 当前电量百分比(100% 表示满电) |
MaxCapacity | 100 | 电池最大容量(百分比) |
FullyCharged | Yes | 是否已充满电 |
IsCharging | No | 当前是否在充电 |
ExternalConnected | Yes | 是否连接了电源适配器 |
ExternalChargeCapable | Yes | 电源适配器是否支持充电 |
电池硬件信息
字段 | 值 | 说明 |
---|---|---|
DeviceName | "bq40z651" | 电池控制器芯片型号(TI 的 BQ40Z651 电量计) |
DesignCapacity | 6075 | 电池设计容量(单位:mAh) |
NominalChargeCapacity | 5107 | 当前实际可用容量(可能因老化降低) |
CycleCount | 216 | 电池循环次数(216 次) |
DesignCycleCount9C | 1000 | 电池设计循环寿命(1000 次) |
Temperature | 3061 | 电池温度(单位:0.1K,3061 = 30.61°C) |
Serial | "F8Y3******LTAR" | 电池序列号 |
如果我们想过滤看看电池是否在充电,配合 grep 我们过滤一下:
ioreg -n AppleSmartBattery -r | grep -E "CurrentCapacity|FullyCharged|IsCharging|ExternalConnected" | paste -sd ' '
你也可以再优化一下:
# 提取为 key = value
ioreg -n AppleSmartBattery -r | grep -Eo '"CurrentCapacity" = [0-9]+|"FullyCharged" = \w+|"IsCharging" = \w+|"ExternalConnected" = \w+'
AppleRawMaxCapacity 是当前的电池容量,DesignCapacity 为设计容量;那么配合 grep
来查看电池的健康度:
# 输出 电池健康度: 81.6%
ioreg -rn AppleSmartBattery | awk '/AppleRawMaxCapacity/ {raw=$NF} /DesignCapacity/ {design=$NF} END {printf "电池健康度: %.1f%%\n", raw/design*100}'
# 输出 当前最大容量: 4957 mAh | 设计容量: 6075 mAh | 循环次数 216 次 | 健康度: 81.6%
ioreg -rn AppleSmartBattery | awk '/AppleRawMaxCapacity/{raw=$NF} /DesignCapacity/{design=$NF} /CycleCount/{cycle=$NF} END{printf "当前最大容量: %d mAh | 设计容量: %d mAh | 循环次数 %d 次 | 健康度: %.1f%%\n", raw, design, cycle, (raw/design)*100}'
写在最后
其实,最开始我是在 stackoverflow 上看到 ioreg 的使用的。
后来是怎么发现电池健康度的测算呢? 是发现 coconutBattery 这个软件,读取的字段就是 AppleRawMaxCapacity 和 DesignCapacity: