1*6dbdd20aSAndroid Build Coastguard Worker# Power data sources 2*6dbdd20aSAndroid Build Coastguard Worker 3*6dbdd20aSAndroid Build Coastguard WorkerOn Android Perfetto bundles data sources to retrieve power 4*6dbdd20aSAndroid Build Coastguard Workercounters from the device power management units (where supported). 5*6dbdd20aSAndroid Build Coastguard Worker 6*6dbdd20aSAndroid Build Coastguard Worker## Battery counters 7*6dbdd20aSAndroid Build Coastguard Worker 8*6dbdd20aSAndroid Build Coastguard Worker_This data source has been introduced in Android 10 (Q) and requires the 9*6dbdd20aSAndroid Build Coastguard Workerpresence of power-management hardware on the device. This is available on 10*6dbdd20aSAndroid Build Coastguard Workermost Google Pixel smartphones._ 11*6dbdd20aSAndroid Build Coastguard Worker 12*6dbdd20aSAndroid Build Coastguard WorkerModern smartphones are equipped with a power monitoring IC which is able to 13*6dbdd20aSAndroid Build Coastguard Workermeasure the charge flowing in and out of the battery. This allows Perfetto to 14*6dbdd20aSAndroid Build Coastguard Workerobserve the total and instantaneous charge drained from the battery by the 15*6dbdd20aSAndroid Build Coastguard Workeroverall device (the union of SoC, display, radios and all other hardware 16*6dbdd20aSAndroid Build Coastguard Workerunits). 17*6dbdd20aSAndroid Build Coastguard Worker 18*6dbdd20aSAndroid Build Coastguard WorkerA simplified block diagram: 19*6dbdd20aSAndroid Build Coastguard Worker 20*6dbdd20aSAndroid Build Coastguard Worker 21*6dbdd20aSAndroid Build Coastguard Worker 22*6dbdd20aSAndroid Build Coastguard WorkerThese counters report: 23*6dbdd20aSAndroid Build Coastguard Worker 24*6dbdd20aSAndroid Build Coastguard Worker* The remaining battery capacity in %. 25*6dbdd20aSAndroid Build Coastguard Worker* The remaining battery charge in microampere-hours (µAh). 26*6dbdd20aSAndroid Build Coastguard Worker* The instantaneous (typically the average over a small window of time) current 27*6dbdd20aSAndroid Build Coastguard Worker in microampere (µA) 28*6dbdd20aSAndroid Build Coastguard Worker 29*6dbdd20aSAndroid Build Coastguard WorkerThe presence and the resolution of these counters depends on the device 30*6dbdd20aSAndroid Build Coastguard Workermanufacturer. At the platform level this data is obtained polling the 31*6dbdd20aSAndroid Build Coastguard WorkerAndroid [IHealth HAL][health-hal]. 32*6dbdd20aSAndroid Build Coastguard WorkerFor more details on HW specs and resolution see 33*6dbdd20aSAndroid Build Coastguard Worker[Measuring Device Power](https://source.android.com/devices/tech/power/device). 34*6dbdd20aSAndroid Build Coastguard Worker 35*6dbdd20aSAndroid Build Coastguard Worker[health-hal]: https://cs.android.com/android/platform/superproject/main/+/main:hardware/interfaces/health/2.0/IHealth.hal?q=IHealth 36*6dbdd20aSAndroid Build Coastguard Worker 37*6dbdd20aSAndroid Build Coastguard Worker#### Measuring charge while plugged on USB 38*6dbdd20aSAndroid Build Coastguard Worker 39*6dbdd20aSAndroid Build Coastguard WorkerBattery counters measure the charge flowing *in* and *out* of 40*6dbdd20aSAndroid Build Coastguard Workerthe battery. If the device is plugged to a USB cable, you will likely observe 41*6dbdd20aSAndroid Build Coastguard Workera positive instantaneous current and an increase of the total charge, denoting 42*6dbdd20aSAndroid Build Coastguard Workerthe fact that charge is flowing in the battery (i.e. charging it) rather 43*6dbdd20aSAndroid Build Coastguard Workerthan out. 44*6dbdd20aSAndroid Build Coastguard Worker 45*6dbdd20aSAndroid Build Coastguard WorkerThis can make measurements in lab settings problematic. The known workarounds 46*6dbdd20aSAndroid Build Coastguard Workerfor this are: 47*6dbdd20aSAndroid Build Coastguard Worker 48*6dbdd20aSAndroid Build Coastguard Worker* Using specialized USB hubs that allow to electrically disconnect the USB ports 49*6dbdd20aSAndroid Build Coastguard Worker from the host side. This allows to effectively disconnect the phone while the 50*6dbdd20aSAndroid Build Coastguard Worker tests are running. 51*6dbdd20aSAndroid Build Coastguard Worker 52*6dbdd20aSAndroid Build Coastguard Worker* On rooted phones the power management IC driver allows to disconnect the USB 53*6dbdd20aSAndroid Build Coastguard Worker charging while keeping the USB data link active. This feature is 54*6dbdd20aSAndroid Build Coastguard Worker SoC-specific, is undocumented and not exposed through any HAL. 55*6dbdd20aSAndroid Build Coastguard Worker For instance on a Pixel 2 this can be achieved running, as root: 56*6dbdd20aSAndroid Build Coastguard Worker `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`. 57*6dbdd20aSAndroid Build Coastguard Worker Note that in most devices the kernel USB driver holds a wakelock to keep the 58*6dbdd20aSAndroid Build Coastguard Worker USB data link active, so the device will never fully suspend even when turning 59*6dbdd20aSAndroid Build Coastguard Worker the screen off. 60*6dbdd20aSAndroid Build Coastguard Worker 61*6dbdd20aSAndroid Build Coastguard Worker### UI 62*6dbdd20aSAndroid Build Coastguard Worker 63*6dbdd20aSAndroid Build Coastguard Worker 64*6dbdd20aSAndroid Build Coastguard Worker 65*6dbdd20aSAndroid Build Coastguard Worker### SQL 66*6dbdd20aSAndroid Build Coastguard Worker 67*6dbdd20aSAndroid Build Coastguard Worker```sql 68*6dbdd20aSAndroid Build Coastguard Workerselect ts, t.name, value from counter as c left join counter_track t on c.track_id = t.id 69*6dbdd20aSAndroid Build Coastguard Worker``` 70*6dbdd20aSAndroid Build Coastguard Worker 71*6dbdd20aSAndroid Build Coastguard Workerts | name | value 72*6dbdd20aSAndroid Build Coastguard Worker---|------|------ 73*6dbdd20aSAndroid Build Coastguard Worker338297039804951 | batt.charge_uah | 2085000 74*6dbdd20aSAndroid Build Coastguard Worker338297039804951 | batt.capacity_pct | 75 75*6dbdd20aSAndroid Build Coastguard Worker338297039804951 | batt.current_ua | -1469687 76*6dbdd20aSAndroid Build Coastguard Worker338297145212097 | batt.charge_uah | 2085000 77*6dbdd20aSAndroid Build Coastguard Worker338297145212097 | batt.capacity_pct | 75 78*6dbdd20aSAndroid Build Coastguard Worker338297145212097 | batt.current_ua | -1434062 79*6dbdd20aSAndroid Build Coastguard Worker 80*6dbdd20aSAndroid Build Coastguard Worker### TraceConfig 81*6dbdd20aSAndroid Build Coastguard Worker 82*6dbdd20aSAndroid Build Coastguard WorkerTrace proto: 83*6dbdd20aSAndroid Build Coastguard Worker[BatteryCounters](/docs/reference/trace-packet-proto.autogen#BatteryCounters) 84*6dbdd20aSAndroid Build Coastguard Worker 85*6dbdd20aSAndroid Build Coastguard WorkerConfig proto: 86*6dbdd20aSAndroid Build Coastguard Worker[AndroidPowerConfig](/docs/reference/trace-config-proto.autogen#AndroidPowerConfig) 87*6dbdd20aSAndroid Build Coastguard Worker 88*6dbdd20aSAndroid Build Coastguard WorkerSample config (Android): 89*6dbdd20aSAndroid Build Coastguard Worker 90*6dbdd20aSAndroid Build Coastguard Worker```protobuf 91*6dbdd20aSAndroid Build Coastguard Workerdata_sources: { 92*6dbdd20aSAndroid Build Coastguard Worker config { 93*6dbdd20aSAndroid Build Coastguard Worker name: "android.power" 94*6dbdd20aSAndroid Build Coastguard Worker android_power_config { 95*6dbdd20aSAndroid Build Coastguard Worker battery_poll_ms: 250 96*6dbdd20aSAndroid Build Coastguard Worker battery_counters: BATTERY_COUNTER_CAPACITY_PERCENT 97*6dbdd20aSAndroid Build Coastguard Worker battery_counters: BATTERY_COUNTER_CHARGE 98*6dbdd20aSAndroid Build Coastguard Worker battery_counters: BATTERY_COUNTER_CURRENT 99*6dbdd20aSAndroid Build Coastguard Worker battery_counters: BATTERY_COUNTER_VOLTAGE 100*6dbdd20aSAndroid Build Coastguard Worker } 101*6dbdd20aSAndroid Build Coastguard Worker } 102*6dbdd20aSAndroid Build Coastguard Worker} 103*6dbdd20aSAndroid Build Coastguard Worker``` 104*6dbdd20aSAndroid Build Coastguard Worker 105*6dbdd20aSAndroid Build Coastguard WorkerSample Config (Chrome OS or Linux): 106*6dbdd20aSAndroid Build Coastguard Worker 107*6dbdd20aSAndroid Build Coastguard Worker```protobuf 108*6dbdd20aSAndroid Build Coastguard Workerdata_sources: { 109*6dbdd20aSAndroid Build Coastguard Worker config { 110*6dbdd20aSAndroid Build Coastguard Worker name: "linux.sysfs_power" 111*6dbdd20aSAndroid Build Coastguard Worker } 112*6dbdd20aSAndroid Build Coastguard Worker} 113*6dbdd20aSAndroid Build Coastguard Worker``` 114*6dbdd20aSAndroid Build Coastguard Worker 115*6dbdd20aSAndroid Build Coastguard Worker## {#odpm} On-Device Power Rails Monitor (ODPM) 116*6dbdd20aSAndroid Build Coastguard Worker 117*6dbdd20aSAndroid Build Coastguard Worker_This data source has been introduced in Android 10 (Q) and requires the 118*6dbdd20aSAndroid Build Coastguard Workerdedicated hardware on the device. This hardware is not yet available on 119*6dbdd20aSAndroid Build Coastguard Workermost production phones._ 120*6dbdd20aSAndroid Build Coastguard Worker 121*6dbdd20aSAndroid Build Coastguard WorkerRecent version of Android introduced the support for more advanced power 122*6dbdd20aSAndroid Build Coastguard Workermonitoring at the hardware subsystem level, known as 123*6dbdd20aSAndroid Build Coastguard Worker"On-Device Power Rail Monitors" (ODPMs). 124*6dbdd20aSAndroid Build Coastguard WorkerThese counters measure the energy drained by (groups of) hardware units. 125*6dbdd20aSAndroid Build Coastguard Worker 126*6dbdd20aSAndroid Build Coastguard WorkerUnlike the battery counters, they are not affected by the charging/discharging 127*6dbdd20aSAndroid Build Coastguard Workerstate of the battery, because they measure power downstream of the battery. 128*6dbdd20aSAndroid Build Coastguard Worker 129*6dbdd20aSAndroid Build Coastguard WorkerThe presence and the resolution of power rail counters depends on the device 130*6dbdd20aSAndroid Build Coastguard Workermanufacturer. At the platform level this data is obtained polling the 131*6dbdd20aSAndroid Build Coastguard WorkerAndroid [IPowerStats HAL][power-hal]. 132*6dbdd20aSAndroid Build Coastguard Worker 133*6dbdd20aSAndroid Build Coastguard WorkerGooglers: See [go/power-rails-internal-doc](http://go/power-rails-internal-doc) 134*6dbdd20aSAndroid Build Coastguard Workerfor instructions on how to change the default rail selection on Pixel devices. 135*6dbdd20aSAndroid Build Coastguard Worker 136*6dbdd20aSAndroid Build Coastguard Worker[power-hal]: https://cs.android.com/android/platform/superproject/main/+/main:hardware/interfaces/power/stats/1.0/IPowerStats.hal 137*6dbdd20aSAndroid Build Coastguard Worker 138*6dbdd20aSAndroid Build Coastguard WorkerSimplified block diagram: 139*6dbdd20aSAndroid Build Coastguard Worker 140*6dbdd20aSAndroid Build Coastguard Worker 141*6dbdd20aSAndroid Build Coastguard Worker 142*6dbdd20aSAndroid Build Coastguard Worker### TraceConfig 143*6dbdd20aSAndroid Build Coastguard Worker 144*6dbdd20aSAndroid Build Coastguard WorkerTrace proto: 145*6dbdd20aSAndroid Build Coastguard Worker[PowerRails](/docs/reference/trace-packet-proto.autogen#PowerRails) 146*6dbdd20aSAndroid Build Coastguard Worker 147*6dbdd20aSAndroid Build Coastguard WorkerConfig proto: 148*6dbdd20aSAndroid Build Coastguard Worker[AndroidPowerConfig](/docs/reference/trace-config-proto.autogen#AndroidPowerConfig) 149*6dbdd20aSAndroid Build Coastguard Worker 150*6dbdd20aSAndroid Build Coastguard WorkerSample config: 151*6dbdd20aSAndroid Build Coastguard Worker 152*6dbdd20aSAndroid Build Coastguard Worker```protobuf 153*6dbdd20aSAndroid Build Coastguard Workerdata_sources: { 154*6dbdd20aSAndroid Build Coastguard Worker config { 155*6dbdd20aSAndroid Build Coastguard Worker name: "android.power" 156*6dbdd20aSAndroid Build Coastguard Worker android_power_config { 157*6dbdd20aSAndroid Build Coastguard Worker battery_poll_ms: 250 158*6dbdd20aSAndroid Build Coastguard Worker collect_power_rails: true 159*6dbdd20aSAndroid Build Coastguard Worker # Note: it is possible to specify both rails and battery counters 160*6dbdd20aSAndroid Build Coastguard Worker # in this section. 161*6dbdd20aSAndroid Build Coastguard Worker } 162*6dbdd20aSAndroid Build Coastguard Worker } 163*6dbdd20aSAndroid Build Coastguard Worker} 164*6dbdd20aSAndroid Build Coastguard Worker``` 165*6dbdd20aSAndroid Build Coastguard Worker 166*6dbdd20aSAndroid Build Coastguard Worker## Related data sources 167*6dbdd20aSAndroid Build Coastguard Worker 168*6dbdd20aSAndroid Build Coastguard WorkerSee also the [CPU -> Frequency scaling](cpu-freq.md) data source. 169