| # 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: | |
|  | |
| 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/main/+/main: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 positive 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 | |
|  | |
| ### 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 (Android): | |
| ```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 | |
| battery_counters: BATTERY_COUNTER_VOLTAGE | |
| } | |
| } | |
| } | |
| ``` | |
| Sample Config (Chrome OS or Linux): | |
| ```protobuf | |
| data_sources: { | |
| config { | |
| name: "linux.sysfs_power" | |
| } | |
| } | |
| ``` | |
| ## {#odpm} On-Device Power Rails Monitor (ODPM) | |
| _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 | |
| "On-Device Power Rail Monitors" (ODPMs). | |
| 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]. | |
| Googlers: See [go/power-rails-internal-doc](http://go/power-rails-internal-doc) | |
| for instructions on how to change the default rail selection on Pixel devices. | |
| [power-hal]: https://cs.android.com/android/platform/superproject/main/+/main:hardware/interfaces/power/stats/1.0/IPowerStats.hal | |
| Simplified block diagram: | |
|  | |
| ### 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. |