Android – 执行LeScan时,“蓝牙共享已停止工作”

前端之家收集整理的这篇文章主要介绍了Android – 执行LeScan时,“蓝牙共享已停止工作”前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在我面前有一堆各种各样的 Android手机,全部运行4.3 / 4.4,他们似乎都在蓝牙中遇到一些bug.我正在运行的应用程序只是使用此回调: http://developer.android.com/reference/android/bluetooth/BluetoothAdapter.LeScanCallback.html扫描其周围的其他蓝牙设备

只需记录数据并仍然有问题…

有没有人知道这个bug,并有一个修复?我真的需要得到蓝牙扫描稳定的截止日期,我有明天的演示我的应用程序…

谢谢.

编辑:在4.4.3(或4.4.4)中,这被解决了. (当然这个项目的介绍当天我们没有任何好处).主要问题是XML文件跟踪mac地址在2000年的大小上增长,然后崩溃…系统重置将清除xml文件,从而临时解决问题.

解决方法

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

从根本上说,问题是在find_add_node()中的btif_config.c中,当在听到太多唯一的BTLE硬件地址之后alloc_node()失败时,这个问题是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)

反汇编,有关的代码是这个相当明显的问题的清除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>

这对应于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;
}

具体来说,没有else子句来处理alloc_node()的失败,所以当这种情况发生时(大概是因为听到太多的设备地址之后,由于存储空间不足),代码就会丢失,并尝试取消引用节点指针的名称成员而无需将其设置为非空地址.

一个修复可能需要涉及:

>在不能分配新记录时,对此错误情况进行非崩溃处理>当新的人不断听到并且存储的记录数量变得不合理时,更积极地丢弃过去听到的地址

猜你在找的Android相关文章