一、手机蓝牙日志 btsnoop_HCI 介绍
在蓝牙协议开发过程中,常见问题包括:远端设备发出的消息未收到、接收到的消息与发送内容不一致、消息发送失败等。
btsnoop_hci.log 是 Android 蓝牙协议栈中重要的调试方式。该日志记录了 host 与 controller 之间的全部通信内容,覆盖蓝牙协议栈各层的消息交互过程,包含协议栈发出和接收的所有消息。
不同手机厂商及操作系统版本的抓取方式存在差异,以下为主流手机系统的抓取步骤。
二、小米/红米系列 HyperOS
1. 输入抓取命令
在拨号键输入 *#*#5959#*#* 来开始抓取日志。
2. 复现问题
开始复现suoy遇到的问题。
3. 结束日志抓取
复现问题后,再次在拨号键输入 *#*#5959#*#* 以结束抓取日志。
4. 等待日志保存
日志将存放在 MIUI/debug_log 目录里,格式为 bugreport-xxxx-xx-xx-xxxxxx.zip 的压缩包。
5. 提交日志
请将保存的日志文件发给技术支持以便进一步分析。
图示操作步骤如下:

三、荣耀(Honor)手机系列 MagicOS
1. 启用开发者模式
进入 设置 → 关于手机 → 连续点击版本号7次以启用开发者模式。
2. 开启蓝牙 HCI 信息收集日志和 USB 调试
进入 系统和更新 → 开发者选项,打开开启蓝牙 HCI 信息收集日志 和 USB 调试。
3. 重现问题并关闭蓝牙
尝试重现问题后,关闭手机的蓝牙功能。
4. 通过 ADB 工具将 HCI 日志文件拉取到电脑本地
将手机连接至电脑,确保 ADB 正常工作。
5. 执行 ADB 拉取文件命令
adb pull /data/log/bt bt
6. 确认是否成功拉取到电脑本地
- 执行完毕后,在电脑的
C/Users/{用户名称} 目录下会生成一个名为 bt 的文件夹。
- 进入
bt 目录,按时间排序找到最近日期的 HCI 文件,命名格式为 btsnoop_hci_xxxxxxxx.log。
图示操作步骤如下:

四、华为(HUAWEI)手机系列 HarmonyOS
1. 启用开发者模式
进入 设置 → 关于手机 → 连续点击版本号 7 次 以启用开发者模式。
2. 开启蓝牙 HCI 信息收集日志和 USB 调试
进入 系统和更新 → 开发者选项 ,打开 开启蓝牙 HCI 信息收集日志 和 USB 调试 。
3. 重现问题并关闭蓝牙
尝试重现问题后,关闭手机的蓝牙功能。
4. 通过 ADB 工具将 HCI 日志文件拉取到电脑本地
将手机连接至电脑,确保 ADB 正常工作。
5. 执行 ADB 拉取文件命令
在终端中执行以下命令:
adb pull /data/log/bt bt
6. 确认是否成功拉取到电脑本地
执行完毕后,在电脑的 C/Users/{用户名称} 目录下会生成一个名为 bt 的文件夹。进入 bt 目录,按时间排序找到最近日期的 HCI 文件,命名格式为 btsnoop_hci_xxxxxxxx.log。
图示操作步骤如下:

五、OPPO 手机系列 ColorOS 系统
1. 启用开发者模式
进入设置,找到并打开手机的开发者模式。
2. 进入蓝牙异常反馈界面
在拨号界面输入 *#800#,进入异常反馈界面,选择 蓝牙异常项。
3. 开始抓取
点击 开始抓取 ,建议选择为重启方式抓取。
4. 重现问题
开始复现问题(抓取过程中会自动关闭手机蓝牙,需手动再次打开)。
5. 结束抓取
等待问题复现后,在拨号界面输入 *#800#,进入蓝牙异常反馈界面,选择「完成并反馈」。
6. 查找日志文件
等待生成日志文件后,连接到电脑上,在如下目录查找 .caf 后缀的 HCI 文件:
- 内部共享存储空间
/oppo_log/
- 内部共享存储空间
/Android/data/com.coloros.logkit/files/Log/
图示操作步骤如下:

六、realme手机系列 realme UI(ColorOS 换皮版)
1. 启用开发者模式
进入设置,找到并打开手机的 开发者模式 。
2. 进入蓝牙异常反馈界面
在设置界面点击 无线和网络 选择 蓝牙,进入异常反馈界面,选择 蓝牙异常项。
3. 开始抓取
点击 开始抓取 ,建议选择为重启方式抓取。
4. 重现问题
开始复现问题(抓取过程中会自动关闭手机蓝牙,需手动再次打开)。
5. 结束抓取
等待问题复现后,在拨号界面输入 *#800#,进入蓝牙异常反馈界面,选择 完成并反馈 。
6. 查找日志文件
等待生成日志文件后,连接到电脑上,在如下目录查找 .caf 后缀的 HCI 文件。
- 内部共享存储空间
/Android/data/com.coloros.logkit/files/Log/
图示操作步骤如下:

七、FAQ 常见问题
Q1:小米手机抓取日志后,MIUI/debug_log 目录内没有生成日志文件
A:系统生成日志文件需要时间,可以查看状态栏,看是否有生成日志的进度显示。
Q2:华为手机获取不到日志文件
A:确保手机开启了开发者模式,并且已连接电脑。如果问题仍然存在,请尝试重启手机蓝牙。
Q3:为什么执行 adb pull 命令提示 "Permission denied"
A:该问题通常是因为手机没有开启 USB 调试授权。检查以下步骤:
- 确认已在开发者选项中开启「USB 调试」
- 连接电脑后手机屏幕会弹出 USB 调试授权提示,点击「始终允许」
- 重新执行 adb pull 命令
Q4:日志文件太大,如何筛选有效信息
A:建议将日志文件直接提交给飞易通技术支持人员进行分析,技术团队可通过专业工具定位问题时间段的关键通信内容。
八、扩展
1. HCI 数据包类型说明
HCI 其实严格意义上来讲不是一个层 layer 的概念(与 L2CAP 或者 RFCOMM 等相比),而是 host 和 controller 的接口,这两个接口之间传递的消息可称为 HCI 数据包。
HCI 的"纯"数据格式中并没有定义数据的流向,即是从 host 到 controller 还是相反。
host 与 controller 传递消息时,在每个 HCI 包的前面会有一个 indicator 来指示这个 HCI 数据的类型,由此可以知道其方向如何。

我们这里只说 1-4 的数据类型:
- HCI Command Packet:host 发给 controller,主要是 HCI 命令,注意是命令,不是数据。
- HCI Event Packet:controller 发给 host。对应于 command packet。
- HCI ACL Data Packet:host 发给 controller 或者相反。主要是 L2CAP 发送和接收的数据,我们上层的所有数据,注意是数据,而不是命令,都是通过这个 type 来传递的。
- HCI Synchronous Data Packet:用来传输语音(SCO)数据的。注意一般都会通过 PCM 接口来传输 SCO 数据。
2. 常用 btsnoop_hci.log 查看工具
Wireshark 和 Frontline 的 Capture File Viewer 都可以用来查看 btsnoop_hci.log。这些工具可以去对应官网下载。
下面示例结合使用 Wireshark 来查看。
3. 示例
对于一些设置名字、读取本机蓝牙地址等等的命令,都是通过 HCI command packet 来做的,例如:


而发送出去的和接收的上层数据都是通过 ACL data packet 的 type 来完成的,例如:


通过对比收发双方的 HCI 数据包,可以验证 stack 发出的数据与 app 下发的数据是否一致,以及 stack 接收的数据与上报至 app 的数据是否存在遗漏。
Wireshark 和 Frontline Capture File Viewer 均能按 HCI、L2CAP、ATT、GATT 等协议层清晰列出命令与数据,便于定位问题所在层级。
同理,上述方法也适用于调试其他蓝牙 profile(如 HFP、PBAP 等),但要求对协议栈各层有基本了解,以准确解读 log 内容。