| # Power data sources |
| |
| On Android Perfetto bundles data sources to retrieve power |
| counters from the device power management units (where supported). |
| |
| ## Battery counters |
| |
| _This data source has been introduced in Android 10 (Q) and requires the |
| presence of power-management hardware on the device. This is available on |
| most Google Pixel smartphones._ |
| |
| Modern smartphones are equipped with a power monitoring IC which is able to |
| measure the charge flowing in and out of the battery. This allows Perfetto to |
| observe the total and instantaneous charge drained from the battery by the |
| overall device (the union of SoC, display, radios and all other hardware |
| units). |
| |
| A simplified block diagram: |
| |
| ![](/docs/images/battery-counters.png "Schematic diagram of battery counters") |
| |
| These counters report: |
| |
| * The remaining battery capacity in %. |
| * The remaining battery charge in microampere-hours (µAh). |
| * The instantaneous (typically the average over a small window of time) current |
| in microampere (µA) |
| |
| The presence and the resolution of these counters depends on the device |
| manufacturer. At the platform level this data is obtained polling the |
| Android [IHealth HAL][health-hal]. |
| For more details on HW specs and resolution see |
| [Measuring Device Power](https://source.android.com/devices/tech/power/device). |
| |
| [health-hal]: https://cs.android.com/android/platform/superproject/+/master:hardware/interfaces/health/2.0/IHealth.hal?q=IHealth |
| |
| #### Measuring charge while plugged on USB |
| |
| Battery counters measure the charge flowing *in* and *out* of |
| the battery. If the device is plugged to a USB cable, you will likely observe |
| a negative instantaneous current and an increase of the total charge, denoting |
| the fact that charge is flowing in the battery (i.e. charging it) rather |
| than out. |
| |
| This can make measurements in lab settings problematic. The known workarounds |
| for this are: |
| |
| * Using specialized USB hubs that allow to electrically disconnect the USB ports |
| from the host side. This allows to effectively disconnect the phone while the |
| tests are running. |
| |
| * On rooted phones the power management IC driver allows to disconnect the USB |
| charging while keeping the USB data link active. This feature is |
| SoC-specific, is undocumented and not exposed through any HAL. |
| For instance on a Pixel 2 this can be achieved running, as root: |
| `echo 1 > /sys/devices/soc/800f000.qcom,spmi/spmi-0/spmi0-02/800f000.qcom,spmi:qcom,pmi8998@2:qcom,qpnp-smb2/power_supply/battery/input_suspend`. |
| Note that in most devices the kernel USB driver holds a wakelock to keep the |
| USB data link active, so the device will never fully suspend even when turning |
| the screen off. |
| |
| ### UI |
| |
| ![](/docs/images/battery-counters-ui.png) |
| |
| ### SQL |
| |
| ```sql |
| select ts, t.name, value from counter as c left join counter_track t on c.track_id = t.id |
| ``` |
| |
| ts | name | value |
| ---|------|------ |
| 338297039804951 | batt.charge_uah | 2085000 |
| 338297039804951 | batt.capacity_pct | 75 |
| 338297039804951 | batt.current_ua | -1469687 |
| 338297145212097 | batt.charge_uah | 2085000 |
| 338297145212097 | batt.capacity_pct | 75 |
| 338297145212097 | batt.current_ua | -1434062 |
| |
| ### TraceConfig |
| |
| Trace proto: |
| [BatteryCounters](/docs/reference/trace-packet-proto.autogen#BatteryCounters) |
| |
| Config proto: |
| [AndroidPowerConfig](/docs/reference/trace-config-proto.autogen#AndroidPowerConfig) |
| |
| Sample config: |
| |
| ```protobuf |
| data_sources: { |
| config { |
| name: "android.power" |
| android_power_config { |
| battery_poll_ms: 250 |
| battery_counters: BATTERY_COUNTER_CAPACITY_PERCENT |
| battery_counters: BATTERY_COUNTER_CHARGE |
| battery_counters: BATTERY_COUNTER_CURRENT |
| } |
| } |
| } |
| ``` |
| |
| ## Power rails |
| |
| _This data source has been introduced in Android 10 (Q) and requires the |
| dedicated hardware on the device. This hardware is not yet available on |
| most production phones._ |
| |
| Recent version of Android introduced the support for more advanced power |
| monitoring at the hardware subsystem level, known as "Power rail counters". |
| These counters measure the energy drained by (groups of) hardware units. |
| |
| Unlike the battery counters, they are not affected by the charging/discharging |
| state of the battery, because they measure power downstream of the battery. |
| |
| The presence and the resolution of power rail counters depends on the device |
| manufacturer. At the platform level this data is obtained polling the |
| Android [IPowerStats HAL][power-hal]. |
| |
| [power-hal]: https://cs.android.com/android/platform/superproject/+/master:hardware/interfaces/power/stats/1.0/IPowerStats.hal |
| |
| Simplified block diagram: |
| |
| ![](/docs/images/power-rails.png "Block diagram of power rail counters") |
| |
| ### TraceConfig |
| |
| Trace proto: |
| [PowerRails](/docs/reference/trace-packet-proto.autogen#PowerRails) |
| |
| Config proto: |
| [AndroidPowerConfig](/docs/reference/trace-config-proto.autogen#AndroidPowerConfig) |
| |
| Sample config: |
| |
| ```protobuf |
| data_sources: { |
| config { |
| name: "android.power" |
| android_power_config { |
| battery_poll_ms: 250 |
| collect_power_rails: true |
| # Note: it is possible to specify both rails and battery counters |
| # in this section. |
| } |
| } |
| } |
| ``` |
| |
| ## Related data sources |
| |
| See also the [CPU -> Frequency scaling](cpu-freq.md) data source. |