我在我面前有一堆各种各样的
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()的失败,所以当这种情况发生时(大概是因为听到太多的设备地址之后,由于存储空间不足),代码就会丢失,并尝试取消引用节点指针的名称成员而无需将其设置为非空地址.
一个修复可能需要涉及:
>在不能分配新记录时,对此错误情况进行非崩溃处理>当新的人不断听到并且存储的记录数量变得不合理时,更积极地丢弃过去听到的地址