ByteScope

Android Bugreport Analyzer

把 bugreport.zip 拖進來,就能看到這支手機到底在做什麼:電量曲線加上螢幕、wakelock、充電等軌道,哪些 App 和 wakelock 一直把手機叫醒,每一筆 ANR 都把主執行緒排在最前面,還有 App 當機、tombstone 和可以搜尋的原始文字。全部在這個分頁裡處理,這種塞滿個人資料的檔案不會被上傳。

檔案不會離開你的瀏覽器 — 全部在本機處理。

把 bugreport.zip 拖到這裡,或點擊選擇

bugreport*.zip 或舊版 .txt。在這個分頁裡讀取,不會上傳。

這裡看不到的事

  • bugreport 的格式會隨 Android 版本與手機廠牌改變。這個工具認不得的段落會照原文顯示,不會猜。
  • 電池紀錄只涵蓋手機緩衝區保留的那段時間,更早的事件已經不在檔案裡。
  • 估計耗電(mAh)是 Android 自己算的估計值,不是量測值。新版 Android 可能不會印出這一段。
  • 喚醒原因的說明只涵蓋常見的名稱,廠商自訂的名稱會標示為「未知」。
  • 原生當機沒有符號檔,這裡只能顯示位址與模組,無法還原成函式名稱。
  • bugreport 裡有很多個人資料:帳號、Wi-Fi 名稱、位置、通知內容。這個工具在你的瀏覽器裡處理,不會上傳;但如果你要把檔案傳給別人,請先想清楚。

檔案不會傳到任何地方。頁面只會送出匿名的使用事件。

關於這個工具

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

常見問題

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 拖進來。