在Android手机的设置->电池里面能够看到相关的电量使用信息统计,这些统计的基础就是power_profile.xml中设定的基础参数值,包括wifi,亮灭屏,cpu.speed等等,通过计算一个app在一段时间内使用的相关资源的电量,估算出其所耗电量,并显示出来。
通常项目相关路径如下/devices/project_name/overlay/frameworks/base/core/res/res/xml/power_profile.xml
原始配置在/frameworks/base/core/res/res/xml/power_profile.xml,会使用项目配置文件覆盖frameworks的文件。另一个通常也会配置的文件是/devices/project_name/overlay/frameworks/base/core/res/res/values/config.xml,配置一些行为参数,比如Led等行为。我们来看power_profile.xml,如下是相关的配置,注释是参考值,真实的值是实测值。通常设置为airplane mode来测试这些基础数据。
<item name="none">0</item>
<item name="screen.on">122</item> <!-- ~200mA -->
<item name="screen.full">364</item> <!-- ~300mA -->
<item name="bluetooth.active">35</item> <!-- Bluetooth data transfer, ~10mA -->
<item name="bluetooth.on">1.2</item> <!-- Bluetooth on & connectable, but not connected, ~0.1mA -->
<item name="wifi.on">3</item> <!-- ~3mA -->
<item name="wifi.active">200</item> <!-- WIFI data transfer, ~200mA -->
<item name="wifi.scan">100</item> <!-- WIFI network scanning, ~100mA -->
<item name="dsp.audio">38</item> <!-- ~10mA -->
<item name="dsp.video">100</item> <!-- ~50mA -->
<item name="camera.flashlight">200</item> <!-- Avg. power for camera flash, ~160mA -->
<item name="camera.avg">650</item> <!-- Avg. power use of camera in standard usecases, ~550mA -->
<item name="gps.on">35</item> <!-- ~50mA -->
<!-- Radio related values. For modems without energy reporting support in firmware, use
radio.active, radio.scanning, and radio.on. -->
<item name="radio.active">200</item> <!-- ~200mA -->
<item name="radio.scanning">40</item> <!-- cellular radio scanning for signal, ~10mA -->
<!-- Current consumed by the radio at different signal strengths, when paging -->
<array name="radio.on"> <!-- Strength 0 to BINS-1 -->
<value>3</value> <!-- ~2mA -->
<value>5</value> <!-- ~1mA -->
</array>
<!-- Different CPU speeds for cluster 0 as reported in
/sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state.
There must be one of these for each cluster, labeled:
cpu.speeds.cluster0, cpu.speeds.cluster1, etc... -->
<array name="cpu.speeds.cluster0">
<value>652800</value> <!-- 652 MHz CPU speed -->
<value>1036800</value> <!-- 1000 MHz CPU speed -->
<value>1401600</value> <!-- 1400 MHz CPU speed -->
<value>1689600</value> <!-- 1600 MHz CPU speed -->
<value>1804800</value> <!-- 1800 MHz CPU speed -->
</array>
<!-- Current at each CPU speed for cluster 0, as per 'cpu.speeds.cluster0'.
Like cpu.speeds.cluster0, there must be one of these present for
each heterogeneous CPU cluster. -->
<array name="cpu.active.cluster0">
<value>80</value> <!-- ~100mA -->
<value>200</value> <!-- ~100mA -->
<value>320</value> <!-- ~100mA -->
<value>400</value> <!-- ~100mA -->
<value>480</value> <!-- ~100mA -->
</array>
CPU能够工作在哪几个频率上,可以通过如下节点查看:
#cat /sys/devices/system/cpu/cpu4/cpufreq/scaling_available_frequencies
652800 1036800 1401600 1689600 1804800
而/sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state. 这个需要相关的feature,在4.9之后被移除了,可通过一些patch再加入进去。