我面前有一堆各种各样的Android手机都在运行4.3 / 4.4并且它们似乎都遭受了蓝牙中的一些错误。我正在运行的应用程序只是使用此回调扫描其周围的其他蓝牙设备:http://developer.android.com/reference/android/bluetooth/BluetoothAdapter.LeScanCallback.html
只是记录数据并仍有问题......
是否有人知道这个错误并修复它?我真的需要让蓝牙扫描稳定在我明天的截止日期,以便我的应用程序演示......
感谢。
编辑:据说在4.4.3(或4.4.4)中已经解决了。 (当然,我们为项目介绍的那天......对我们没有好处)。主要问题是XML文件跟踪大小超过2000的mac地址,然后崩溃......系统重置会清除xml文件,从而暂时解决问题。
答案 0 :(得分: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)
反汇编,有问题的代码是这个相当明显有问题的系列清除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-&gt; 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()的失败,所以当发生这种情况时(可能是由于在听到太多设备地址后用完了存储空间),代码就会失败并试图取消引用名称成员没有将节点指针设置为非空地址的节点指针。
修正案可能需要涉及:
无法分配新记录时此错误情况的非崩溃处理
当新的地址继续被听到并且存储的记录数量变得不合理时,更积极地丢弃过去听到的地址
答案 1 :(得分:3)
有人刚开了个问题:https://code.google.com/p/android/issues/detail?id=67272。任何支持证据都应该去那里,希望Google在下一版本中修复此问题。
答案 2 :(得分:0)
这可能是一个罕见的原因,但是当我尝试在我的Galaxy Nexus上使用L Tone时遇到了这个问题。我尝试了各种解决方案,但没有任何效果,然后我记得我安装了一个启用了蓝牙LE的应用程序(在我的root手机中)(Galaxy Nexus上的通常4.3无法访问)。一旦我卸载了应用程序安装的文件,它似乎工作正常。
所以,如果事情还没有工作......问问自己,你是否在电话上做过任何可能存在冲突的自定义事项。
答案 3 :(得分:0)
修复了我的S4(i9500): 安装Android 5.1.1的自定义ROM后,我开始面对这个“蓝牙停止”问题。由于我的手机已植根,我安装了“Root Uninstaller”应用程序和FROZE蓝牙服务。之后我没有遇到任何问题。但我再次不确定我的蓝牙是否正常工作。只是我不再那些烦人的弹出窗口了。 希望这有助于某人!