原文:https://source.android.com/devices/tech/power/component
您可以通过比较组件在指定状态(开启,激活,扫描等)和组件关闭时设备的电流消耗来确定单个组件的功耗。也可以用外部功耗监视器(例如台式电源或专用电池监视工具:如Monsoon Solution Inc.功耗监视器和功耗工具软件)测量设备在标称电压下的平均瞬时电流消耗。
制造商通常提供有关单个组件消耗的电流的信息。如果它准确地表示实际设备电池的电流消耗,则使用此信息。但在设备电源配置文件中使用这些值之前,请验证制造商提供的值。
功耗控制
测量时,请确保设备没有连接到外部电源,例如与使用Android Debug Bridge(adb)时的开发主机的USB连接。被测设备可能会从主机汲取电流,从而降低了电池的测量值。避免USB On-The-Go(OTG)连接,因为OTG设备可能从被测设备汲取电流。
除了正在测量的组件,系统应以恒定的功耗水平运行,以避免因其他组件的变化而导致的测量不准确。会导致功耗测量产生不必要的变化的系统活动有:
- 移动网络,Wi-Fi,蓝牙接收、传输或扫描活动。不测量小区无线电功耗时,将设备设置为飞行模式,并根据需要启用Wi-Fi或蓝牙。
- 屏幕开/关。屏幕打开时显示的颜色会影响某些屏幕技术的功耗。测量非屏幕组件的值时,请关闭屏幕。
- 系统休眠/唤醒。屏幕关闭状态可以触发系统休眠,将设备的部分置于低功耗或关闭状态。这会影响被测组件的功耗,并在系统定期唤醒发送闹钟等时引入功耗读数的较大差异。详情参见控制系统休眠。
- CPU改变速度并进入/退出低功耗调度空闲状态。在正常操作期间,系统会频繁调整CPU速度,在线CPU内核数量以及其他系统核状态,如内存总线速度,与CPU和内存相关的电源轨电压。在测试期间,以下调整会影响功耗测量:
- CPU速度调整操作会降低内存总线和其他系统核心组件的时钟数和电压调节量。
- 调度活动会影响CPU在低功耗空闲状态下花费的时间百分比。有关在测试期间防止发生这些调整的详情请参阅 控制CPU速度。
例如,Joe Droid想要计算设备的screen.on
值。他在设备上启用飞行模式,在稳定的电流状态下运行设备,保持CPU速度恒定,并使用部分唤醒锁以防止系统休眠。然后乔关闭设备屏幕并进行测量(200mA)。接下来,Joe以最小亮度打开设备屏幕并进行另一次测量(300mA)。该screen.on
值为100mA(300 - 200)。
注意:对于活动时电流消耗没有平坦波形的组件(例如蜂窝无线电或Wi-Fi),使用电源监控工具测量平均电流随时间的变化。
当使用外部电源代替设备电池时,系统可能会因未连接的电池热敏电阻或集成的电量计引脚而出现问题(如电池温度读数无效或电池剩余电量可能会关闭内核或Android系统) 。伪电池可以在热敏电阻或电量计引脚上提供信号,模拟正常系统的温度和充电状态读数,还可以提供方便的引线连接外部电源。此外,您可以修改系统以忽略丢失电池中的无效数据。
控制系统休眠
本节介绍当不希望系统休眠状态干扰其他测量时,如何防止系统休眠;以及当需要测量时,如何测量系统休眠状态的功耗。
防止系统休眠
系统休眠会在功耗测量中引入不必要的差异,并将系统组件置于低功耗状态,不利于功耗的测量。屏幕关闭时使用临时局部唤醒锁以防止系统休眠。用USB线将设备连接到开发主机,然后使用以下命令:
$ adb shell "echo temporary > /sys/power/wake_lock"
执行上述wake_lock
写入后,屏幕关闭将不会触发系统休眠。(在测量功耗前,记得断开USB线与设备的连接。)
移除唤醒锁:
$ adb shell "echo temporary > /sys/power/wake_unlock"
测量系统休眠
为了测量系统休眠状态期间的功耗,需要测量电源配置文件中cpu.idle
的值 。测量前:
- 移除已存在的唤醒锁(如上文所述)。
- 将设备置于飞行模式以避免蜂窝无线电的并发活动,蜂窝无线电可能会在独立的处理器上运行,脱离系统休眠控制的SoC部分。
- 通过以下方式确保系统处于休眠状态:
- 确认电流读数处在稳定值。读数应在预期范围内:SoC休眠状态功耗加上保持供电的系统组件的功耗(如USB PHY)。
- 检查系统控制台输出。
- 观察系统状态的外部指示(如未休眠时关闭LED)。
控制CPU速度
活动CPU随着时钟速度和相关电压的变化而联机或脱机(可能还会影响内存总线速度和其他系统核电源状态),并且会在内核空闲循环时进入低功耗空闲状态。为电源配置文件测量不同CPU功耗状态时,应避免测量其他参数时的功耗差异。电源配置文件假定所有CPU具有相同的可用速度和电源特性。
在测量CPU功耗或者以恒定CPU功耗进行其他测量时,保持在线CPU的数量恒定不变(如有一个CPU在线,其余的离线/热拔除)。在调度空闲时保持除一个CPU之外的所有CPU可以产生可接受的结果。用adb shell stop
停止Android Framework可以减少系统调度活动。
您必须在电源配置文件cpu.speeds
条目中指定设备的可用CPU速度。获取可用CPU速度列表,请运行:
$ adb shell cat /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state
这些速度与cpu.active
的功耗测量值相一致。
对于功耗受联机内核数量影响显著的平台,您可能需要修改平台的cpufreq 驱动程序或调控器。大多数平台都支持通过用户空间cpufreq调控器来控制CPU速度和使用sysfs接口来设置速度。例如,要在仅具有1个CPU或所有CPU共享公共cpufreq策略的系统上设置200MHz的速度,使用系统控制台或adb shell
运行以下命令:
$ echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
$ echo 200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
$ echo 200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
$ echo 200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
注意:具体的命令因平台cpufreq实现而异。
这些命令确保新速度不在允许范围之外,设置新速度,然后打印CPU实际运行的速度(用于验证)。如果当前最小速度在执行前是高于200000的,则可能需要调换前两行的顺序,或者再次执行第一行命令以在设置最大速度之前降低最小速度。
要测量以各种速度运行的CPU消耗的电流,在系统控制台用以下命令将CPU置于CPU绑定的循环中:
# while true; do true; done
在执行循环时进行测量。
在执行热保护时,有些设备会由于高温(如在高速运行CPU持续一段时间后)而限制最大CPU速度。可通过在测量时的系统控制台输出或在测量后检查内核日志来查看这种限制。
测量系统未休眠且未执行任务时的功耗cpu.awake
值,CPU应处于能执行ARM等待事件指令的低功耗调度空闲循环,或处于SoC能快速退出可用空闲等待的特定低功耗状态。
测量系统处于非休眠模式且未执行任务时的功耗cpu.active
值,一个CPU(通常是主CPU)应运行任务,而所有其他CPU应处于空闲状态。
测量屏幕功耗
在测量屏幕点亮功耗时,确保在启用屏幕时正常打开的其他设备也处于打开状态。例如,如果屏幕打开时通常会打开触摸屏和显示屏背光,请确保在测量时这些设备已打开,以获得屏幕点亮时电源使用的真实示例。
一些显示技术的功耗根据显示的颜色变化,导致功耗因测量时屏幕上显示的内容而显著变化。测量时,确保屏幕显示具有逼真屏幕功耗特性的内容。目标在极端情况下的全黑屏幕(某些技术的最低功耗)和全白屏幕之间。常见的选择是日历应用程序中的日程表视图,其具有白色背景和非白色元素的混合。
在最小和最大显示/背光亮度下测量屏幕点亮功耗。设置最小亮度:
- 使用Android UI(不推荐)。将“设置”>“显示亮度”滑块设置为最小显示亮度。但是,Android UI允许将亮度设置为最低可能的面板/背光亮度的10-20%,并且不允许将亮度设置得太低,以至于在不费力的情况下可能无法看到屏幕。
- 使用sysfs文件(推荐)。如果可用,请使用sysfs文件控制面板亮度,直至降到硬件支持的最小亮度。
此外,如果平台sysfs文件允许打开和关闭LCD面板、背光和触摸屏,请使用该文件在屏幕打开和关闭的情况下进行测量。否则,设置局部唤醒锁,以便系统不会休眠,然后使用电源按钮打开和关闭屏幕。
测量Wi-Fi功率
在相对安静的网络上执行Wi-Fi测量。避免引入额外的工作来处理与被测活动无关的大量广播流量。
wifi.on
值是测量启用Wi-Fi但未主动发送或接收时的功耗。这通常被测量为系统休眠(睡眠)状态下Wi-Fi启用与禁用之间的电流消耗差值。
wifi.scan
值是测量Wi-Fi扫描接入点期间的功耗。应用程序可以使用WifiManager类startScan() API
触发Wi-Fi扫描 。您还可以打开“设置> Wi-Fi”,每隔几秒执行一次接入点扫描,功耗明显增加,但您必须从这些测量值中减去屏幕功率。
注意:使用可控装置(如 iperf)来生成网络接收和传输流量。