このツールについて
bugreport は、Android が要求に応じて生成する診断ダンプです。全システムサービスの dumpsys 出力、「端末が何をしていたか」の履歴付き電池統計、直近の ANR トレースと tombstone、logcat バッファ、端末プロパティの写しが入っています。アプリが落ち続ける、一晩で電池が空になる、というときに Android のエンジニアが求めるのがこのファイルで、Battery Historian が読むのも同じものです。ただし Battery Historian は Docker で立てる Go のサーバーです。このページは同じ zip をブラウザの中で開きます。Web Worker でアーカイブを展開し、メインファイルをセクションに分け、電池履歴と wakelock の表を解析して、タブに整理します。
作り方
端末側では、まず開発者向けオプションを有効にします(デバイス情報 → ビルド番号を 7 回タップ)。次に「開発者向けオプション → バグレポート」でフルレポートを選び、通知が出るまで待ちます。数分かかり、その間は端末の動作が重くなります。ADB が使えるパソコンなら adb bugreport bugreport.zip で同じアーカイブを保存できます。古い端末や一部の adb bugreport は zip ではなく単一の .txt を出しますが、どちらも読み込めます。WebUSB で端末から直接レポートを取得する機能はまだありません。端末側で生成してからファイルをドロップしてください。
知らないサイトにアップロードしてはいけない理由
bugreport に入っているのは電池の数字だけではありません。アカウント名、Wi-Fi のネットワーク名、最後に取得した位置情報、直近の通知の本文、インストール済みパッケージ、logcat の一部まで含まれます。グラフ 1 枚のためにそれを誰かのサーバーへ送るのは割に合いません。このページではアーカイブをこのタブの Web Worker の中で展開・解析し、どこにも送信せず、タブを閉じれば消えます。ベンダーに渡したり issue tracker に貼ったりする必要があるなら、先に一度中身を読んで、何が含まれているか考えてからにしてください。
各タブで見えるもの
「概要」には端末情報(機種、メーカー、Android のバージョン、ビルドフィンガープリント、カーネル、稼働時間、レポートの取得日時)、取得時点の電池の状態、そして異常の要約が並びます。要約は ANR・アプリクラッシュ・ネイティブクラッシュの件数、電池を最も消費したアプリ、最も多い起床理由で、それぞれ該当タブへ飛べます。「電池タイムライン」は電池残量の推移と、履歴に実際に含まれる状態ごとのトラック(画面、充電、running、wake_lock、モバイル通信、Wi-Fi、GPS、前面のアプリ、doze)を描き、残量が最も急に落ちた 5 区間と、その間にどのトラックが有効だったかも示します。「消費ランキング」にはアプリ別の partial wakelock、kernel wakelock、回数順の起床理由、レポートに含まれていれば Android 自身が推定したアプリ別消費電力(mAh)があります。「クラッシュ」は ANR をプロセス・PID・理由付きで一覧し、展開すると全スレッドがメインスレッドを先頭に表示され、最初の非フレームワークフレームに印が付き、「waiting to lock … held by thread N」のようなロック待ちも示します。アプリのクラッシュは例外の種類・メッセージ・スタック、tombstone はシグナル・fault address・abort message・バックトレースです。「生セクション」はメインファイルの目次と仮想スクロールの本文で、全文検索と、logcat のレベル・タグ・PID での絞り込みができます。各表は CSV に書き出せ、概要・ランキング・クラッシュ一覧は JSON としてコピーできます。
正直に書く制限
bugreport の形式は Android のバージョンとメーカーによって変わります。ここでの解析は Android 12 で確認したもので、認識できないセクションは推測せず、そのままのテキストで表示します。電池履歴は固定サイズのリングバッファ(確認した端末では 4096 KB)に保存され、いっぱいになると古いイベントから捨てられるため、タイムラインに出るのは残っている範囲だけです。推定消費電力(mAh)は Android 自身の推定値で実測ではなく、新しいバージョンではセクション自体がないこともあります。起床理由の説明は一般的な名前だけで、メーカー独自の名前は「不明」と表示します。ネイティブクラッシュはシンボル化できないので、バックトレースに出るのはアドレスとモジュール名だけで、関数名には戻せません。