Contents

IOS 功耗采集介绍

市面上的 ios 功耗采集工具往往通过 电池瞬时放电电流 x 电压 来计算 IOS 系统的瞬时功耗。那么有没有一种方法在有线连接时也能反应设备的功耗呢? 这篇文章介绍 SystemLoad参数,并验证其有效性。

这里主要对比:

  • perfdog
  • pymobiledevice3: 一个开源库,基于usbmux, remotexpc开发,走官方协议来获取信息;
  • powerlog: 官方提供的工具,安装一次描述文件可以用一个周,会自动记录手机的功耗信息,同步到电脑上可以查看;

测量方法

使用pymobiledevice3采集功耗

pymobiledevice3中可以使用pymobiledevice3 diagnostics battery single命令来获取瞬时电池数据,其中有重要数据如下:

字段名含义(个人理解,无文档,有一定猜测成分)
SystemCurrentIn整机瞬时输入电流
SystemVoltageIn整机瞬时输入电压
SystemLoadSOC功耗,取决于整机正在运行中的负载
Voltage电池瞬时电压
InstantAmperage电池瞬时电流
BatteryPower电池功耗,等于Voltage * InstantAmperage
IsCharging是否在充电

这里测试过程中采集后进行简单处理,上报两组数据:

字段名获取方法含义
PyMobileDevice3_SystemLoad直接上报SystemLoadSOC功耗
PyMobileDevice3_Powerabs(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进行采集

工具安装

  1. 进入ProfilesAndLogs页面,下载Battery Life for iOS/iPadOS项,得到描述文件BatteryLife.mobileconfig

  2. 通过隔空投送将描述文件传给iphone

  3. iphone的设置中,安装刚才隔空投送的描述文件;

工具使用

  1. iphone的电量充满,静置一小段时间后断开充电线,屏幕亮度调整到最低,断开蓝牙,关闭通知,开始运行测试内容;
  2. 测试内容运行结束后,等待半小时左右,使用数据线将设备连接到mac电脑上;
  3. 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_ApplicationApp 运行状态记录。记录各个 App 在某个时间段以什么状态运行。
PLAppTimeService_Aggregate_AppRunTimeApp 的运行时长统计。(每小时更新一次数据。
PLBatteryAgent_EventForward_LightningConnectorStatusLighting 接口连接状态
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

无线

https://jaegerdocs-1301596189.cos.ap-guangzhou.myqcloud.com/image-20250508102121953.5.jpeg

可以看到PerfDogPyMobileDevice3_Power这两条曲线的数值是完全相同的,略有不同的原因是PyMobileDevice3数据自助获取,以10s为周期,获取时间点可能和PerfDog数据存在差异,所以看起来略有不同;

接下来对比一下SystemLoadPerfDog的区别:

Labelperfdog(avg)pymobiledevice3_systemload(avg)perfdog(avg) - pymobiledevice3_systemload(avg)error_rate(%)
Label116531659-5-0.4%
0,0,016821602804.7%
0,0,5446341802826.3%
0,0,1040964212-115-2.9%
0,2,022352511-275-12.4%
0,2,54617408952711.4%
0,2,1044354483-48-1.1%
0,4,039493999-49-1.3%
0,4,5423041041262.9%
0,4,1042024172300.7%
10,0,036663723-57-1.6%
10,0,539374065-127-3.3%
10,0,10489847231743.5%
10,2,029063445-539-18.6%
10,2,534653414501.4%
10,2,10448543211643.6%
10,4,0366735341323.5%
10,4,539324112-180-4.6%
10,4,1041174120-3-0.1%
20,0,0422840142145.0%
20,0,5460644071994.3%
20,0,1042534321-67-1.6%
20,2,039644111-147-3.8%
20,2,538813944-63-1.7%
20,2,1044964433621.3%
20,4,039524037-85-2.2%
20,4,538594001-141-3.7%
20,4,1042664171942.2%
30,0,036983772-74-2.1%
30,0,5418840791092.6%
30,0,10437742061713.9%
30,2,036483934-286-7.9%
30,2,5423540991353.1%
30,2,10453241363958.7%
30,4,037983812-13-0.4%
30,4,54031402380.1%
30,4,10427241001714.0%
40,0,03884388120.0%
40,0,5414240301122.7%
40,0,1039654042-77-2.0%
40,2,037633900-137-3.7%
40,2,5413039861443.4%
40,2,1040124036-24-0.6%
40,4,034623940-478-13.9%
40,4,5425039253247.6%
40,4,10411139791323.2%

总体来看:

  • 误差平均值为:18.413043
  • 误差标准差为: 196.414997

有线情况下的SystemLoad & BatteryPower情况

满电运行

除此之外,我们还探索了在有线满电过程中,运行相同测试过程中的SystemLoad, BatteryPower情况,如图所示:

image-20250508182753300

图:满电运行状态下 SystemLoad, BatteryPower 曲线

亏电运行(边跑边充电)

这组测试从手机电量20%开始运行,通过USB连接,同样采集测试过程中的SystemLoad, BatteryPower情况:

图:亏电充电过程中 SystemLoad, BatteryPower 曲线

数据对比

值得关注的是,由于Power的计算方法是abs(Voltage * InstantAmperage // 1000),而这里InstantAmperage存在两种情况:

  1. InstantAmperage < 0: 表示电池正在放电;
  2. InstantAmperage > 0: 表示电池正在充电;

通过亏电运行的折线图可以看出,InstantAmperageSystemLoad较高时,Battery的充电功率也会随之降低。

我们重点关注的目标还是SystemLoad这个指标是否能够反映功耗情况:

图:WIFI、USB满电运行、USB亏电运行 曲线对比

可以看出,无论是否亏电,SystemLoad的趋势都是和原来正确的趋势相似的,能够与测试的负载情况相对应。

但是不同的点在于,看起来有USB供电的情况下,系统整体的功耗输出情况会更加的激进,无论是否满电,整体的功耗都要略高于WIFI情况。

与WIFI PerfDog数据的详细对比

满电
Labelperfdog(avg)usb_full_battery(avg)differror rate(%)
Label116531894-240-14.6%
0,0,016821920-237-14.1%
0,0,544634891-427-9.6%
0,0,1040964704-608-14.9%
0,2,022352424-188-8.5%
0,2,546174888-271-5.9%
0,2,1044354991-555-12.6%
0,4,039494254-305-7.8%
0,4,542304429-198-4.7%
0,4,1042024618-415-9.9%
10,0,036664194-527-14.4%
10,0,539374467-530-13.5%
10,0,1048984874230.4%
10,2,029063439-533-18.4%
10,2,534653825-360-10.4%
10,2,1044854583-98-2.2%
10,4,036673887-220-6.0%
10,4,539324699-767-19.6%
10,4,1041174563-446-10.9%
20,0,042284471-242-5.8%
20,0,546064759-152-3.3%
20,0,1042534702-449-10.6%
20,2,039644508-543-13.7%
20,2,538814338-456-11.8%
20,2,1044964922-425-9.5%
20,4,039524437-485-12.3%
20,4,538594770-910-23.6%
20,4,1042664602-336-7.9%
30,0,036984068-369-10.0%
30,0,541884494-305-7.3%
30,0,1043774669-291-6.7%
30,2,036484435-786-21.6%
30,2,542354723-488-11.6%
30,2,1045324517150.3%
30,4,037984383-584-15.4%
30,4,540314382-350-8.7%
30,4,1042724447-175-4.1%
40,0,038844290-406-10.5%
40,0,541424609-466-11.3%
40,0,1039654527-561-14.2%
40,2,037634275-512-13.7%
40,2,541304293-163-4.0%
40,2,1040124553-541-13.5%
40,4,034624214-751-21.7%
40,4,542504281-31-0.8%
40,4,1041114349-237-5.8%
亏电
Labelperfdog(avg)usb_low_battery(avg)differror rate(%)
Label11653NoneNoneNone
0,0,016822212-529-31.5%
0,0,544634904-441-9.9%
0,0,1040965094-997-24.4%
0,2,022353328-1092-48.9%
0,2,546174863-246-5.4%
0,2,1044355394-959-21.7%
0,4,039494890-940-23.8%
0,4,542304911-680-16.1%
0,4,1042024935-732-17.5%
10,0,036664475-808-22.1%
10,0,539374819-882-22.5%
10,0,1048985616-718-14.7%
10,2,029063959-1053-36.3%
10,2,534654156-691-20.0%
10,2,1044855102-617-13.8%
10,4,036674657-990-27.0%
10,4,539324608-676-17.2%
10,4,1041174898-780-19.0%
20,0,042284697-468-11.1%
20,0,546064958-351-7.7%
20,0,1042535116-862-20.3%
20,2,039644719-755-19.1%
20,2,538814725-843-21.8%
20,2,1044965236-740-16.5%
20,4,039524670-718-18.2%
20,4,538594704-844-21.9%
20,4,1042664863-597-14.0%
30,0,036984584-885-24.0%
30,0,541884683-495-11.9%
30,0,1043774814-436-10.0%
30,2,036484641-993-27.3%
30,2,542354713-478-11.3%
30,2,1045324805-273-6.1%
30,4,037984646-848-22.4%
30,4,540314585-553-13.8%
30,4,1042724731-458-10.8%
40,0,038844566-682-17.6%
40,0,541424724-581-14.1%
40,0,1039654674-709-17.9%
40,2,037634482-719-19.2%
40,2,541304601-470-11.4%
40,2,1040124676-664-16.6%
40,4,034624570-1107-32.0%
40,4,542504605-355-8.4%
40,4,1041114690-578-14.1%

与WIFI PerfDog 数据的对比总结

图:WIFI、USB满电运行、USB亏电运行 在不同负载情况下的 曲线对比

测试case误差均值误差标准差
USB 满电394.663203.490
USB 亏电运行695.94217.63

整体上来看,SystemLoad能够反映系统的整体功耗,但是在有线情况下的SystemLoad不能直接和无线仅电池放电情况下的BatteryPower划等号。

Powerlog VS PerfDog

使用PerfDogPowerlog的数据进行对比可以发现:

https://jaegerdocs-1301596189.cos.ap-guangzhou.myqcloud.com/image-20250508102225119.5.jpeg

两者的power数据趋势几乎完全相同,但是看起来时间上存在差异,于是将powerlog中的timestamp前移190s后发现:

https://jaegerdocs-1301596189.cos.ap-guangzhou.myqcloud.com/image-20250508102326068.5.jpeg

两组数据完全一致,可以推测出,perfdog是通过某种方式可以实时获取到powerlog的数据,并且根据里面的:

  • AppleRawBatteryVoltage:瞬时电压;
  • InstantAmperage:瞬时电流;

来计算实时功耗的;

结论

这里记录了使用powerlogpymoibledevice3采集功耗数据的过程,分析了它们采集的数据,与比较权威的perfdog进行了对比。

发现,在数据方面:

  • perfdogPower数据计算方法为读取整机电流整机电压相乘后得到;
  • 无论是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有一定的相似度,

参考文档