# PowerMetric

Artifact: [androidx.benchmark:benchmark-macro](https://developer.android.com/jetpack/androidx/releases/benchmark) [View Source](https://cs.android.com/search?q=file:androidx/benchmark/macro/Metric.kt+class:androidx.benchmark.macro.PowerMetric) Added in [1.2.0](https://developer.android.com/jetpack/androidx/releases/benchmark#1.2.0)

*** ** * ** ***


```
@RequiresApi(value = 29)
@ExperimentalMetricApi
class PowerMetric : Metric
```

<br />

|---|---|---|
| [kotlin.Any](https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-any/index.html) |||
| ↳ | [androidx.benchmark.macro.Metric](https://developer.android.com/reference/kotlin/androidx/benchmark/macro/Metric) ||
|   | ↳ | [androidx.benchmark.macro.PowerMetric](https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric) |

*** ** * ** ***

Captures the change of power, energy or battery charge metrics over time for specified duration. A configurable output of power, energy, subsystems, and battery charge will be generated. Subsystem outputs will include the sum of all power or energy metrics within it. A metric total will also be generated for power and energy, as well as a metric which is the sum of all unselected metrics.

## Summary

| ### Nested types |
|---|
| `sealed class https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric.Type` Configures the PowerMetric request. |
| `class https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric.Type.Battery : https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric.Type` |
| `class https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric.Type.Energy : https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric.Type` |
| `class https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric.Type.Power : https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric.Type` |

| ### Public companion functions |
|---|---|
| `https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric.Type.Battery` | `https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric#Battery()()` |
| `https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric.Type.Energy` | `https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric#Energy(kotlin.collections.Map)(categories: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.collections/-map/index.html<https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerCategory, https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerCategoryDisplayLevel>)` |
| `https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric.Type.Power` | `https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric#Power(kotlin.collections.Map)(categories: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.collections/-map/index.html<https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerCategory, https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerCategoryDisplayLevel>)` |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html` | `https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric#deviceBatteryHasMinimumCharge()()` Returns true if `https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric.Type.Battery` measurements can be performed, based on current device charge. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html` | `https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric#deviceSupportsHighPrecisionTracking()()` Returns true if the current device can be used for high precision `https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric#Power(kotlin.collections.Map)` and `https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric#Energy(kotlin.collections.Map)` metrics. |

| ### Public constructors |
|---|
| `https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric#PowerMetric(androidx.benchmark.macro.PowerMetric.Type)(type: https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric.Type)` |

## Public companion functions

### Battery

Added in [1.2.0](https://developer.android.com/jetpack/androidx/releases/benchmark#1.2.0)

```
fun Battery(): PowerMetric.Type.Battery
```

### Energy

```
fun Energy(
    categories: Map<PowerCategory, PowerCategoryDisplayLevel> = emptyMap()
): PowerMetric.Type.Energy
```

### Power

```
fun Power(
    categories: Map<PowerCategory, PowerCategoryDisplayLevel> = emptyMap()
): PowerMetric.Type.Power
```

### deviceBatteryHasMinimumCharge

Added in [1.3.0](https://developer.android.com/jetpack/androidx/releases/benchmark#1.3.0)

```
fun deviceBatteryHasMinimumCharge(): Boolean
```

Returns true if `https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric.Type.Battery` measurements can be performed, based on current device charge.

This can be used to change behavior or throw a clear error before metric configuration, or to skip the test, e.g. with `assumeTrue(PowerMetric.deviceBatteryHasMinimumCharge())`

### deviceSupportsHighPrecisionTracking

Added in [1.3.0](https://developer.android.com/jetpack/androidx/releases/benchmark#1.3.0)

```
fun deviceSupportsHighPrecisionTracking(): Boolean
```

Returns true if the current device can be used for high precision `https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric#Power(kotlin.collections.Map)` and `https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric#Energy(kotlin.collections.Map)` metrics.

This can be used to change behavior or fall back to lower precision tracking:

```kotlin
metrics = listOf(
    if (PowerMetric.deviceSupportsHighPrecisionTracking()) {
        PowerMetric(Type.Energy()) // high precision tracking
    } else {
        PowerMetric(Type.Battery()) // fall back to less precise tracking
    }
)
```

Or to skip a test when detailed tracking isn't available:

```kotlin
@Test fun myDetailedPowerBenchmark {
    assumeTrue(PowerMetric.deviceSupportsHighPrecisionTracking())
    macrobenchmarkRule.measureRepeated (
        metrics = listOf(PowerMetric(Type.Energy(...)))
    ) {
        ...
    }
}
```

## Public constructors

### PowerMetric

Added in [1.2.0](https://developer.android.com/jetpack/androidx/releases/benchmark#1.2.0)

```
PowerMetric(type: PowerMetric.Type)
```

| Parameters |
|---|---|
| `type: https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric.Type` | Either `https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric.Type.Energy` or `https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric.Type.Power`, which can be configured to show components of system power usage, or `https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric.Type.Battery`, which will halt charging of device to measure power drain. For `https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric.Type.Energy` or `https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric.Type.Power`, the sum of all categories will be displayed as a `Total` metric. The sum of all unrequested categories will be displayed as an `Unselected` metric. The subsystems that have not been categorized will be displayed as an `Uncategorized` metric. You can check if the local device supports this high precision tracking with `https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric#deviceSupportsHighPrecisionTracking()`. For `https://developer.android.com/reference/kotlin/androidx/benchmark/macro/PowerMetric.Type.Battery`, the charge for the start of the run and the end of the run will be displayed. An additional `Diff` metric will be displayed to indicate the charge drain over the course of the test. The metrics will be stored in the format `<type><name><unit>`. This outputs measurements like the following: Power metrics example: ```kotlin powerCategoryDisplayUw       min       128.2,   median       128.7,   max       129.8 powerComponentCpuBigUw       min         1.9,   median         2.9,   max         3.4 powerComponentCpuLittleUw    min        65.8,   median        76.2,   max        79.7 powerComponentCpuMidUw       min        10.8,   median        13.3,   max        13.6 powerTotalUw                 min       362.4,   median       395.2,   max       400.6 powerUnselectedUw            min       155.3,   median       170.8,   max       177.8 ``` Energy metrics example: ```kotlin energyCategoryDisplayUws     min    610,086.0,   median    623,183.0,   max    627,259.0 energyComponentCpuBigUws     min      9,233.0,   median     13,566.0,   max     16,536.0 energyComponentCpuLittleUws  min    318,591.0,   median    368,211.0,   max    379,106.0 energyComponentCpuMidUws     min     52,143.0,   median     64,462.0,   max     64,893.0 energyTotalUws               min  1,755,261.0,   median  1,880,687.0,   max  1,935,402.0 energyUnselectedUws          min    752,111.0,   median    813,036.0,   max    858,934.0 ``` Battery metrics example: ```kotlin batteryDiffMah       min         2.0,   median         2.0,   max         4.0 batteryEndMah        min     3,266.0,   median     3,270.0,   max     3,276.0 batteryStartMah      min     3,268.0,   median     3,274.0,   max     3,278.0 ``` This measurement is not available prior to API 29. |