Android BT HCI snoop日志蓝牙流量录制及bugreport生成时机咨询
安卓高版本蓝牙HCI日志抓取与触发机制说明
背景
较新版本Android系统中原生btsnoop HCI日志无法直接导出使用,需通过生成bug report的方式抓取蓝牙流量,标准操作步骤如下:
设备端操作
- 开启开发者选项中的USB调试功能
- 开启开发者选项中的HCI logging功能
- 启动或重启蓝牙服务
- 重启设备(原生系统可省略,仅针对定制ROM场景生效)
电脑端操作
- 安装ADB调试工具
- 通过USB连接手机与电脑,确认ADB调试授权正常
终端操作
- 执行命令导出bugreport:
$adb bugreport bugreport - 解压导出的压缩包:
$unzip bugreport.zip - 进入蓝牙日志对应目录:
$cd /FS/data/misc/bluetooth/logs/ - 解析日志:使用官方提供的
$py3 btsnooz.py btsnoop_hci.log > btsnoop_hci.txt命令,或通过wireshark内置功能直接解析二进制日志文件
已知问题表现
当前蓝牙日志生成逻辑无公开官方说明,实际使用表现极不稳定:
- 每次开启蓝牙HCI snooping功能后60秒会被系统自动关闭
- 10次导出操作约有5次的bugreport.zip中,/FS/data/misc/bluetooth/logs/路径下不存在对应蓝牙日志文件夹
- 日志时长不稳定,部分时候不足5秒,部分时候可超过1000秒
触发机制说明
蓝牙流量录制触发逻辑
三个操作的触发优先级和作用如下:
- 核心配置触发:开发者选项开启蓝牙HCI日志开关是录制的必要前提,仅开启开关不会立刻启动录制,系统仅标记蓝牙日志配置为可用状态
- 录制启动触发:蓝牙开关启停是录制的正式启动信号,重启蓝牙后蓝牙服务会读取已开启的HCI日志配置,启动流量抓取并写入缓存,日志起始时间从本次蓝牙启动时间计算
- 配置持久化触发:设备重启仅针对国内定制ROM生效,多数定制ROM会限制开发者选项的临时配置权限,重启后HCI日志配置才会写入系统持久化配置文件,避免被系统自动回收清理
bugreport生成触发逻辑
bugreport完全由adb bugreport命令执行时触发,执行命令瞬间系统会拉取过去1小时内所有系统服务的缓存、磁盘日志文件打包生成压缩包:如果此时蓝牙HCI日志还在内存缓存中未刷入磁盘,就会出现找不到日志文件夹的情况;如果蓝牙服务在录制过程中被系统回收重启,就会出现日志时长不足的问题。
稳定抓取优化方案
- 开启HCI日志开关后立刻重启蓝牙,等待30秒再执行需要抓包的蓝牙操作,确保日志已开始写入磁盘
- 开启HCI日志后10秒内启动复现操作,避免60秒自动关闭开关导致录制中断
- 需长时录制时可提前执行命令
adb shell settings put secure bluetooth_hci_log 1强制锁死HCI日志开关,规避系统自动关闭逻辑 - 复现操作完成后立刻执行
adb bugreport命令导出日志,避免日志被系统定期清理
内容的提问来源于stack exchange,提问作者sourpeach
相关产品推荐
相关产品推荐

