Android 13在蓝牙模块中进行了多项改进和优化。本文将详细分析其核心组件及其工作原理,包括BluetoothManagerService
、AdapterService
、AdapterProperties
、蓝牙连接管理和JNI接口。
1. BluetoothManagerService
BluetoothManagerService
是蓝牙管理的核心类,负责启动和停止蓝牙、管理蓝牙状态、处理蓝牙事件等。其主要职责如下:
- 启动流程:
- 系统启动后,通过
registerActivityLifecycleCallbacks
和registerFragmentLifecycleCallbacks
初始化并绑定AdapterService
。 - 如果系统关机前蓝牙是开启状态,恢复蓝牙状态并启动适配器服务。
- 系统启动后,通过
- 状态管理:
- 通过
getNameAndAddress
方法获取蓝牙名称和地址,并存储到数据库中。 - 根据系统配置和用户设置,决定蓝牙的初始状态(开/关)。
- 通过
- 事件处理:
- 处理蓝牙状态变化、设备连接/断开、数据传输等事件。
- 利用
Handler
机制处理异步消息,例如MESSAGE_GET_NAME_AND_ADDRESS
。
public class BluetoothManagerService extends IBluetoothManager.Stub {
// 初始化BluetoothAdapter
private BluetoothAdapter mAdapter;
// 处理系统启动后的蓝牙初始化
private void handleOnBootPhase() {
if (isBluetoothPersistedStateOnBluetooth() || isBluetoothPersistedStateOnAirplane()) {
mAdapter.enable();
} else {
// 获取蓝牙名称和地址
getNameAndAddress();
}
}
// 获取蓝牙名称和地址
private void getNameAndAddress() {
Message msg = mHandler.obtainMessage(MESSAGE_GET_NAME_AND_ADDRESS);
mHandler.sendMessage(msg);
}
}
2. AdapterService
AdapterService
是蓝牙适配器的服务类,负责蓝牙适配器的初始化、配置和操作。其主要功能包括:
- 适配器初始化:
- 在服务创建时,通过
onCreate
方法加载适配器属性,包括设备名称、地址、支持的协议等。 - 使用
getAdapterPropertyNative
方法从底层协议栈获取适配器属性。
- 在服务创建时,通过
- 属性获取:
- 通过JNI接口与底层蓝牙协议栈通信,获取适配器的属性,如名称、地址、设备类型等。
- 使用
AdapterProperties
类存储和管理这些属性。
- 事件回调:
- 处理底层协议栈的回调事件,如
adapterPropertyChangedCallback
,并将结果传递给上层。
- 处理底层协议栈的回调事件,如
3. AdapterProperties
AdapterProperties
用于存储和管理蓝牙适配器的属性,包括设备名称、地址、配对设备列表等。其关键点包括:
- 属性存储:
- 存储适配器的名称、地址、配对设备列表等属性。
- 通过
getName
和getAddress
方法获取属性值。
- 回调处理:
- 接收底层协议栈的属性更新回调,如
adapterPropertyChangedCallback
。 - 更新内部存储的属性值,并通知
AdapterService
进行相应处理。
- 接收底层协议栈的属性更新回调,如
public class AdapterService extends Service {
// 获取适配器名称
public String getName() {
return mAdapterProperties.getName();
}
// 在服务创建时加载适配器属性
@Override
public void onCreate() {
// 加载名称和地址
getAdapterPropertyNative(AbstractionLayer.BT_PROPERTY_BDADDR);
getAdapterPropertyNative(AbstractionLayer.BT_PROPERTY_BDNAME);
}
}
4. 蓝牙连接管理
蓝牙连接管理涉及设备扫描、配对、连接建立等过程。其主要流程如下:
- 扫描和配对:
BluetoothScanner
类负责设备扫描,BluetoothBondStateMachine
类管理设备配对状态。- 通过
startScan
和createBond
方法实现设备扫描和配对。
- 连接建立:
- 在成功配对后,
BluetoothGatt
类负责建立连接,并管理连接状态。 - 使用
connect
和disconnect
方法管理连接的建立和断开。
- 在成功配对后,
- 数据传输:
- 通过GATT协议进行数据传输,
BluetoothGattService
和BluetoothGattCharacteristic
定义了传输的数据结构。 - 使用
readCharacteristic
和writeCharacteristic
方法进行数据读写。
- 通过GATT协议进行数据传输,
public class BluetoothGatt {
// 建立连接
public boolean connect() {
return connectNative();
}
// 断开连接
public void disconnect() {
disconnectNative();
}
}
5. JNI接口
JNI 接口是 Java 层与底层蓝牙协议栈通信的桥梁。
关键点:
-
方法调用:通过 JNI 方法调用底层蓝牙协议栈的函数,获取或设置蓝牙属性。
JNIEXPORT jstring JNICALL Java_com_android_bluetooth_btservice_AdapterService_getNameNative(JNIEnv* env, jobject obj) { // 调用底层函数获取适配器名称 return env->NewStringUTF(btif_get_adapter_name()); }
-
回调处理:底层协议栈通过回调机制,将结果返回给 Java 层。
static void adapter_properties_callback(bt_status_t status, int num_properties, bt_property_t* properties) { // 将属性变化通知 Java 层 JNIEnv* env = getJNIEnv(); env->CallVoidMethod(mCallbacksObj, method_onAdapterPropertyChanged, num_properties, properties); }
通过详细分析 Android 13 的蓝牙源码,我们可以看到其在蓝牙管理、适配器服务、属性管理、连接管理和 JNI 接口等方面的设计和实现。理解这些关键模块和流程,有助于我们更好地开发和调试蓝牙相关应用。