dumpsys thermalservice
唯讀手機是不是正在因為溫度而降速,以及硬體層回報的每一個溫區,單位是攝氏。
- 指令
- adb shell dumpsys thermalservice
- 指令
- 系統服務(dumpsys)
- 風險
- 唯讀
語法
dumpsys thermalservice範例
dumpsys thermalservice節流等級加上每個溫區的溫度。
cat /sys/class/thermal/thermal_zone0/temp核心自己的讀數,單位是千分之一度。
輸出怎麼讀
輸出範例
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` 是整台裝置的節流等級,0 到 6。它底下有兩個段落在描述同一組溫區——硬體的即時讀數與服務的快取副本——所以要用 `mName` 把它們合併,而不是兩份都列出來,否則同一個溫區會以略微不同的溫度出現兩次。溫度的 `mValue` 已經是浮點數的攝氏,不需要再除。
輸出欄位
| 欄位 | 意義 |
|---|---|
| Thermal Status | 0 NONE、1 LIGHT、2 MODERATE、3 SEVERE、4 CRITICAL、5 EMERGENCY、6 SHUTDOWN。 |
| IsStatusOverride | true 代表這個 status 是為了測試注入的,不是量到的。 |
| mValue (Temperature) | 浮點數的攝氏。`NaN` 是規格上表示「沒有讀數」的標記。 |
| mName | 廠商自己的溫區名稱。它沒有標準化,請拿去對照你這台的規格書。 |
| mStatus | 那個溫區自己的節流等級,同樣是 0 到 6。 |
| mValue (CoolingDevice) | 由驅動程式定義的狀態值——cpufreq 的檔位、風扇編號、工作週期。它沒有單位。 |
需要什麼權限
讀取是簡單的那一半:`dumpInternal` 由 `DumpUtils.checkDumpPermission` 守著,所以只要 `android.permission.DUMP`,而 Shell 套件的資訊清單有宣告。不用 root、不用 `adb root`,除了 USB 偵錯之外也沒有開發人員選項要開。寫入的守法不一樣,而且比這一頁上任何東西都嚴。`ThermalManagerService.onShellCommand` 除非呼叫方的 uid 是 `SHELL_UID` 或 `ROOT_UID`,否則直接拒絕——它根本不看權限——通過了才執行它的 shell 指令。而那條路是 `cmd thermalservice` 走的,不是 `dumpsys`:這個服務的 `dump` 把參數交給 `dumpInternal`,而後者完全忽略它們,所以 `cmd thermalservice override-status <n>` 會讓 `IsStatusOverride: true`,而 `dumpsys thermalservice override-status <n>` 只會安靜地印出 dump、什麼都不改。一台被留在覆寫狀態的手機會無限期回報一個沒有任何感測器產生過的節流等級,而每一個讀這份輸出的工具都會信它;`cmd thermalservice reset` 是回頭的路。每一次都要先讀 `IsStatusOverride` 再去信 `Thermal Status`,順序就是這樣——包括在一台你沒碰過的手機上,因為覆寫活得比設定它的那次 shell 連線更久,而前一個人可能沒有清掉。Android Sensor Tester 只會送出讀取的那個形式。
失敗訊息對照
| 訊息 | 意義 |
|---|---|
| Permission Denial: can't dump ThermalManagerService from from pid=4821, uid=10231 due to missing android.permission.DUMP permission | 來自 `DumpUtils.checkDumpPermission`,標籤取自這個服務自己的類別名稱,並帶著每一個 AOSP dump 拒絕都有的重複 `from from`。它寫在**標準輸出**,而且是取代整份 dump——所以你手上的不是一台沒有溫區的手機,是一次根本沒抵達服務的呼叫。 |
| *** SERVICE 'thermalservice' DUMP TIMEOUT (10000ms) EXPIRED *** | `dumpsys` 這支程式等滿預設的十秒就不等了。這份 dump 在從硬體層讀每一個溫區的時候會持有一把服務層級的鎖,所以卡住的 thermal HAL 是在這裡現身,而不是由 HAL 自己回一個錯誤。橫幅之前印出來的都是真的;被截斷的溫區清單要當成不完整,絕對不要當成全部,而且在下任何結論之前先用 `-t SECONDS` 把等待拉長。 |
| Can't find service: thermalservice | 由 `dumpsys` 這支程式印到標準錯誤,代表 service manager 裡沒有 `thermalservice` 這一項,裝置還在開機時很正常。因為它走標準錯誤,一次沒帶 `2>&1` 的收集會得到一份空的 dump,而且裡面完全沒有任何解釋。 |
| cmd: Can't find service: thermalservice | 同一件缺席,從另一支工具看到的樣子。`cmd:` 這個前綴告訴你它來自 `cmd`,所以失敗的是覆寫或重設那條路,不是讀取——這代表你以為已經清掉的覆寫其實還在。等服務起來之後用 `IsStatusOverride` 確認。 |
版本與廠商注意事項
- 三種溫度刻度在這裡交會:這份輸出印浮點數的攝氏、`dumpsys battery` 印十分之一度、`/sys/class/thermal/*/temp` 印千分之一度。把其中一種的換算套到另一種的數值上,會得到一個看起來很合理的十倍錯誤。
- Android 沒有定義的等級數值應該顯示為未知,而不是向上取整成最駭人的 SHUTDOWN。
- 溫區名稱、涵蓋範圍,甚至硬體層會不會回應,都因廠牌而異。
- `dumpsys thermalservice reset` 什麼都不會重設。這個服務的 `dump` 把參數交給 `dumpInternal`,後者忽略它們並再印一次 dump;覆寫是用 `cmd thermalservice override-status <n>` 設的,用 `cmd thermalservice reset` 清掉——和 `dumpsys battery` 對待參數的方式正好相反。
- `… from HAL:` 那幾段只有在 `HAL Ready: true` 的時候才會印,而其中 static thresholds 那一段比另外兩段新:tag android-11.0.0_r1 沒有,從 android-12.0.0_r1 起才有。
這個我們有 UI
Android Sensor Tester 會透過 USB 執行這個指令並解析回應——只要 Chromium 系瀏覽器,不必安裝 SDK,也不會上傳任何東西。
相關指令
和 dumpsys thermalservice 會在同一次作業裡出現的指令。
| 指令 | 做什麼 |
|---|---|
| dumpsys battery | 電池服務目前的狀態:電量、充電狀態、健康度、電壓與溫度。 |
| top | 一次性的行程表:CPU 占用、記憶體、狀態與指令列。 |
| dumpsys meminfo | 哪些行程最吃記憶體,量的是 PSS(按比例分攤的用量)。 |
其他系統服務(dumpsys)指令
| 指令 | 做什麼 |
|---|---|
| dumpsys diskstats | 每個分割區的剩餘空間、一次磁碟寫入延遲的實測,以及一份快取起來的各 app 空間用量。 |
| dumpsys sensorservice | 手機上的每一個感測器,含廠商、type、取樣率與批次能力,以及一段近期讀數的緩衝。 |
| dumpsys package | 套件管理員知道的一切:版本、路徑、flags、安裝來源,以及每個使用者的狀態。 |
| dumpsys activity activities | 現在哪個 app 在前景,以及它背後的 task 與 stack 結構。 |
| dumpsys dropbox | 平台用來存放當機、ANR 與 tombstone 的環形緩衝——這是不用 root 讀 ANR 追蹤的方法。 |
這些行為是在撰寫 Web ADB 工具背後的解析程式時,對照 AOSP、toybox 與核心原始碼查證的。真的會因 Android 版本或廠牌而異的地方,這一頁會直接說明,而不是給你一個在半數手機上都是錯的數字。