Bluetoothをパケットキャプチャする方法(btsnoop_hci.logの取得とbtsnooz_hci.logになる理由)【Android】
Android の Bluetooth 通信を記録・キャプチャする方法を自分用にメモしておきます。
開発者向けオプションの「Bluetooth HCI スヌープログ」機能を使ったキャプチャ方法です。
Bluetooth 通信の解析には、通常、全通信データを含む btsnoop_hci.log を取得する必要がありますが、なぜだか省略版の btsnooz_hci.log しか取れない、という方向けに役立つ情報も書いておきます。
今回の手順で取得するのは、Android と端末内の Bluetooth コントローラーとの間でやり取りする HCI パケット。
スクショと手順は Pixel(Android 17)のもの。設定項目やログの格納場所などは、機種・Android のバージョンによって異なる場合があります。
AndroidでBluetooth通信をパケットキャプチャする方法
Bluetoothのログを有効にする
まずは Android の「設定」→「システム」→「開発者向けオプション」を開きます。

「開発者向けオプション」がない場合は、以下の記事の手順で出してください。

「開発者向けオプション」の出し方(Android、Fire TV、Fireタブレット)
「Android」「Fire タブレット」「Fire TV Stick」で「開発者向けオプション」が…
「開発者向けオプション」を開いたら、「ネットワーク」欄の「Bluetooth」を開き、

「Bluetooth HCI スヌープログ」を「有効」にします。(通信内容を記録したいので、「有効(フィルタ済み)」は選びません)

BluetoothをOFF→ONし、記録したい操作をする
設定を反映するため、Bluetooth を一度 OFF にし、再び ON にします。このとき、接続中のイヤホンやスマートウォッチなどは一時的に切断されます。

この Bluetooth OFF → ON の操作以降、Bluetooth 通信の記録が開始されます。
あとはスマホを操作して、記録したい Bluetooth 通信を発生させれば OK です。
ログを無効化後→Bluetoothを切らずにバグレポート作成
記録したい操作が終わったら、先ほどの「Bluetooth HCI スヌープログ」を「無効」に戻します。

その後、ここでは Bluetooth を OFF にせず、そのままバグレポートを作成します。(無効化反映のための Bluetooth OFF→ON はバグレポート作成後)
「開発者向けオプション」に戻り、「バグレポート」をタップ。

「対話型レポート」を選択し、「レポート」を押します。

通知に「バグレポート #2 の生成中」のように表示されるので、完了まで待ちます。(かなり時間がかかります。)

「バグレポートを共有するにはタップします」という通知に変われば、作成完了です。

通知をタップで Android の「共有」でファイル送信できます。このバグレポートには、アプリの使用状況や位置情報など、かなりセンシティブな情報が含まれます。共有先は自分の保存先や信頼できる相手に限定するのがよいでしょう。
BluetoothをOFF→ONで、スヌープログの無効化を反映
レポート作成が完了したら、Bluetooth を一度 OFF にしてから、再び ON にします。先ほど変更したログの無効設定を反映するためです。

作成したバグレポートファイルの場所
生成済みのバグレポートは、アプリ「Files by Google」からも確認できます。
画面下部右側の「その他のストレージ」を開き、

「バグレポート」を選びます。

作成時刻の ZIP アーカイブを長押しで選択 → 必要なら上部の共有ボタンから PC などへ送ります。似た名前の TXT ファイルに注意。

btsnoop_hci.logの格納場所は?
Bluetooth HCI 通信のキャプチャ結果である btsnoop_hci.log は、今回の環境ではバグレポート ZIP 内の以下の場所に入っていました。
.\FS\data\misc\bluetooth\logs\btsnoop_hci.logCode language: CSS (css)バグレポートでは、そのほかにも端末内から回収したファイルが .\FS 以下に元の階層を保って収録されます。(バグレポートの構造についての公式説明)
なお、取得できた btsnoop_hci.log は、パケット解析アプリ「Wireshark」でも直接開くことができます。
btsnooz_hci.logしかない場合
面倒なのが、btsnoop_hci.log でなく、似た名前の btsnooz_hci.log しか取得できないケース。ペイロードの肝心の部分がごっそり含まれてなくて解析に支障が出たり、キャプチャの取り直しになったりするわけです。
実は AOSP の実装では、スヌープログ無効時、記録内容を絞ったログをメモリ内に保持し、btsnooz として出力する仕組みがあります。また、無効状態でログ機能が初期化される際には、既存の btsnoop ファイルを削除する処理もあります。(AOSP の実装)
ここから推測するに、ログを無効にしたあと、バグレポート作成前に Bluetooth を再起動する操作は避けたいところ。だから、今回紹介した手順でキャプチャを取るのがオススメ、というわけ。
結局は、バグレポート作成前に何か余計な操作をすると起きるということなのでしょう。間違ったことを書いていたら後日修正するかもですが、まずはうまくいった手順を書き残しておきました。
コメントを記入