ByteScope

dumpsys thermalservice

read-only

Whether 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 thermalservice

Examples

  • dumpsys thermalservice

    Throttling severity plus every zone's temperature.

  • cat /sys/class/thermal/thermal_zone0/temp

    The 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

FieldMeaning
Thermal Status0 NONE, 1 LIGHT, 2 MODERATE, 3 SEVERE, 4 CRITICAL, 5 EMERGENCY, 6 SHUTDOWN.
IsStatusOverrideTrue 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.
mNameThe vendor's own zone label. Match it against your device's datasheet; it is not standardised.
mStatusThat 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

MessageMeaning
Permission Denial: can't dump ThermalManagerService from from pid=4821, uid=10231 due to missing android.permission.DUMP permissionFrom `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: thermalservicePrinted 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: thermalserviceThe 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.

Open Android Sensor Tester

Related commands

Commands that turn up in the same session as dumpsys thermalservice.

CommandWhat it does
dumpsys batteryThe battery service's live state: level, status, health, voltage and temperature.
topA one-shot process table: CPU share, memory, state and command line.
dumpsys meminfoWhich processes are using the most memory, measured as proportional set size.

More System services (dumpsys) commands

CommandWhat it does
dumpsys diskstatsFree space per partition, a disk write latency check, and a cached per-app breakdown of what is using storage.
dumpsys sensorserviceEvery sensor the phone has, with its vendor, type, rates and batching — plus a buffer of recent readings.
dumpsys packageEverything the package manager knows about one app: version, paths, flags, install source and per-user state.
dumpsys activity activitiesWhich app is in the foreground, and the task and stack structure behind it.
dumpsys dropboxThe 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.

Frequently asked questions

How do I run an adb shell command?

Switch on developer options and USB debugging on the phone, plug it in, then run adb shell <command> from a machine with platform-tools installed — or run adb shell on its own to get an interactive prompt and type the command without the prefix. If the command produces binary output, such as a screenshot, use adb exec-out instead of adb shell: the plain shell service attaches a terminal, which rewrites newline bytes and corrupts the data.

Do adb shell commands need root?

Not the ones on this reference. They run as the shell user, which can manage packages for its own Android user, read most dumpsys services, write the settings provider, inject input and read shared storage. Root is only needed for things this reference deliberately avoids — reading another app's private data (except through run-as on a debuggable build), writing system partitions, or reading /data/anr directly.

Why does the output look different on my phone?

Either the Android version or the manufacturer. Some flags and fields arrived in a specific release, and those are noted per command. The rest is OEM patching, which hits dumpsys hardest: a dump is debug output whose text is whatever the service author last printed, and manufacturers change it and backport their changes. Read fields by name rather than by position, and treat an unfamiliar shape as a difference rather than as a failure.

Can I run this from a browser instead of a terminal?

For many commands, yes — the Web ADB tools on this site talk to a phone over WebUSB from a Chromium-based desktop browser, with no SDK installed and nothing uploaded. Each page links to the tool that runs its command, when one exists. Two limits are worth knowing: only one program can hold the ADB interface at a time, so a desktop adb server has to be stopped first, and adb forward and adb reverse cannot work in a browser at all.

Would rather click than type? The Web ADB Toolkit runs commands like this from a browser over USB. Or browse every command.