Android完整BLE协议栈源码位置查询及全层级实现追踪需求
Android BLE 各层级实现与源码位置追踪
1. Framework 层(Java 上层)
你已找到的上层Java源码集中在以下路径:
- 核心API类:
frameworks/base/core/java/android/bluetooth/,包含BluetoothGatt、BluetoothGattCharacteristic、BluetoothDevice等关键类 - 系统服务实现:
frameworks/base/services/core/java/com/android/server/bluetooth/,比如BluetoothManagerService负责管理蓝牙服务的生命周期和跨进程调用
2. Native 层(JNI 与核心逻辑桥接)
这一层是Java层到底层协议栈的过渡:
- JNI绑定代码:
frameworks/base/core/jni/,比如android_bluetooth_gatt.cpp实现了BluetoothGatt的native方法映射 - Android蓝牙模块核心:
packages/modules/Bluetooth/,其中stack/gatt/子目录是GATT协议的核心实现,包含gatt_client.c(处理客户端侧的读、写、连接)、gatt_server.c(服务端逻辑)等文件
3. 蓝牙协议栈层
Android的蓝牙协议栈分两种情况:
- 开源BlueZ栈:早期版本使用,源码在
external/bluetooth/bluez/,src/目录下的gatt-client.c、gatt-server.c处理GATT协议的具体交互 - 厂商自研栈:多数现代设备使用厂商定制栈(如高通QCA、联发科MTK栈),源码通常在
vendor/<厂商品牌>/bluetooth/,比如高通的vendor/qcom/proprietary/bluetooth/
4. HAL 层(硬件抽象层)
这一层定义了上层协议栈与硬件驱动的交互接口:
- 接口定义:
hardware/interfaces/bluetooth/,比如1.0/IBluetoothGatt.aidl规范了GATT相关的HAL调用 - 厂商实现:
vendor/<厂商品牌>/hardware/bluetooth/,厂商在这里实现具体的硬件适配逻辑,将上层的HCI命令转发给驱动
5. 射频驱动层
最终与蓝牙硬件交互的驱动代码:
- 通用蓝牙驱动:
kernel/drivers/bluetooth/,比如btusb.c(USB蓝牙适配器驱动)、hci_uart.c(UART接口蓝牙驱动) - 厂商专属驱动:针对特定蓝牙芯片的驱动,比如高通的
qca_bt.c,位于kernel/drivers/bluetooth/或厂商内核目录下,负责将HCI命令转换成硬件可执行的射频指令
标准命令完整流程示例(以连接命令为例)
- Java层:调用
BluetoothDevice.connectGatt(),触发BluetoothGatt的内部状态机处理 - JNI层:通过JNI调用
android_bluetooth_gatt.cpp中的connectGatt函数,将Java层参数传递到native侧 - Native蓝牙服务:
packages/modules/Bluetooth/stack/gatt/gatt_client.c中构建GATT连接请求,转交给L2CAP层处理 - 协议栈层:将GATT请求封装为HCI命令(如
HCI_LE_Create_Connection),发送到HAL层 - HAL层:厂商实现将HCI命令转发给驱动
- 驱动层:驱动将HCI命令转换为硬件指令,通过射频发送给目标BLE设备;设备响应后,结果按反向路径逐层返回至Java层
读、写命令的流程逻辑类似,只是在协议栈层会生成对应的HCI_LE_Read_Characteristic或HCI_LE_Write_Characteristic命令,最终通过射频完成数据交互。
内容的提问来源于stack exchange,提问作者user2625768
相关产品推荐
相关产品推荐

