關於這個工具
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 只能顯示位址和模組名稱,還原不成函式名稱。