# Android Bugreport Analyzer

> 在瀏覽器裡打開 Android bugreport zip：電池時間軸、wakelock、喚醒原因、ANR trace 和當機一次看完。Battery Historian 的替代方案，不用架 Docker，檔案不會上傳。

- URL: https://bytescope.dev/zh-Hant/bugreport-analyzer/
- Locale: zh-Hant · Also: [en](https://bytescope.dev/en/bugreport-analyzer.md) · [ja](https://bytescope.dev/ja/bugreport-analyzer.md)
- Runs: 檔案不會離開你的瀏覽器 — 全部在本機處理。
- Requires: Any modern browser (Chrome, Edge, Firefox, Safari), desktop and mobile.
- Updated: 2026-09-08

## What it does

bugreport 是 Android 應要求產生的診斷檔：每個系統服務的 `dumpsys` 輸出、附帶「手機這段時間在做什麼」history 的電池統計、最近的 ANR trace 與 tombstone、logcat 緩衝區，以及一份裝置屬性。App 一直閃退、手機一個晚上就沒電的時候，Android 工程師要的就是這個檔案；Battery Historian 讀的也是它，只是 Battery Historian 是一個要用 Docker 架起來的 Go 伺服器。這個頁面直接在你的瀏覽器裡打開同一個 zip：在 Web Worker 裡解壓縮、把主檔切成段落、解析電池 history 和 wakelock 表格，然後整理成幾個分頁。

### 怎麼產生

在手機上先打開開發人員選項（關於手機 → 連點版本號碼七次），再到「開發人員選項 → 錯誤報告」選完整報告，等通知出現；通常要幾分鐘，期間手機會比較慢。電腦上有 ADB 的話，`adb bugreport bugreport.zip` 存下來的是同一份壓縮檔。舊手機或某些版本的 `adb bugreport` 只會給一個 `.txt`，這裡兩種都收。直接透過 WebUSB 從手機抓報告的功能還沒有：請先在手機上產生，再把檔案拖進來。

### 為什麼不要丟到不認識的網站

bugreport 裡的東西遠不只電池數字：帳號名稱、Wi-Fi 網路名稱、最近的位置、最近通知的內容、已安裝的套件、一部分 logcat，全都在裡面。為了看一張圖把這些上傳到陌生人的伺服器，實在划不來。這裡的做法是整個壓縮檔都在這個分頁的 Web Worker 裡解開、解析，什麼都不會送出去，關掉分頁就沒了。如果你需要把報告交給廠商或貼到 issue tracker，先自己讀過一遍，想清楚它會透露什麼。

### 每個分頁在看什麼

「總覽」列出裝置資訊：型號、製造商、Android 版本、build fingerprint、核心版本、運作時間和報告產生時間，還有產生當下的電池狀態，以及一段異常摘要：ANR、App 當機、native 當機各幾筆、最耗電的幾個 App、最常見的喚醒原因，每一項都能點過去。「電池時間軸」畫出電量隨時間的變化，下面每一條軌道都是 history 裡真的有的狀態：螢幕、充電、running、wake_lock、行動網路、Wi-Fi、GPS、前景 App 和 doze；另外列出電量掉最快的五段時間，以及那段時間各有哪些軌道是開著的。「耗電排行」有依 App 分的 partial wakelock、kernel wakelock、依次數排的喚醒原因，還有報告裡有的話，Android 自己估的每個 App 耗電 mAh。「當機」列出每筆 ANR 的程序、PID 和原因，展開後看得到所有執行緒，主執行緒排第一並標出第一個非框架的 frame，還有「waiting to lock … held by thread N」這類鎖的等待關係；App 當機有例外型別、訊息和堆疊；tombstone 有 signal、fault address、abort message 和 backtrace。「原始段落」把主檔做成目錄加虛擬捲動的全文，可以全文搜尋，logcat 段落還能依等級、tag、PID 過濾。每個表格都能匯出 CSV，總覽、排行和當機清單可以複製成 JSON。

### 誠實的限制

bugreport 的格式會隨 Android 版本和手機廠牌改變；這裡的解析是對照 Android 12 檢查過的，遇到不認得的段落會照原文顯示，不會猜。電池 history 存在一個固定大小的環狀緩衝區裡（檢查的那台是 4096 KB），裝滿之後最舊的事件就被丟掉，所以時間軸只涵蓋還留著的那段。估計耗電的 mAh 是 Android 自己算的估計值，不是量測值，新版 Android 可能根本沒有這一段。喚醒原因的說明只涵蓋常見的名稱，廠商自訂的會標成「未知」。native 當機沒有符號檔，backtrace 只能顯示位址和模組名稱，還原不成函式名稱。

## Limits

Does not upload the bugreport, does not connect to a phone or pull a bugreport over USB yet, does not symbolize native crashes (no symbol files), and does not show battery history older than the device kept in its buffer.

## FAQ

### bugreport 怎麼產生？

在手機上：設定 → 關於手機，連點「版本號碼」七次解鎖開發人員選項，然後「開發人員選項 → 錯誤報告 → 完整報告」。通常一兩分鐘後會跳出通知，把 zip 分享給自己就好。在電腦上：`adb bugreport bugreport.zip`。把產生的 zip，或舊式的單一 `.txt`，拖到這個頁面就行。

### 為什麼我看不到 ANR trace？

ANR trace 放在 `/data/anr`，新版系統上 shell 使用者是讀不了這個目錄的。不過 `dumpstate` 自己有權限，所以完整的 bugreport 通常會把它們放在 zip 的 `FS/data/anr/` 下，頁面讀的就是這裡；主檔裡另外還有 VM TRACES 段落，可以在「原始段落」裡打開。如果兩邊都沒有，就是裝置沒把它們放進來：舊式的單一 `.txt` 只有當時內嵌的內容，剩下的只有主檔裡的 drop box 索引，那裡列得出項目但沒有內文。

### 估計耗電（mAh）準嗎？

不準，它本來也不是量出來的。「Estimated power use」底下的數字是 Android 自己依每個 App 佔用 CPU、無線電和螢幕的時間推算的模型值，不是在電池端量測的。拿來比較哪個 App 比較耗電還可以，拿來當絕對值就不行；新版 Android 可能根本不印這一段，那時排行裡就不會有 mAh 這張表。

### 會不會上傳？

不會。zip 在這個分頁的 Web Worker 裡解開、解析，表格也是在你的瀏覽器裡組出來的，不會送任何東西到伺服器。這點對 bugreport 比對大多數檔案都重要，因為裡面有帳號名稱、Wi-Fi 名稱、位置和通知內容。關掉分頁，報告就不在了。

### 支援哪些 Android 版本？

格式是對照 Android 12 的 bugreport 檢查的。段落結構、電池 history 的文法、ANR 和 tombstone 的格式都來自 AOSP 裡多年沒大改的程式碼，所以其他版本大多能用，但廠商的客製版本或更新的版本可能會新增或改名段落。頁面不認得的部分一律照原文顯示、不猜，「原始段落」分頁永遠有整個檔案。

### 為什麼電池 history 只有最近幾天？

Android 把電池 history 存在一個固定大小的環狀緩衝區裡，檢查的那台是 4096 KB。緩衝區滿了就丟掉最舊的事件來騰空間，所以更早的紀錄不在檔案裡，也沒辦法救回來。history 段落的標頭會顯示緩衝區用掉多少。

### 可以直接從手機抓 bugreport 嗎？

還不行。在手機上產生報告再透過 WebUSB 拉下來這條路還沒在真機上測過，所以頁面目前只收你手上已經有的檔案。請用開發人員選項或 `adb bugreport` 產生，再把 zip 拖進來。

## Related tools

- [Web ADB Toolkit](https://bytescope.dev/zh-Hant/web-adb.md) — 用 USB 連接 Android 手機，即時讀取它的電池、logcat 與 App。
- [PCAP Viewer](https://bytescope.dev/zh-Hant/pcap-viewer.md) — 開啟封包擷取（pcap）檔，在瀏覽器裡讀封包。
- [ELF Inspector](https://bytescope.dev/zh-Hant/elf-inspector.md) — 在瀏覽器裡檢視 ELF 執行檔的標頭、段落與符號。
