代码之家  ›  专栏  ›  技术社区  ›  JeB

以编程方式启用HCI蓝牙监听日志

  •  2
  • JeB  · 技术社区  · 9 年前

    有一个众所周知的 way 以从开发者选项UI启用HCI蓝牙监听日志。
    有什么方法可以通过编程实现这一点吗?

    1 回复  |  直到 9 年前
        1
  •  4
  •   Glorfindel Doug L.    3 年前

    使用开发人员选项:

    • 如果您启用了开发者选项,那么您也可以在这些选项下启用蓝牙监听日志记录。重新启动后,您应该在下面找到日志文件 /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<设备>根
    • 然后重新安装, 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 是的隐藏API的一部分 BluetoothAdapter class ,因此请确保您知道如何启用它:

    使用 SL4A


    SL4A将脚本语言引入Android,允许您直接在Android设备上编辑和执行脚本和交互式解释器。这些脚本可以访问成熟的Android应用程序可用的许多API,但有一个非常简化的界面,可以轻松完成任务。

    如果您的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 Github上的版本已经过时,但您可以在官方AOSP中看到最新版本 repo ( Common\src\com\googlecode\android_scripting\facade\bluetooth )

    启用HCI监听日志的Python脚本如下所示:

    from android import Android
    
    droid = Android()
    droid.bluetoothConfigHciSnoopLog(True)
    

    完成日志记录后,您可以在中找到HCI Snoop日志 /sdcard/btsnoop_hci.log