Android14 手机蓝牙配对后阻塞问题解决
文章目录
- [Android14 手机蓝牙配对后阻塞问题解决](#Android14 手机蓝牙配对后阻塞问题解决)
-
- 一、前言
- 二、手机蓝牙配对后阻塞问题解决
- 三、其他
-
- [1、Android14 蓝牙 BluetoothService 启动和相关代码介绍](#1、Android14 蓝牙 BluetoothService 启动和相关代码介绍)
- [2、Android14 待机关机蓝牙自动关闭分析解决](#2、Android14 待机关机蓝牙自动关闭分析解决)
一、前言
Android13、14 手机配对蓝牙后会造成阻塞问题。
Google 问题。测试了Android13 Google 手机也是有这个问题。
具体复现步骤和现象就是:
一台Google手机蓝牙配对另外一台手机的蓝牙后,
Google 手机重新扫描蓝牙设备就会无法扫描到其他设备,需要等待20多秒超时处理后才能重新看到扫描的蓝牙设备。
这个问题是Android14设备中一个自定义的系统应用不断连接、断开蓝牙出现无法扫描到蓝牙情况后发现的,后续的解决是把手机配对后连接的流程时间减少解决的,不然中途一直进行其他操作就有可能导致蓝牙服务异常。
只有手机之间配对会存在这个问题,手机和蓝牙配对是没有这个问题的,
大概原因就是手机配对后想进入连接状态,但是实际上无法进入连接状态,一直处于某种阻塞状态,直到连接超时才恢复正常。
这里记录一下,有蓝牙相关功能开发的可以看看。
二、手机蓝牙配对后阻塞问题解决
1、部分日志:
[16:05:06]09-06 16:05:07.854 22976 23060 W btm_acl : packages/modules/Bluetooth/system/stack/acl/btm_acl.cc:1167 BTM_IsAclConnectionUpAndHandleValid: Unable to find active acl
[16:05:06]09-06 16:05:07.857 22976 23019 I BluetoothBondStateMachine: Entering PendingCommandState State
[16:05:06]09-06 16:05:07.861 22976 23019 I BluetoothBondStateMachine: Bond State Change Intent:18:87:40:11:16:0E BOND_NONE => BOND_BONDING
[16:05:06]09-06 16:05:07.866 22976 23114 D BluetoothDatabase: getCustomMeta: device 18:87:40:11:16:0E is not in cache
[16:05:08]09-06 16:05:09.565 22976 23060 I btm_acl : packages/modules/Bluetooth/system/stack/acl/btm_acl.cc:1476 change_connection_packet_types: Unable to include remote supported packet types as read feature incomplete
[16:05:08]09-06 16:05:09.565 22976 23060 I btm_acl : packages/modules/Bluetooth/system/stack/acl/btm_acl.cc:1477 change_connection_packet_types: TIP: Maybe wait until read feature complete beforehand
[16:05:08]09-06 16:05:09.565 22976 23060 W btm_acl : packages/modules/Bluetooth/system/stack/acl/btm_acl.cc:1145 BTM_SetLinkSuperTout: Role is peripheral so unable to set supervision timeout:80.00ms bd_addr:xx:xx:xx:xx:16:0e
[16:05:08]09-06 16:05:09.565 22976 23060 I bt_btm_sec: packages/modules/Bluetooth/system/stack/btm/btm_sec.cc:4510 btm_sec_auth_timer_timeout: btm_sec_auth_timer_timeout: starting authentication
[16:05:12]09-06 16:05:13.725 22976 23019 D AdapterProperties: Adding bonded device:18:87:40:11:16:0E
[16:05:12]09-06 16:05:13.726 22976 23019 I BluetoothBondStateMachine: 18:87:40:11:16:0E is bonded, wait for SDP complete to broadcast bonded intent
[16:05:12]09-06 16:05:13.726 22976 23019 I BluetoothBondStateMachine: StableState(): Entering Off State
[16:05:16]09-06 16:05:17.971 22976 23060 W l2c_link: packages/modules/Bluetooth/system/stack/l2cap/l2c_link.cc:500 l2c_link_timeout: TODO: Remove this callback into bcm_sec_disconnect
[16:05:16]09-06 16:05:17.971 22976 23060 I btm_acl : packages/modules/Bluetooth/system/stack/acl/btm_acl.cc:188 hci_btsnd_hcic_disconnect: Disconnecting peer:xx:xx:xx:xx:16:0e reason:Remote Terminated Connection comment:stack::l2cap::l2c_link::l2c_link_timeout All channels closed
//下面这个日志之后,蓝牙列表才可以重新扫描到
[16:05:42]09-06 16:05:43.870 22976 23028 I bluetooth: packages/modules/Bluetooth/system/gd/hci/acl_manager/le_impl.h:909 on_create_connection_timeout: on_create_connection_timeout, address: 18:87:40:11:16:0e[PUBLIC_DEVICE_ADDRESS]
重点是:on_create_connection_timeout
上层的主要日志都是cpp相关,c的代码不熟悉,不做具体分析,这里直接提供一个答案。
2、解决方法
packages/modules/Bluetooth/system/gd/hci/acl_manager/le_impl.h
constexpr uint32_t kCreateConnectionTimeoutMs = 5 * 1000; /* change connect time 原本是30秒 */
这个是供应商提供的对策。
里面蓝牙里面有很多不同连接的超时时间,上面这个时间是针对手机配对连接的。
虽然写的是5秒,但是实际1秒左右就跳过了。
上面可能不是最优解,但是也算是一种解决方式。
三、其他
1、Android14 蓝牙 BluetoothService 启动和相关代码介绍
蓝牙开关和使能开发主要用到:BluetoothService、BluetoothManagerService、BluetoothManager、BluetoothAdapter 这几个系统相关类。
某个蓝牙的配对、连接、断开 使用的是 BluetoothDevice 对象。
蓝牙开关状态不记忆或者打开异常就可以看看BluetoothManagerService的日志,
里面有打开关闭相关过程日志和时间点,这个对问题分析有一定的帮助。
详细介绍:
https://blog.csdn.net/wenzhi20102321/article/details/142264944
2、Android14 待机关机蓝牙自动关闭分析解决
Android14 设备蓝牙开启的情况,待机关机后再开机出现有概率蓝牙关闭的问题。
设备开机后手动打开蓝牙是可以正常打开的。
通过分析发现是上层的蓝牙服务中有监听关机广播,有关闭蓝牙动作。
但是为啥会出现有概率关闭呢,具体原因是因为有时候蓝牙关闭流程没走完或者有些蓝牙关闭流程未走到设置蓝牙关闭属性的情况。
详细介绍:
https://blog.csdn.net/wenzhi20102321/article/details/142265044