dumpsys thermalservice
read-onlyWhether the phone is throttling, and every thermal zone the hardware layer reports, in degrees Celsius.
- Command
- adb shell dumpsys thermalservice
- Commands
- System services (dumpsys)
- Risk
- read-only
Syntax
dumpsys thermalserviceExamples
dumpsys thermalserviceThrottling severity plus every zone's temperature.
cat /sys/class/thermal/thermal_zone0/tempThe kernel's own reading, in thousandths of a degree.
Reading the output
Sample output
IsStatusOverride: false
Thermal Status: 0
Cached temperatures:
Temperature{mValue=32.5, mType=2, mName=battery, mStatus=0}
HAL Ready: true
Current temperatures from HAL:
Temperature{mValue=32.5, mType=2, mName=battery, mStatus=0}
Current cooling devices from HAL:
CoolingDevice{mValue=0, mType=2, mName=thermal-cpufreq-0}`Thermal Status` is the phone's global throttling severity, 0 to 6. Below it, two sections describe the same zones twice — the live hardware read and the service's cached copy — so merge them by `mName` rather than listing both, or a zone appears twice at slightly different temperatures. `mValue` on a temperature is already degrees Celsius as a float; nothing needs dividing.
Output fields
| Field | Meaning |
|---|---|
| Thermal Status | 0 NONE, 1 LIGHT, 2 MODERATE, 3 SEVERE, 4 CRITICAL, 5 EMERGENCY, 6 SHUTDOWN. |
| IsStatusOverride | True means the status was injected for testing and is not measured. |
| mValue (Temperature) | Degrees Celsius as a float. `NaN` is the documented "no reading" sentinel. |
| mName | The vendor's own zone label. Match it against your device's datasheet; it is not standardised. |
| mStatus | That zone's own throttling severity, same 0-6 scale. |
| mValue (CoolingDevice) | A driver-defined state — a cpufreq step, a fan index, a duty cycle. It carries no unit. |
What access it needs
Reading is the easy half: `dumpInternal` is gated by `DumpUtils.checkDumpPermission`, so `android.permission.DUMP` alone, which the Shell package's manifest declares. No root, no `adb root`, no developer-options switch beyond USB debugging. Writing is gated differently, and more tightly than anything else on this page. `ThermalManagerService.onShellCommand` refuses outright unless the calling uid is `SHELL_UID` or `ROOT_UID` — it does not consult a permission at all — and only then runs its shell command. That path is reached by `cmd thermalservice`, not by `dumpsys`: the service's `dump` hands its arguments to `dumpInternal`, which ignores them completely, so `cmd thermalservice override-status <n>` sets `IsStatusOverride: true` while `dumpsys thermalservice override-status <n>` quietly prints the dump and changes nothing. A phone left overridden reports a throttling severity that no sensor produced, indefinitely, and every tool reading this dump will believe it; `cmd thermalservice reset` is the way back. Read `IsStatusOverride` before you trust `Thermal Status`, in that order, every time — including on a phone you did not touch, because the override outlives the shell session that set it and the person before you may not have cleared it. The Android Sensor Tester only ever sends the read form.
Failure messages, decoded
| Message | Meaning |
|---|---|
| Permission Denial: can't dump ThermalManagerService from from pid=4821, uid=10231 due to missing android.permission.DUMP permission | From `DumpUtils.checkDumpPermission`, with the tag taken from the service's own class name and the doubled `from from` that every AOSP dump refusal carries. It is written to **stdout**, in place of the whole dump — so what you have is not a phone with no thermal zones, it is a call that never reached the service. |
| *** SERVICE 'thermalservice' DUMP TIMEOUT (10000ms) EXPIRED *** | The `dumpsys` binary stopped waiting after its default ten seconds. This dump holds a service-wide lock while it reads every zone from the hardware layer, so a wedged thermal HAL surfaces here rather than as an error from the HAL itself. Everything printed before the banner is real; treat a truncated zone list as incomplete, never as the full set, and raise the wait with `-t SECONDS` before drawing conclusions. |
| Can't find service: thermalservice | Printed to stderr by the `dumpsys` binary when the service manager holds no `thermalservice` entry, which is normal while the device is still booting. Because it goes to stderr, a run captured without `2>&1` shows an empty dump with no explanation anywhere in it. |
| cmd: Can't find service: thermalservice | The same absence seen from the other tool. The `cmd:` prefix tells you this came from `cmd`, so it is the override or reset path that failed, not a read — and it means the override you thought you had cleared is still in place. Confirm with `IsStatusOverride` once the service is up. |
Version and vendor notes
- Three temperature scales meet here: this dump prints degrees as a float, `dumpsys battery` prints tenths, and `/sys/class/thermal/*/temp` prints thousandths. Applying one scale's conversion to another's number is a factor-of-ten mistake that looks plausible.
- A severity number Android does not define should be shown as unknown, not rounded up to SHUTDOWN.
- Zone names, coverage and even whether the hardware layer answers at all vary by manufacturer.
- `dumpsys thermalservice reset` resets nothing. The service's `dump` passes its arguments to `dumpInternal`, which ignores them and prints the dump again; the override is set with `cmd thermalservice override-status <n>` and cleared with `cmd thermalservice reset` — the opposite of how `dumpsys battery` treats its arguments.
- The `… from HAL:` sections are printed only while `HAL Ready: true`, and the static-thresholds one is newer than the other two: absent at tag android-11.0.0_r1, present from android-12.0.0_r1.
We have a UI for this
Android Sensor Tester runs this command over USB and parses what comes back — a Chromium browser, no SDK, nothing uploaded.
Related commands
Commands that turn up in the same session as dumpsys thermalservice.
| Command | What it does |
|---|---|
| dumpsys battery | The battery service's live state: level, status, health, voltage and temperature. |
| top | A one-shot process table: CPU share, memory, state and command line. |
| dumpsys meminfo | Which processes are using the most memory, measured as proportional set size. |
More System services (dumpsys) commands
| Command | What it does |
|---|---|
| dumpsys diskstats | Free space per partition, a disk write latency check, and a cached per-app breakdown of what is using storage. |
| dumpsys sensorservice | Every sensor the phone has, with its vendor, type, rates and batching — plus a buffer of recent readings. |
| dumpsys package | Everything the package manager knows about one app: version, paths, flags, install source and per-user state. |
| dumpsys activity activities | Which app is in the foreground, and the task and stack structure behind it. |
| dumpsys dropbox | The platform's ring buffer of crashes, ANRs and tombstones — how you read ANR traces without root. |
Checked against AOSP, toybox and kernel sources while writing the parsers behind our Web ADB tools. Where a behaviour genuinely varies by Android version or manufacturer, this page says so instead of giving a number that would be wrong on half the phones out there.