以编程方式启用 HCI 蓝牙侦听日志
Enabling HCI Bluetooth snoop log programmatically
有一个众所周知的 way 可以从开发人员选项 UI 启用 HCI 蓝牙侦听日志。
有没有办法以编程方式实现这一目标?
使用开发者选项:
- 如果您启用开发者选项,那么您也可以在这些选项下启用蓝牙监听日志记录。重新启动后,您应该在
/data/misc/bluetooth/logs/
下找到您的日志文件(不确定您是否需要 root 才能访问这些文件),
使用 bt_stack.conf(需要 root)- (更新为 Android 8.0+)
bt_stack.conf
在 /system/etc/bluetooth
下找到,现有的 conf 文件也在 /data/misc/bluedroid
.
下找到
在大多数情况下,您必须使用以下步骤禁用 verity:
adb -s <DEVICE> root
adb -s <DEVICE> disable-verity
adb -s <DEVICE> reboot
(应用更改)
- 接下来再次进入root,重启后:
adb -s <DEVICE> root
- 然后重新挂载,
adb -s <DEVICE> remount
- 您也可以使用命令重新挂载
mount -o rw,remount <PARTITION>
- 然后您将能够推送文件,然后您可以进行更改 + 重新启动。
- 编辑
bt_stack.conf
文件(设置 BtSnoopLogOutput=true
)
- 禁用然后启用蓝牙 - 这将启动 HCI 监听日志记录
- 当你觉得够了,在设置的同时再次编辑文件
BtSnoopLogOutput=false
并重置蓝牙 - 这将停止 HCI 监听日志记录
- 我通常做的是拉取相应的文件,在我最喜欢的编辑器中进行更改(通常是
vi
或 VSCode),然后使用这些命令将其推回
adb -s <DEVICE> pull /system/etc/bluetooth/bt_stack.conf
adb -s <DEVICE> push bt_stack.conf /system/etc/bluetooth/.
- 除了
BTSnoop logging
,您还可以使用bt_stack.conf
启用所有堆栈跟踪。
以下是 Android 9.0 r34、MSM 内核 4.4 上的文件:
root@console:/system/etc/bluetooth# cat bt_stack.conf
# Enable trace level reconfiguration function
# Must be present before any TRC_ trace level settings
TraceConf=true
# Trace level configuration
# BT_TRACE_LEVEL_NONE 0 ( No trace messages to be generated )
# BT_TRACE_LEVEL_ERROR 1 ( Error condition trace messages )
# BT_TRACE_LEVEL_WARNING 2 ( Warning condition trace messages )
# BT_TRACE_LEVEL_API 3 ( API traces )
# BT_TRACE_LEVEL_EVENT 4 ( Debug messages for events )
# BT_TRACE_LEVEL_DEBUG 5 ( Full debug messages )
# BT_TRACE_LEVEL_VERBOSE 6 ( Verbose messages ) - Currently supported for TRC_BTAPP only.
TRC_BTM=2
TRC_HCI=2
TRC_L2CAP=2
TRC_RFCOMM=2
TRC_OBEX=2
TRC_AVCT=2
TRC_AVDT=2
TRC_AVRC=2
TRC_AVDT_SCB=2
TRC_AVDT_CCB=2
TRC_A2D=2
TRC_SDP=2
TRC_SMP=2
TRC_BTAPP=2
TRC_BTIF=2
TRC_BNEP=2
TRC_PAN=2
TRC_HID_HOST=2
TRC_HID_DEV=2
# This is Log configuration for new C++ code using LOG() macros.
# See libchrome/base/logging.h for description on how to configure your logs.
# sample configuration:
#LoggingV=--v=0
#LoggingVModule=--vmodule=*/btm/*=1,btm_ble_multi*=2,btif_*=1
# PTS testing helpers
# Secure connections only mode.
# PTS_SecurePairOnly=true
# Disable LE Connection updates
#PTS_DisableConnUpdates=true
# Disable BR/EDR discovery after LE pairing to avoid cross key derivation errors
#PTS_DisableSDPOnLEPair=true
# SMP Pair options (formatted as hex bytes) auth, io, ikey, rkey, ksize
#PTS_SmpOptions=0xD,0x4,0xf,0xf,0x10
# PTS AVRCP Test mode
#PTS_AvrcpTest=true
# SMP Certification Failure Cases
# Set any of the following SMP error values (from smp_api_types.h)
# to induce pairing failues for various PTS SMP test cases.
# Setting PTS_SmpFailureCase to 0 means normal operation.
# Failure modes:
#
# SMP_PASSKEY_ENTRY_FAIL = 1
# SMP_PAIR_AUTH_FAIL = 3
# SMP_CONFIRM_VALUE_ERR = 4
# SMP_PAIR_NOT_SUPPORT = 5
# SMP_PAIR_FAIL_UNKNOWN = 8
# SMP_REPEATED_ATTEMPTS = 9
# SMP_NUMERIC_COMPAR_FAIL = 12
#PTS_SmpFailureCase=0
使用隐藏 Android API
请注意,此方法需要您的应用程序具有 BLUETOOTH_ADMIN
权限。
如果没问题,您可以使用相同的 code Android 系统设置应用。
private void writeBtHciSnoopLogOptions() {
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
adapter.configHciSnoopLog(true);
}
configHciSnoopLog
是 BluetoothAdapter
class 的隐藏 API 的一部分,因此请确保您知道如何启用它:
- Using hidden Android API
- android-hidden-api library
使用SL4A
SL4A brings scripting languages to Android by allowing you to edit and execute scripts and interactive interpreters directly on the Android device. These scripts have access to many of the APIs available to full-fledged Android applications, but with a greatly simplified interface that makes it easy to get things done.
如果你的 Android 构建的镜像支持 SL4A,你可以使用 BluetoothFacade
的以下方法:
@Rpc(description = "Enable or disable the Bluetooth HCI snoop log")
public boolean bluetoothConfigHciSnoopLog(
@RpcParameter(name = "value", description = "enable or disable log")
Boolean value
) {
return mBluetoothAdapter.configHciSnoopLog(value);
}
请注意 API reference on Github is outdated, but you can see the latest in official AOSP repo (Common\src\com\googlecode\android_scripting\facade\bluetooth
)
Python 启用 HCI 监听日志的脚本如下所示:
from android import Android
droid = Android()
droid.bluetoothConfigHciSnoopLog(True)
完成日志记录后,您可以在 /sdcard/btsnoop_hci.log
中找到 HCI Snoop 日志
有一个众所周知的 way 可以从开发人员选项 UI 启用 HCI 蓝牙侦听日志。
有没有办法以编程方式实现这一目标?
使用开发者选项:
- 如果您启用开发者选项,那么您也可以在这些选项下启用蓝牙监听日志记录。重新启动后,您应该在
/data/misc/bluetooth/logs/
下找到您的日志文件(不确定您是否需要 root 才能访问这些文件),
使用 bt_stack.conf(需要 root)- (更新为 Android 8.0+)
bt_stack.conf
在 /system/etc/bluetooth
下找到,现有的 conf 文件也在 /data/misc/bluedroid
.
在大多数情况下,您必须使用以下步骤禁用 verity:
adb -s <DEVICE> root
adb -s <DEVICE> disable-verity
adb -s <DEVICE> reboot
(应用更改)- 接下来再次进入root,重启后:
adb -s <DEVICE> root
- 然后重新挂载,
adb -s <DEVICE> remount
- 您也可以使用命令重新挂载
mount -o rw,remount <PARTITION>
- 然后您将能够推送文件,然后您可以进行更改 + 重新启动。
- 编辑
bt_stack.conf
文件(设置BtSnoopLogOutput=true
) - 禁用然后启用蓝牙 - 这将启动 HCI 监听日志记录
- 当你觉得够了,在设置的同时再次编辑文件
BtSnoopLogOutput=false
并重置蓝牙 - 这将停止 HCI 监听日志记录 - 我通常做的是拉取相应的文件,在我最喜欢的编辑器中进行更改(通常是
vi
或 VSCode),然后使用这些命令将其推回 adb -s <DEVICE> pull /system/etc/bluetooth/bt_stack.conf
adb -s <DEVICE> push bt_stack.conf /system/etc/bluetooth/.
- 除了
BTSnoop logging
,您还可以使用bt_stack.conf
启用所有堆栈跟踪。
以下是 Android 9.0 r34、MSM 内核 4.4 上的文件:
root@console:/system/etc/bluetooth# cat bt_stack.conf
# Enable trace level reconfiguration function
# Must be present before any TRC_ trace level settings
TraceConf=true
# Trace level configuration
# BT_TRACE_LEVEL_NONE 0 ( No trace messages to be generated )
# BT_TRACE_LEVEL_ERROR 1 ( Error condition trace messages )
# BT_TRACE_LEVEL_WARNING 2 ( Warning condition trace messages )
# BT_TRACE_LEVEL_API 3 ( API traces )
# BT_TRACE_LEVEL_EVENT 4 ( Debug messages for events )
# BT_TRACE_LEVEL_DEBUG 5 ( Full debug messages )
# BT_TRACE_LEVEL_VERBOSE 6 ( Verbose messages ) - Currently supported for TRC_BTAPP only.
TRC_BTM=2
TRC_HCI=2
TRC_L2CAP=2
TRC_RFCOMM=2
TRC_OBEX=2
TRC_AVCT=2
TRC_AVDT=2
TRC_AVRC=2
TRC_AVDT_SCB=2
TRC_AVDT_CCB=2
TRC_A2D=2
TRC_SDP=2
TRC_SMP=2
TRC_BTAPP=2
TRC_BTIF=2
TRC_BNEP=2
TRC_PAN=2
TRC_HID_HOST=2
TRC_HID_DEV=2
# This is Log configuration for new C++ code using LOG() macros.
# See libchrome/base/logging.h for description on how to configure your logs.
# sample configuration:
#LoggingV=--v=0
#LoggingVModule=--vmodule=*/btm/*=1,btm_ble_multi*=2,btif_*=1
# PTS testing helpers
# Secure connections only mode.
# PTS_SecurePairOnly=true
# Disable LE Connection updates
#PTS_DisableConnUpdates=true
# Disable BR/EDR discovery after LE pairing to avoid cross key derivation errors
#PTS_DisableSDPOnLEPair=true
# SMP Pair options (formatted as hex bytes) auth, io, ikey, rkey, ksize
#PTS_SmpOptions=0xD,0x4,0xf,0xf,0x10
# PTS AVRCP Test mode
#PTS_AvrcpTest=true
# SMP Certification Failure Cases
# Set any of the following SMP error values (from smp_api_types.h)
# to induce pairing failues for various PTS SMP test cases.
# Setting PTS_SmpFailureCase to 0 means normal operation.
# Failure modes:
#
# SMP_PASSKEY_ENTRY_FAIL = 1
# SMP_PAIR_AUTH_FAIL = 3
# SMP_CONFIRM_VALUE_ERR = 4
# SMP_PAIR_NOT_SUPPORT = 5
# SMP_PAIR_FAIL_UNKNOWN = 8
# SMP_REPEATED_ATTEMPTS = 9
# SMP_NUMERIC_COMPAR_FAIL = 12
#PTS_SmpFailureCase=0
使用隐藏 Android API
请注意,此方法需要您的应用程序具有 BLUETOOTH_ADMIN
权限。
如果没问题,您可以使用相同的 code Android 系统设置应用。
private void writeBtHciSnoopLogOptions() {
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
adapter.configHciSnoopLog(true);
}
configHciSnoopLog
是 BluetoothAdapter
class 的隐藏 API 的一部分,因此请确保您知道如何启用它:
- Using hidden Android API
- android-hidden-api library
使用SL4A
SL4A brings scripting languages to Android by allowing you to edit and execute scripts and interactive interpreters directly on the Android device. These scripts have access to many of the APIs available to full-fledged Android applications, but with a greatly simplified interface that makes it easy to get things done.
如果你的 Android 构建的镜像支持 SL4A,你可以使用 BluetoothFacade
的以下方法:
@Rpc(description = "Enable or disable the Bluetooth HCI snoop log")
public boolean bluetoothConfigHciSnoopLog(
@RpcParameter(name = "value", description = "enable or disable log")
Boolean value
) {
return mBluetoothAdapter.configHciSnoopLog(value);
}
请注意 API reference on Github is outdated, but you can see the latest in official AOSP repo (Common\src\com\googlecode\android_scripting\facade\bluetooth
)
Python 启用 HCI 监听日志的脚本如下所示:
from android import Android
droid = Android()
droid.bluetoothConfigHciSnoopLog(True)
完成日志记录后,您可以在 /sdcard/btsnoop_hci.log