IOS 功耗采集介绍
市面上的 ios 功耗采集工具往往通过 电池瞬时放电电流 x 电压 来计算 IOS 系统的瞬时功耗。那么有没有一种方法在有线连接时也能反应设备的功耗呢? 这篇文章介绍 SystemLoad参数,并验证其有效性。
这里主要对比:
perfdog
pymobiledevice3
: 一个开源库,基于usbmux
,remotexpc
开发,走官方协议来获取信息;powerlog
: 官方提供的工具,安装一次描述文件可以用一个周,会自动记录手机的功耗信息,同步到电脑上可以查看;
测量方法
使用pymobiledevice3采集功耗
pymobiledevice3
中可以使用pymobiledevice3 diagnostics battery single
命令来获取瞬时电池数据,其中有重要数据如下:
字段名 | 含义(个人理解,无文档,有一定猜测成分) |
---|---|
SystemCurrentIn | 整机瞬时输入电流 |
SystemVoltageIn | 整机瞬时输入电压 |
SystemLoad | SOC 功耗,取决于整机正在运行中的负载 |
Voltage | 电池瞬时电压 |
InstantAmperage | 电池瞬时电流 |
BatteryPower | 电池功耗,等于Voltage * InstantAmperage |
IsCharging | 是否在充电 |
这里测试过程中采集后进行简单处理,上报两组数据:
字段名 | 获取方法 | 含义 |
---|---|---|
PyMobileDevice3_SystemLoad | 直接上报SystemLoad | SOC功耗 |
PyMobileDevice3_Power | abs(Voltage * InstantAmperage // 1000) | 手机整机功耗 |
这里有两条路可以走:
- 无线时可以直接测试;
- 有线时如果电源已满,实际观测时发现
IsCharging
会始终保持为false
,设备只走充电器供电,可以去取充电器功率即可;
有线采集
首先,将手机和电脑通过usb
进行连接,输入:
$ sudo pymobiledevice3 remote tunneld
然后直接
pymobiledevice3 diagnostics battery single
即可进行采集
wifi 采集
首先,将手机和电脑通过usb
进行连接,输入:
$ sudo pymobiledevice3 remote tunneld --no-usb --no-usbmux --protocol=tcp
等待一小段时间后,能够看到日志:
2025-05-06 17:13:08 panicwangdeMac-mini.local pymobiledevice3.tunneld.server[77092] INFO [start-tunnel-task-wifi-192.168.0.101] Created tunnel --rsd fd19:69b1:c01::1 54329
这表示已经与wifi
的设备建立了连接,可以看到里面的 --rsd fd19:69b1:c01::1 54329
,在后续的命令中加进去即可:
pymobiledevice3 diagnostics battery single --rsd fd19:69b1:c01::1 54329
使用powerlog进行采集
工具安装
进入ProfilesAndLogs页面,下载
Battery Life for iOS/iPadOS
项,得到描述文件BatteryLife.mobileconfig
。通过
隔空投送
将描述文件传给iphone
。在
iphone
的设置中,安装刚才隔空投送的描述文件;
工具使用
- 将
iphone
的电量充满,静置一小段时间后断开充电线,屏幕亮度调整到最低,断开蓝牙,关闭通知,开始运行测试内容; - 测试内容运行结束后,等待半小时左右,使用数据线将设备连接到
mac
电脑上; - 在
finder
中打开手机,进行同步,等待同步结束即可;
数据查看
数据在/Library/Logs/CrashReporter/MobileDevice/${DeviceName}
目录下,可以看到:
powerlog_2025-05-06_19-39_A42B5B23.PLSQL
powerlog_2025-05-07_10-29_2B3C75F3.PLSQL
powerlog_2025-04-25_0F64B4ED.PLSQL.gz
这种的,就是我们需要查看的性能数据。 这个文件是一个sqlite
的db,我们使用DB Browser for SQLite
就可以查看里面的内容,其中重点的表有:
表名 | 内容 |
---|---|
PLBatteryAgent_EventBackward_Battery | 整机的电量信息,包含电流、电压、温度等信息。(每20秒记录一条数据) |
PLBatteryAgent_EventBackward_Battery_UI | 剩余电量百分比。(每20秒记录一条数据) |
PLIOReportAgent_EventBackward_EnergyModel | 整机不同硬件上的详细功耗数据。分别记录了 CPU、GPU、DRAM 等硬件的耗电量。 |
PLAccountingOperator_Aggregate_RootNodeEnergy | 各个 App 的详细耗电数据。记录各个 App 在各个硬件上的耗电量。(每小时更新一次数据) |
PLAccountingOperator_EventNone_Nodes | 各个硬件对应的 Node ID,以及各个 App 的对应的 Node ID。 |
PLAccountingOperator_EventNone_AllApps | 手机中安装的所有 App 的信息 |
PLApplicationAgent_EventForward_Application | App 运行状态记录。记录各个 App 在某个时间段以什么状态运行。 |
PLAppTimeService_Aggregate_AppRunTime | App 的运行时长统计。(每小时更新一次数据。 |
PLBatteryAgent_EventForward_LightningConnectorStatus | Lighting 接口连接状态 |
PLBatteryAgent_EventNone_BatteryConfig | 电池的配置信息。包括电池容量、循环计数、电池寿命、电池温度等信息。 |
PLBatteryAgent_EventNone_BatteryShutdown | 电池导致的意外关机记录。 |
PLButtonAgent_EventPoint_Button | 疑似物理按键的点击记录。 |
PLCameraAgent_EventForward_Camera | 相机使用记录。记录了相机类型和使用相机的 App |
PLConfigAgent_EventNone_Config | 本机的一些配置信息和一些系统设置。 |
PLDisplayAgent_Aggregate_UserTouch | 屏幕点击计数。每 15 分钟记录一条数据。 |
PLDisplayAgent_EventForward_Display | 屏幕亮度信息。包括流明、尼特、亮度滑竿值等信息。 |
PLProcessNetworkAgent_EventPoint_Connection | 网络连接记录。记录了发起网络连接的 App、地址、端口等信息。 |
PLXPCAgent_EventPoint_CacheDelete | 清除缓存的记录。包括申请的空间大小、清除缓存的耗时、清除的缓存大小、服务名称、紧急程度等信息。 |
注: 此表来自于《iOS 最全面的功耗分析之——Power Log》
我们这里关注的重点是:PLBatteryAgent_EventBackward_Battery
这张表,这张表中每20s新增一条数据,记录着瞬时的电压、电流等信息。
通过电压,电流可以算出整机当前的功耗。
我们
结果对比
Perfdog VS PyMobileDevice3
无线
可以看到PerfDog
和PyMobileDevice3_Power
这两条曲线的数值是完全相同的,略有不同的原因是PyMobileDevice3
数据自助获取,以10s
为周期,获取时间点可能和PerfDog
数据存在差异,所以看起来略有不同;
接下来对比一下SystemLoad
和PerfDog
的区别:
Label | perfdog(avg) | pymobiledevice3_systemload(avg) | perfdog(avg) - pymobiledevice3_systemload(avg) | error_rate(%) |
---|---|---|---|---|
Label1 | 1653 | 1659 | -5 | -0.4% |
0,0,0 | 1682 | 1602 | 80 | 4.7% |
0,0,5 | 4463 | 4180 | 282 | 6.3% |
0,0,10 | 4096 | 4212 | -115 | -2.9% |
0,2,0 | 2235 | 2511 | -275 | -12.4% |
0,2,5 | 4617 | 4089 | 527 | 11.4% |
0,2,10 | 4435 | 4483 | -48 | -1.1% |
0,4,0 | 3949 | 3999 | -49 | -1.3% |
0,4,5 | 4230 | 4104 | 126 | 2.9% |
0,4,10 | 4202 | 4172 | 30 | 0.7% |
10,0,0 | 3666 | 3723 | -57 | -1.6% |
10,0,5 | 3937 | 4065 | -127 | -3.3% |
10,0,10 | 4898 | 4723 | 174 | 3.5% |
10,2,0 | 2906 | 3445 | -539 | -18.6% |
10,2,5 | 3465 | 3414 | 50 | 1.4% |
10,2,10 | 4485 | 4321 | 164 | 3.6% |
10,4,0 | 3667 | 3534 | 132 | 3.5% |
10,4,5 | 3932 | 4112 | -180 | -4.6% |
10,4,10 | 4117 | 4120 | -3 | -0.1% |
20,0,0 | 4228 | 4014 | 214 | 5.0% |
20,0,5 | 4606 | 4407 | 199 | 4.3% |
20,0,10 | 4253 | 4321 | -67 | -1.6% |
20,2,0 | 3964 | 4111 | -147 | -3.8% |
20,2,5 | 3881 | 3944 | -63 | -1.7% |
20,2,10 | 4496 | 4433 | 62 | 1.3% |
20,4,0 | 3952 | 4037 | -85 | -2.2% |
20,4,5 | 3859 | 4001 | -141 | -3.7% |
20,4,10 | 4266 | 4171 | 94 | 2.2% |
30,0,0 | 3698 | 3772 | -74 | -2.1% |
30,0,5 | 4188 | 4079 | 109 | 2.6% |
30,0,10 | 4377 | 4206 | 171 | 3.9% |
30,2,0 | 3648 | 3934 | -286 | -7.9% |
30,2,5 | 4235 | 4099 | 135 | 3.1% |
30,2,10 | 4532 | 4136 | 395 | 8.7% |
30,4,0 | 3798 | 3812 | -13 | -0.4% |
30,4,5 | 4031 | 4023 | 8 | 0.1% |
30,4,10 | 4272 | 4100 | 171 | 4.0% |
40,0,0 | 3884 | 3881 | 2 | 0.0% |
40,0,5 | 4142 | 4030 | 112 | 2.7% |
40,0,10 | 3965 | 4042 | -77 | -2.0% |
40,2,0 | 3763 | 3900 | -137 | -3.7% |
40,2,5 | 4130 | 3986 | 144 | 3.4% |
40,2,10 | 4012 | 4036 | -24 | -0.6% |
40,4,0 | 3462 | 3940 | -478 | -13.9% |
40,4,5 | 4250 | 3925 | 324 | 7.6% |
40,4,10 | 4111 | 3979 | 132 | 3.2% |
总体来看:
误差平均值为
:18.413043误差标准差为
: 196.414997
有线情况下的SystemLoad
& BatteryPower
情况
满电运行
除此之外,我们还探索了在有线满电过程中,运行相同测试过程中的SystemLoad
, BatteryPower
情况,如图所示:

图:满电运行状态下 SystemLoad, BatteryPower 曲线
亏电运行(边跑边充电)
这组测试从手机电量20%
开始运行,通过USB
连接,同样采集测试过程中的SystemLoad
, BatteryPower
情况:

图:亏电充电过程中 SystemLoad, BatteryPower 曲线
数据对比
值得关注的是,由于Power
的计算方法是abs(Voltage * InstantAmperage // 1000)
,而这里InstantAmperage
存在两种情况:
InstantAmperage < 0
: 表示电池正在放电;InstantAmperage > 0
: 表示电池正在充电;
通过亏电运行的折线图可以看出,InstantAmperage
当SystemLoad
较高时,Battery
的充电功率也会随之降低。
我们重点关注的目标还是SystemLoad
这个指标是否能够反映功耗情况:

图:WIFI、USB满电运行、USB亏电运行 曲线对比
可以看出,无论是否亏电,SystemLoad
的趋势都是和原来正确的趋势相似的,能够与测试的负载情况相对应。
但是不同的点在于,看起来有USB
供电的情况下,系统整体的功耗输出情况会更加的激进,无论是否满电,整体的功耗都要略高于WIFI
情况。
与WIFI PerfDog数据的详细对比
满电
Label | perfdog(avg) | usb_full_battery(avg) | diff | error rate(%) |
---|---|---|---|---|
Label1 | 1653 | 1894 | -240 | -14.6% |
0,0,0 | 1682 | 1920 | -237 | -14.1% |
0,0,5 | 4463 | 4891 | -427 | -9.6% |
0,0,10 | 4096 | 4704 | -608 | -14.9% |
0,2,0 | 2235 | 2424 | -188 | -8.5% |
0,2,5 | 4617 | 4888 | -271 | -5.9% |
0,2,10 | 4435 | 4991 | -555 | -12.6% |
0,4,0 | 3949 | 4254 | -305 | -7.8% |
0,4,5 | 4230 | 4429 | -198 | -4.7% |
0,4,10 | 4202 | 4618 | -415 | -9.9% |
10,0,0 | 3666 | 4194 | -527 | -14.4% |
10,0,5 | 3937 | 4467 | -530 | -13.5% |
10,0,10 | 4898 | 4874 | 23 | 0.4% |
10,2,0 | 2906 | 3439 | -533 | -18.4% |
10,2,5 | 3465 | 3825 | -360 | -10.4% |
10,2,10 | 4485 | 4583 | -98 | -2.2% |
10,4,0 | 3667 | 3887 | -220 | -6.0% |
10,4,5 | 3932 | 4699 | -767 | -19.6% |
10,4,10 | 4117 | 4563 | -446 | -10.9% |
20,0,0 | 4228 | 4471 | -242 | -5.8% |
20,0,5 | 4606 | 4759 | -152 | -3.3% |
20,0,10 | 4253 | 4702 | -449 | -10.6% |
20,2,0 | 3964 | 4508 | -543 | -13.7% |
20,2,5 | 3881 | 4338 | -456 | -11.8% |
20,2,10 | 4496 | 4922 | -425 | -9.5% |
20,4,0 | 3952 | 4437 | -485 | -12.3% |
20,4,5 | 3859 | 4770 | -910 | -23.6% |
20,4,10 | 4266 | 4602 | -336 | -7.9% |
30,0,0 | 3698 | 4068 | -369 | -10.0% |
30,0,5 | 4188 | 4494 | -305 | -7.3% |
30,0,10 | 4377 | 4669 | -291 | -6.7% |
30,2,0 | 3648 | 4435 | -786 | -21.6% |
30,2,5 | 4235 | 4723 | -488 | -11.6% |
30,2,10 | 4532 | 4517 | 15 | 0.3% |
30,4,0 | 3798 | 4383 | -584 | -15.4% |
30,4,5 | 4031 | 4382 | -350 | -8.7% |
30,4,10 | 4272 | 4447 | -175 | -4.1% |
40,0,0 | 3884 | 4290 | -406 | -10.5% |
40,0,5 | 4142 | 4609 | -466 | -11.3% |
40,0,10 | 3965 | 4527 | -561 | -14.2% |
40,2,0 | 3763 | 4275 | -512 | -13.7% |
40,2,5 | 4130 | 4293 | -163 | -4.0% |
40,2,10 | 4012 | 4553 | -541 | -13.5% |
40,4,0 | 3462 | 4214 | -751 | -21.7% |
40,4,5 | 4250 | 4281 | -31 | -0.8% |
40,4,10 | 4111 | 4349 | -237 | -5.8% |
亏电
Label | perfdog(avg) | usb_low_battery(avg) | diff | error rate(%) |
---|---|---|---|---|
Label1 | 1653 | None | None | None |
0,0,0 | 1682 | 2212 | -529 | -31.5% |
0,0,5 | 4463 | 4904 | -441 | -9.9% |
0,0,10 | 4096 | 5094 | -997 | -24.4% |
0,2,0 | 2235 | 3328 | -1092 | -48.9% |
0,2,5 | 4617 | 4863 | -246 | -5.4% |
0,2,10 | 4435 | 5394 | -959 | -21.7% |
0,4,0 | 3949 | 4890 | -940 | -23.8% |
0,4,5 | 4230 | 4911 | -680 | -16.1% |
0,4,10 | 4202 | 4935 | -732 | -17.5% |
10,0,0 | 3666 | 4475 | -808 | -22.1% |
10,0,5 | 3937 | 4819 | -882 | -22.5% |
10,0,10 | 4898 | 5616 | -718 | -14.7% |
10,2,0 | 2906 | 3959 | -1053 | -36.3% |
10,2,5 | 3465 | 4156 | -691 | -20.0% |
10,2,10 | 4485 | 5102 | -617 | -13.8% |
10,4,0 | 3667 | 4657 | -990 | -27.0% |
10,4,5 | 3932 | 4608 | -676 | -17.2% |
10,4,10 | 4117 | 4898 | -780 | -19.0% |
20,0,0 | 4228 | 4697 | -468 | -11.1% |
20,0,5 | 4606 | 4958 | -351 | -7.7% |
20,0,10 | 4253 | 5116 | -862 | -20.3% |
20,2,0 | 3964 | 4719 | -755 | -19.1% |
20,2,5 | 3881 | 4725 | -843 | -21.8% |
20,2,10 | 4496 | 5236 | -740 | -16.5% |
20,4,0 | 3952 | 4670 | -718 | -18.2% |
20,4,5 | 3859 | 4704 | -844 | -21.9% |
20,4,10 | 4266 | 4863 | -597 | -14.0% |
30,0,0 | 3698 | 4584 | -885 | -24.0% |
30,0,5 | 4188 | 4683 | -495 | -11.9% |
30,0,10 | 4377 | 4814 | -436 | -10.0% |
30,2,0 | 3648 | 4641 | -993 | -27.3% |
30,2,5 | 4235 | 4713 | -478 | -11.3% |
30,2,10 | 4532 | 4805 | -273 | -6.1% |
30,4,0 | 3798 | 4646 | -848 | -22.4% |
30,4,5 | 4031 | 4585 | -553 | -13.8% |
30,4,10 | 4272 | 4731 | -458 | -10.8% |
40,0,0 | 3884 | 4566 | -682 | -17.6% |
40,0,5 | 4142 | 4724 | -581 | -14.1% |
40,0,10 | 3965 | 4674 | -709 | -17.9% |
40,2,0 | 3763 | 4482 | -719 | -19.2% |
40,2,5 | 4130 | 4601 | -470 | -11.4% |
40,2,10 | 4012 | 4676 | -664 | -16.6% |
40,4,0 | 3462 | 4570 | -1107 | -32.0% |
40,4,5 | 4250 | 4605 | -355 | -8.4% |
40,4,10 | 4111 | 4690 | -578 | -14.1% |
与WIFI PerfDog 数据的对比总结

图:WIFI、USB满电运行、USB亏电运行 在不同负载情况下的 曲线对比
测试case | 误差均值 | 误差标准差 |
---|---|---|
USB 满电 | 394.663 | 203.490 |
USB 亏电运行 | 695.94 | 217.63 |
整体上来看,SystemLoad
能够反映系统的整体功耗,但是在有线情况下的SystemLoad
不能直接和无线仅电池放电情况下的BatteryPower
划等号。
Powerlog VS PerfDog
使用PerfDog
与Powerlog
的数据进行对比可以发现:
两者的power
数据趋势几乎完全相同,但是看起来时间上存在差异,于是将powerlog
中的timestamp
前移190s
后发现:
两组数据完全一致,可以推测出,perfdog
是通过某种方式可以实时获取到powerlog
的数据,并且根据里面的:
AppleRawBatteryVoltage
:瞬时电压;InstantAmperage
:瞬时电流;
来计算实时功耗的;
结论
这里记录了使用powerlog
,pymoibledevice3
采集功耗数据的过程,分析了它们采集的数据,与比较权威的perfdog
进行了对比。
发现,在数据方面:
perfdog
的Power
数据计算方法为读取整机电流
、整机电压
相乘后得到;- 无论是
powerlog
还是pymobiledevice3
都可以对上述数据进行采集,采集到的功耗数据与perfdog.Power
完全一致; powerlog
数据的timestamp
总是延后190s
(在两次测试中得到验证);pymobiledevice3
还支持对SystemLoad, SystemVoltage, SystemCurrentIn
进行采集,SystemLoad
能够反映系统运行的功耗情况;
在操作方面:
powerlog
需要开发者自行安装描述文件,还需要开发者将手机数据同步到本地后,分析SQLite
文件才能得到,较为繁琐;pymobiledevice3
不需要开发者进行过多操作,但是由于IOS
历史迭代原因,IOS 18+
,IOS 17+
,IOS 17-
的设备在连接方式、能否无线连接的问题上可能存在差异,目前已知IOS 18+
设备的连接、采集流程,不知道其他版本的设备上能否跑通;我们发现了
pymobiledevice3
可以采集SystemLoad
字段,这个字段采集到的系统功耗与PerfDog.Power
有一定的相似度,