测量组件功耗

您可以通过比较组件处于所需状态(例如开启、活动、扫描)和关闭状态时设备汲取的电流,来确定单个组件的功耗。使用外部电源监视器(如台式电源或专用电池监视工具,例如 Monsoon Solution Inc. Power Monitor 和 Power Tool 软件)测量设备在标称电压下汲取的平均瞬时电流。

制造商通常会提供有关单个组件功耗的信息。如果此信息准确表示设备电池在实践中汲取的电流,请使用此信息。但是,在使用制造商提供的值之前,请先验证这些值是否符合您的设备功耗配置文件。

控制功耗

测量时,请确保设备未连接到外部充电电源,例如连接到运行 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 速度恒定,并使用部分唤醒锁来阻止系统挂起。然后,Joe 关闭设备屏幕并进行测量 (200 mA)。接下来,Joe 以最低亮度打开设备屏幕并进行另一次测量 (300 mA)。screen.on 值为 100 mA (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 之外的所有 CPU 都处于调度空闲状态可能会产生可接受的结果。使用 adb shell stop 停止 Android 框架可以减少系统调度活动。

您必须在功耗配置文件 cpu.speeds 条目中指定设备的可用 CPU 速度。要获取可用 CPU 速度列表,请运行

adb shell cat /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state

这些速度与值 cpu.active 中的相应功耗测量值匹配。

对于核心数联机数量显著影响功耗的平台,您可能需要修改平台的 cpufreq 驱动程序或调速器。大多数平台都支持使用 userspace cpufreq 调速器和使用 sysfs 接口来设置 CPU 速度。例如,要在仅具有 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 Wait For Event 指令或处于 SoC 特定的低功耗状态,且具有适合空闲使用的快速退出延迟。

对于 cpu.active 值,在系统未处于挂起模式且未执行任务时测量功耗。一个 CPU(通常是主 CPU)应运行该任务,而所有其他 CPU 应处于空闲状态。

测量屏幕功耗

测量屏幕开启功耗时,请确保屏幕启用时通常开启的其他设备也已开启。例如,如果触摸屏和显示屏背光通常在屏幕开启时处于开启状态,请确保在测量时这些设备处于开启状态,以获得屏幕开启功耗的真实示例。

某些显示技术的功耗会根据显示的颜色而变化,导致功耗测量值根据测量时屏幕上显示的内容而发生很大变化。测量时,请确保屏幕显示的内容具有真实屏幕的功耗特性。目标是在全黑屏幕(某些技术的功耗最低)和全白屏幕的极端情况之间。常见的选择是日历应用中的日程表视图,它混合了白色背景和非白色元素。

最小最大显示屏/背光亮度测量屏幕开启功耗。要设置最小亮度

  • 使用 Android 界面(不推荐)。将“设置”>“显示亮度”滑块设置为最小显示亮度。但是,Android 界面仅允许将亮度设置为面板或背光灯可能亮度的 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)来生成网络接收和传输流量。