重点:
配对记录在:/data/misc/bluedroid/bt_config.conf
本地地址:初始化的时候从HCI获取
本地设备名:getprop ro.product.model可以获取到
一、如何上传配对记录
1、RemoteDevices.java内有个函数:devicePropertyChangedCallback
会上传:
AbstractionLayer.BT_PROPERTY_BDNAME
AbstractionLayer.BT_PROPERTY_REMOTE_FRIENDLY_NAME
AbstractionLayer.BT_PROPERTY_BDADDR
AbstractionLayer.BT_PROPERTY_CLASS_OF_DEVICE
AbstractionLayer.BT_PROPERTY_UUIDS
AbstractionLayer.BT_PROPERTY_TYPE_OF_DEVICE
AbstractionLayer.BT_PROPERTY_REMOTE_RSSI:
调用的位置JniCallbacks.java
2、继续往JNI层找可以看到devicePropertyChangedCallback 对应的jmethodID为method_devicePropertyChangedCallback
3、继续找method_devicePropertyChangedCallback,用到的函数是remote_device_properties_callback
4、继续找remote_device_properties_callback。找到2个位置
一个是:
很明显这是搜索设备时的callback。
另一个是:
应该是这里
5、那么如果其他函数要用remote_device_properties_callback,肯定是调用sBluetoothCallbacks的remote_device_properties_cb
6、找remote_device_properties_cb
7、找btif_remote_properties_evt,找到btif_storage_load_bonded_devices,可以看到描述这就是用来上传配对记录的
8、继续找BTIF_STORAGE_GET_REMOTE_PROP
9、找btif_storage_get_remote_device_property
10、找cfg2prop
11、找btif_config_get_str
12、config里面的数据是怎么来的?看btif_config.cc中的init函数
可以看到从CONFIG_FILE_PATH里面读到的。即/data/misc/bluedroid/bt_config.conf
这是在我系统上看到的:
二、如何上传本地信息
也是在btif_storage_load_bonded_devices里面
这个函数是这样的:
1、获取本地信息:
这里面有一个需要注意:
这里面把所有已配对设备的地址上传上去了
最后调用btif_adapter_properties_evt把信息上传上去:
2、btif_adapter_properties_evt里面调用adapter_properties_cb
3、adapter_properties_cb就是adapter_properties_callback
4、adapter_properties_callback里面用到jmethodID为method_adapterPropertyChangedCallback,对应的就是adapterPropertyChangedCallback(JniCallbacks.java)
5、继续找到AdapterProperties.java里面的adapterPropertyChangedCallback
6、这里面就把本地信息和已配对的设备的地址进行处理
7、这里面把已配对设备的地址处理如下:
8、然后再回到btif_storage_load_bonded_devices继续看,下面可以看到开始整理配对记录的信息
9、然后通过btif_remote_properties_evt传上去
三、扒掉Bluetooth.apk如何对接
我们的sdk是上传本地信息和配对记录是分开的。
1、当收到本地信息时,可以使用AdapterProperties.java的adapterPropertyChangedCallback。只处理本地设备名、本地设备地址、本地设备cod和本地设备UUID。
2、当收到配对记录时
(1)可以先使用AdapterProperties.java的adapterPropertyChangedCallback,可以这样定义
int[] types = new int[1];
byte[][] val = new byte[1][];
types[0] = AbstractionLayer.BT_PROPERTY_ADAPTER_BONDED_DEVICES;
val[0] = Utils.getBytesFromAddress(paired_device.getRemote_Device_Address());
然后使用adapterPropertyChangedCallback(types, val);把一个配对记录的地址进行处理。
(2)再用RemoteDevices.java的devicePropertyChangedCallback把这个配对记录的其他信息进行处理。
(3)然后再处理下一个设备。
四、关于原生蓝牙本地信息的获取分析:
1、btif_storage_load_bonded_devices中获取本地信息用的是BTIF_STORAGE_GET_ADAPTER_PROP:
2、找BTIF_STORAGE_GET_ADAPTER_PROP
3、找btif_storage_get_adapter_property
4、地址使用controller.cc里面的get_address
get_address
地址是初始化的时候获取的(应该是HCI)
5、配对设备数量,用到btif_in_fetch_bonded_devices
最终其实还是到/data/misc/bluedroid/bt_config.conf
6、UUID(每个协议初始化的时候会设置上)
7、name、scan mode、discovery timeout在btif_dm_get_adapter_property里面获取
(1)name
btif_get_default_local_name
可以看到PROPERTY_PRODUCT_MODEL
所以这个其实是从prop里面获取。
可以直接使用
getprop ro.product.model
(2)scan mode(因为是初始化的时候上报本地信息和配对记录,所以是0)
(3)discovery timeout默认是120