| page.title=Measuring Power Values |
| @jd:body |
| |
| <!-- |
| Copyright 2015 The Android Open Source Project |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| <div id="qv-wrapper"> |
| <div id="qv"> |
| <h2>In this document</h2> |
| <ol id="auto-toc"></ol> |
| </div> |
| </div> |
| |
| |
| <p>Device manufacturers must provide a component power profile in |
| <code>/frameworks/base/core/res/res/xml/power_profile.xml</code>.</p> |
| |
| <p>To determine values for power profiles, use hardware that measures the power |
| being used by the device and perform the various operations for which |
| information is needed. Measure the power use during those operations and compute |
| the values (deriving differences from other baseline power uses as appropriate). |
| </p> |
| |
| <p>As the goal of a power profile is to estimate battery drain appropriately, |
| power profile values are given in current (amps). The Android framework |
| multiplies the current by the time for which the subsystem was active and |
| computes the mAh value, which is then used to estimate the amount of battery |
| drained by the application/subsystem.</p> |
| |
| <p>Devices with <a href="#chipset-data">Bluetooth and Wi-Fi controllers</a> |
| running Android 6.0 and higher can provide additional power values obtained from |
| chipset data.</p> |
| |
| |
| <h2 id="multiple-cpus">Devices with heterogeneous CPUs</h2> |
| |
| <p>The power profile for devices with CPU cores of heterogeneous architecture |
| must include the following additional fields: |
| <ul> |
| <li>Number of total CPUs for each cluster (expressed in cpu.clusters.cores).</li> |
| <li>CPU speeds supported by each cluster.</li> |
| <li>Active CPU power consumption for each cluster.</li> |
| </ul> |
| |
| <p>To differentiate between active CPU power consumption and supported CPU |
| speeds for clusters, append the cluster number to the name of the array. Cluster |
| numbers are assigned in the order of CPU cores in the kernel device tree. For |
| example, in a heterogeneous architecture that has two (2) clusters with four (4) |
| cores:</p> |
| <ul> |
| <li>cluster0 consists of cpu0-3</li> |
| <li>cluster1 consists of cpu4-7</li> |
| </ul> |
| <p>The Android framework uses these CPU core numbers when it reads statistics |
| from the <code>sysfs</code> files in: |
| <code>/sys/devices/system/cpu/cpu<number>/cpufreq/stats</code>. |
| |
| <p>Example of cluster CPUs and speeds:</p> |
| |
| <pre> |
| <array name="cpu.active.cluster0"> |
| <value>200</value> |
| <value>300</value> |
| <value>400</value> |
| </array> |
| <array name="cpu.speeds.cluster0"> |
| <value>600000</value> |
| <value>800000</value> |
| <value>1200000</value> |
| </array> |
| |
| <array name="cpu.active.cluster1"> |
| <value>400</value> |
| <value>500</value> |
| <value>600</value> |
| </array> |
| <array name="cpu.speeds.cluster1"> |
| <value>800000</value> |
| <value>1200000</value> |
| <value>1400000</value> |
| </array> |
| </pre> |
| |
| <h2 id="values">Power values</h2> |
| <p>The following table describes available power value settings. To view the |
| sample file in AOSP, see |
| <a href="https://android.googlesource.com/platform/frameworks/base/+/master/core/res/res/xml/power_profile.xml">power_profile.xml</a>.</p> |
| |
| <table> |
| <tr> |
| <th>Name</th> |
| <th>Description</th> |
| <th>Example Value</th> |
| <th>Notes</th> |
| </tr> |
| <tr> |
| <td>none</td> |
| <td>Nothing</td> |
| <td>0</td> |
| <td></td> |
| </tr> |
| |
| <tr> |
| <td>screen.on</td> |
| <td>Additional power used when screen is turned on at minimum brightness.</td> |
| <td>200mA</td> |
| <td>Includes touch controller and display backlight. At 0 brightness, not the |
| Android minimum which tends to be 10 or 20%.</td> |
| </tr> |
| |
| <tr> |
| <td>screen.full</td> |
| <td>Additional power used when screen is at maximum brightness, compared to |
| screen at minimum brightness.</td> |
| <td>100mA-300mA</td> |
| <td>A fraction of this value (based on screen brightness) is added to the |
| screen.on value to compute the power usage of the screen.</td> |
| </tr> |
| |
| <tr> |
| <td>bluetooth.active</td> |
| <td>Additional power used when playing audio through Bluetooth A2DP.</td> |
| <td>14mA</td> |
| <td></td> |
| </tr> |
| |
| <tr> |
| <td>bluetooth.on</td> |
| <td>Additional power used when Bluetooth is turned on but idle.</td> |
| <td>1.4mA</td> |
| <td></td> |
| </tr> |
| |
| <tr> |
| <td>wifi.on</td> |
| <td>Additional power used when Wi-Fi is turned on but not receiving, |
| transmitting, or scanning.</td> |
| <td>2mA</td> |
| <td></td> |
| </tr> |
| |
| <tr> |
| <td>wifi.active</td> |
| <td>Additional power used when transmitting or receiving over Wi-Fi.</td> |
| <td>31mA</td> |
| <td></td> |
| </tr> |
| |
| <tr> |
| <td>wifi.scan</td> |
| <td>Additional power used when Wi-Fi is scanning for access points.</td> |
| <td>100mA</td> |
| <td></td> |
| </tr> |
| |
| <tr> |
| <td>dsp.audio</td> |
| <td>Additional power used when audio decoding/encoding via DSP.</td> |
| <td>14.1mA</td> |
| <td>Reserved for future use.</td> |
| </tr> |
| |
| |
| <tr> |
| <td>dsp.video</td> |
| <td>Additional power used when video decoding via DSP.</td> |
| <td>54mA</td> |
| <td>Reserved for future use.</td> |
| </tr> |
| |
| <tr> |
| <td>camera.avg</td> |
| <td>Average power use by the camera subsystem for a typical camera |
| application.</td> |
| <td>600mA</td> |
| <td>Intended as a rough estimate for an application running a preview |
| and capturing approximately 10 full-resolution pictures per minute.</td> |
| </tr> |
| |
| <tr> |
| <td>camera.flashlight</td> |
| <td>Average power used by the camera flash module when on.</td> |
| <td>200mA</td> |
| <td></td> |
| </tr> |
| |
| |
| <tr> |
| <td>gps.on</td> |
| <td>Additional power used when GPS is acquiring a signal.</td> |
| <td>50mA</td> |
| <td></td> |
| </tr> |
| |
| <tr> |
| <td>radio.active</td> |
| <td>Additional power used when cellular radio is transmitting/receiving.</td> |
| <td>100mA-300mA</td> |
| <td></td> |
| </tr> |
| |
| <tr> |
| <td>radio.scanning</td> |
| <td>Additional power used when cellular radio is paging the tower.</td> |
| <td>1.2mA</td> |
| <td></td> |
| </tr> |
| |
| <tr> |
| <td>radio.on</td> |
| <td>Additional power used when the cellular radio is on. Multi-value entry, |
| one per signal strength (no signal, weak, moderate, strong).</td> |
| <td>1.2mA</td> |
| <td>Some radios boost power when they search for a cell tower and do not |
| detect a signal. Values can be the same or decrease with increasing signal |
| strength. If you provide only one value, the same value is used for all |
| strengths. If you provide two values, the first is used for no-signal, the |
| second value is used for all other strengths, and so on.</td> |
| </tr> |
| |
| <tr> |
| <td>cpu.speeds</td> |
| <td>Multi-value entry that lists each possible CPU speed in KHz.</td> |
| <td>125000KHz, 250000KHz, 500000KHz, 1000000KHz, 1500000KHz</td> |
| <td>The number and order of entries must correspond to the mA entries in |
| cpu.active.</td> |
| </tr> |
| |
| <tr> |
| <td>cpu.idle</td> |
| <td>Total power drawn by the system when CPUs (and the SoC) are in system |
| suspend state.</td> |
| <td>3mA</td> |
| <td></td> |
| </tr> |
| |
| <tr> |
| <td>cpu.awake</td> |
| <td>Additional power used when CPUs are in scheduling idle state |
| (kernel idle loop); system is not in system suspend state.</td> |
| <td>50mA</td> |
| <td>Your platform might have more than one idle state in use with differing |
| levels of power consumption; choose a representative idle state for longer |
| periods of scheduler idle (several milliseconds). Examine the power graph on |
| your measurement equipment and choose samples where the CPU is at its lowest |
| consumption, discarding higher samples where the CPU exited idle.</td> |
| </tr> |
| |
| <tr> |
| <td>cpu.active</td> |
| <td>Additional power used by CPUs when running at different speeds.</td> |
| <td>100mA, 120mA, 140mA, 160mA, 200mA</td> |
| <td>Value represents the power used by the CPU rails when running at different |
| speeds. Set the max speed in the kernel to each of the allowed speeds and peg |
| the CPU at that speed. The number and order of entries correspond to the |
| number and order of entries in cpu.speeds.</td> |
| </tr> |
| |
| <tr> |
| <td>cpu.clusters.cores</td> |
| <td>Number of cores each CPU cluster contains.</td> |
| <td>4, 2</td> |
| <td>Required only for devices with <a href="#multiple-cpus">heterogeneous CPU |
| architectures</a>. Number of entries and order should match the number of |
| cluster entries for the cpu.active and cpu.speeds. The first entry represents |
| the number of CPU cores in cluster0, the second entry represents the number of |
| CPU cores in cluster1, and so on.</td> |
| </tr> |
| |
| <tr> |
| <td>battery.capacity</td> |
| <td>Total battery capacity in mAh.</td> |
| <td>3000mAh</td> |
| <td></td> |
| </tr> |
| </table> |
| |
| <h2 id="chipset-data">Devices with Bluetooth and Wi-Fi controllers</h2> |
| <p>Devices with Bluetooth and Wi-Fi controllers running Android 6.0 and |
| higher can be polled for the following energy use data:</p> |
| <ul> |
| <li>Time spent transmitting (in milliseconds).</li> |
| <li>Time spent receiving (in milliseconds).</li> |
| <li>Time spent idle (in milliseconds).</li> |
| </ul> |
| |
| <p>Time values are not measured but are instead available from respective chip |
| specifications and must be explicitly stated (for details, see |
| <a href="{@docRoot}devices/tech/power/batterystats.html#wifi-reqs">Wi-Fi, |
| Bluetooth, and cellular usage</a>). To convert time values to power values, the |
| framework expects four (4) values for each controller in a resource overlay at |
| <code>/frameworks/base/core/res/res/values/config.xml</code>.</p> |
| |
| <table id="chipset-energy-data"> |
| |
| <tr> |
| <th width="10%">Controller</th> |
| <th width="40%">Values/Resource Names</th> |
| <th width="40%">Description</th> |
| </tr> |
| |
| <tr> |
| <td rowspan=4>Bluetooth</td> |
| <td>android:integer/config_bluetooth_idle_cur_ma</td> |
| <td>Average current draw (mA) of the Bluetooth controller when idle.</td> |
| </tr> |
| |
| <tr> |
| <td>android:integer/config_bluetooth_active_rx_cur_ma</td> |
| <td>Average current draw (mA) of the Bluetooth controller when receiving.</td> |
| </tr> |
| |
| <tr> |
| <td>android:integer/config_bluetooth_tx_cur_ma</td> |
| <td>Average current draw (mA) of the Bluetooth controller when transmitting.</td> |
| </tr> |
| |
| <tr> |
| <td>android:integer/config_bluetooth_operating_voltage_mv</td> |
| <td>Average operating voltage (mV) of the Bluetooth controller.</td> |
| </tr> |
| |
| <tr> |
| <td rowspan=4>Wi-Fi</td> |
| <td>android:integer/config_wifi_idle_receive_cur_ma</td> |
| <td>Average current draw (mA) of the Wi-Fi controller when idle.</td> |
| </tr> |
| |
| <tr> |
| <td>android:integer/config_wifi_active_rx_cur_ma</td> |
| <td>Average current draw (mA) of the Wi-Fi controller when receiving.</td> |
| </tr> |
| |
| <tr> |
| <td>android:integer/config_wifi_tx_cur_ma</td> |
| <td>average current draw (mA) of the Wi-Fi controller when transmitting.</td> |
| </tr> |
| |
| <tr> |
| <td>android:integer/config_wifi_operating_voltage_mv</td> |
| <td>Average operating voltage (mV) of the Wi-Fi controller.</td> |
| </tr> |
| |
| </table> |