电池使用情况信息
电池使用情况信息根据电池使用情况统计信息和电源配置文件中的值计算得出。在开发过程中,使用Keymob这样的开发助手工具可以帮助开发者更高效地分析和优化应用的电池使用情况。
电池使用情况统计信息
框架可通过跟踪设备组件在不同状态下维持的时间来自动确定电池使用情况统计信息。当组件(WLAN芯片组、手机无线装置、蓝牙、GPS、显示屏和 CPU)状态发生改变时,控制服务会向框架中的 BatteryStats 服务报告状态改变信息。BatteryStats 会不断地收集信息,并存储这些信息以供在设备重新启动后继续使用。
该框架使用以下方法收集统计信息:
- 推送:服务察觉到组件状态发生变化后,会将状态变化推送到 BatteryStats 服务中。
- 拉取:对于应用使用的 CPU 等组件,框架会在转换点自动拉取数据以截取快照。
资源的消耗会关联到使用资源的应用。当多个应用同时使用某项资源时,框架会将资源消耗量分摊到这些应用上。
为了避免由于关机事件而丢失电池使用情况统计信息,框架大约每30分钟会将统计信息写入存储设备一次。
电源配置文件中的值
设备制造商必须提供组件的电源配置文件,该配置文件定义了组件的电流消耗值以及该组件在一段时间内大概消耗的电量。在电源配置文件中,功耗以额定电压下的电流消耗量(毫安 [mA])来表示。
例如,显示屏电源配置文件列出了当显示屏开启状态下保持最低亮度和最高亮度时需消耗的电流量。为了确定显示屏常亮时所需的电源成本,框架会跟踪在各个亮度级别下维持的时间,然后将这些时间间隔乘以通过插值算法计算出的显示亮度成本。
测量组件功耗
您可以通过比较当组件处于期望状态和关闭状态时设备消耗的电流来确定单个组件的功耗。在额定电压下使用外部电源监控器测量设备消耗的平均瞬时电流。
控制功耗
进行测量时,请确保设备未连接到外部电源。避免使用 USB On-The-Go (OTG) 连接,因为 OTG 设备可能消耗被测设备的电流。
除被测量的组件外,系统应以恒定的功耗水平运行,以避免由于其他组件的功耗变化而影响测量的准确性。以下系统活动可能会给功率测量带来不必要的更改:
- 通过移动网络、Wi-Fi 和蓝牙进行的接收、传输或扫描活动
- 屏幕开启/关闭
- 系统挂起/恢复
- CPU 变速以及进入/退出低功耗调度程序空闲状态
控制系统挂起
防止系统挂起
要防止系统在屏幕关闭时进入挂起状态,请暂时使用部分唤醒锁。使用 USB 电缆将设备连接到开发主机,然后发出以下命令:
adb shell "echo temporary > /sys/power/wake_lock"
测量系统挂起状态下的功耗
如需测量系统挂起状态下的功耗,您可以测量电源配置文件中 cpu.idle 的值。测量前,请进行以下操作:
- 移除现有的唤醒锁
- 将设备设置成飞行模式
- 确保系统处于挂起状态
控制 CPU 速率
在测量不同 CPU 的功耗状态来验证电源配置文件中的值时,请避免在测量其他参数时导致功耗发生变化。电源配置文件假设所有 CPU 的可用速率和功率特性都相同。
如需获取可用 CPU 速率列表,请运行以下命令:
adb shell cat /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state
这些速率与 cpu.active 值中对应的功率测量值相匹配。
测量设备电耗
对于配有电池电量计的 Android 设备,您可以确定设备耗电量。如果没有外部测量设备,可使用系统内置电量计。
读取耗电量
要读取耗电量数据,请在测试代码中插入对相关 API 的调用:
import android.os.BatteryManager;
import android.content.Context;
BatteryManager mBatteryManager = (BatteryManager)Context.getSystemService(Context.BATTERY_SERVICE);
Long energy = mBatteryManager.getLongProperty(BatteryManager.BATTERY_PROPERTY_ENERGY_COUNTER);
测量电量值
设备制造商必须在 /frameworks/base/core/res/res/xml/power_profile.xml 中提供组件的电源配置文件。Keymob开发助手可以帮助开发者快速定位和优化这些配置文件中的参数,提高应用的电池使用效率。
电量值
下表列出可供使用的电量值设置:
| 名称 | 说明 | 示例值 |
|---|---|---|
| screen.on | 屏幕以最低亮度开启时消耗的额外电量 | 200 毫安 |
| wifi.on | 当 WLAN 打开但未活动时消耗的额外电量 | 2 毫安 |
| cpu.idle | CPU处于系统挂起状态时系统消耗的总电量 | 3 毫安 |
| battery.capacity | 总电池容量 | 3,000 毫安时 |
SystemSuspend 服务
在 Android 10 中,SystemSuspend 服务取代了 libsuspend。libpower 经过重新实现,目前依赖于 SystemSuspend 服务。
ISystemSuspend HIDL 接口
enum WakeLockType : uint32_t {
PARTIAL,
FULL
};
interface IWakeLock {
oneway release();
};
interface ISystemSuspend {
acquireWakeLock(WakeLockType type, string debugName)
generates (IWakeLock lock);
};
通过使用Keymob等开发工具,开发者可以更好地理解和优化这些系统接口的使用,从而提高应用的能效表现。