执行LeScan时"蓝牙共享已停止工作"

Mas*_*rry 9 android bluetooth bluetooth-lowenergy

我面前有一堆各种各样的Android手机都在运行4.3/4.4,而且他们似乎都遇到了蓝牙中的一些错误.我上运行的应用程序使用此回调只是在扫描周围其他蓝牙设备:http://developer.android.com/reference/android/bluetooth/BluetoothAdapter.LeScanCallback.html

只是LogCatting数据仍然有问题...

有没有人知道这个bug并修复它?我真的需要让蓝牙扫描稳定在我明天的截止日期,以便我的应用程序演示......

谢谢.

编辑:据说在4.4.3(或4.4.4)中解决了这个问题.(当然,我们为项目介绍的那天......对我们没有好处).主要问题是XML文件跟踪大小超过2000的mac地址然后崩溃......系统重置会清除xml文件,从而暂时解决问题.

Chr*_*ton 21

这是Android蓝牙代码中的一个错误,目前似乎没有解决方案.由于其他人也不断发现这一点,我将发布我在通过蓝牙堆栈追踪问题时发现的内容,即使它不能真正作为解决方案应用,除非有人准备对基于AOSP进行重大更改安装.

从根本上说,当在听到太多独特的BTLE硬件地址后,alloc_node()失败时,问题是在find_add_node()的btif_config.c中的SIGSEGV.

堆栈跟踪的信息部分

D/BtGatt.btif(22509): btif_gattc_upstreams_evt: Event 4096
D/BtGatt.btif(22509): btif_gattc_add_remote_bdaddr device added idx=1
D/BtGatt.btif(22509): btif_gattc_update_properties BLE device name=beacon len=6 dev_type=2
F/libc    (22509): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 22530 (BTIF)
I/DEBUG   (  171): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   (  171): Build fingerprint: 'google/occam/mako:4.4.2/KOT49H/937116:user/release-keys'
I/DEBUG   (  171): Revision: '11'
I/DEBUG   (  171): pid: 22509, tid: 22530, name: BTIF  >>> com.android.bluetooth <<<
I/DEBUG   (  171): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000
I/DEBUG   (  171):     r0 ffffffff  r1 00007d00  r2 00007c60  r3 74c7cf00
I/DEBUG   (  171):     r4 74c7cf10  r5 00000000  r6 756f95a8  r7 7503c671

I/DEBUG   (  171): backtrace:
I/DEBUG   (  171):     #00  pc 0004e68c  /system/lib/hw/bluetooth.default.so
I/DEBUG   (  171):     #01  pc 0004ea65  /system/lib/hw/bluetooth.default.so (btif_config_set+156)
Run Code Online (Sandbox Code Playgroud)

反汇编,有问题的代码是这个相当明显有问题的系列清除r5,然后尝试将其作为基指针去引用:

       4e68a:   2500        movs    r5, #0
       4e68c:   6829        ldr r1, [r5, #0]
       4e68e:   b919        cbnz    r1, 4e698 <btif_gattc_test_command_impl+0x74c>
       4e690:   4630        mov r0, r6
       4e692:   f7dd ef78   blx 2c584 <strdup@plt>
Run Code Online (Sandbox Code Playgroud)

这对应于find_add_node()末尾的"if(!node-> name)"检查

static cfg_node* find_add_node(cfg_node* p, const char* name)
{
    int i = -1;
    cfg_node* node = NULL;
    if((i = find_inode(p, name)) < 0)
    {
        if(!(node = find_free_node(p)))
        {
            int old_size = alloc_node(p, CFG_GROW_SIZE);
            if(old_size >= 0)
            {
                i = GET_NODE_COUNT(old_size);
                node = &p->child[i];
                ADD_CHILD_COUNT(p, 1);
            } /* else clause to handle failure of alloc_node() is missing here */
        } else ADD_CHILD_COUNT(p, 1);
    }
    else node = &p->child[i];
    if(!node->name)   /* this will SIGSEGV if node is still NULL */
        node->name = strdup(name);
    return node;
}
Run Code Online (Sandbox Code Playgroud)

具体来说,没有else子句来处理alloc_node()的失败,所以当发生这种情况时(可能是由于在听到太多设备地址后用完了存储空间)代码失败并尝试取消引用节点指针的名称成员没有将它设置为非空地址.

修复可能需要涉及:

  1. 无法分配新记录时,此错误情况的非崩溃处理

  2. 当新的地址继续被听到并且存储的记录数量变得不合理时,更积极地丢弃过去听到的地址

  • 我找到了清除这些地址的方法.见[here](http://developer.radiusnetworks.com/2014/04/02/a-solution-for-android-bluetooth-crashes.html) (4认同)