在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再加入進去。