
Android 提供默认蓝牙堆栈,该堆栈同时支持经典蓝牙和蓝牙低功耗。借助蓝牙,Android 设备可以创建个人局域网,以便与附近的蓝牙设备发送和接收数据。
在 Android 4.3 及更高版本中,Android 蓝牙堆栈能够实现蓝牙低功耗 (BLE)。要充分利用 BLE API,请遵循 Android 蓝牙 HCI 要求。装有合格芯片组的 Android 设备可以实现经典蓝牙或同时实现经典蓝牙和 BLE。BLE 与旧版蓝牙芯片组不向后兼容。
在 Android 8.0 中,原生蓝牙堆栈完全符合蓝牙 5 的标准。要使用可用的蓝牙 5 功能,设备需要配备符合蓝牙 5 标准的芯片组。
Android 架构
蓝牙应用通过 Binder 与蓝牙进程通信。蓝牙进程使用 JNI 与蓝牙堆栈通信,并为开发者提供对各种蓝牙配置文件的访问权限。下图展示了蓝牙堆栈的总体结构

- 应用框架
- 在应用框架层级是应用代码,该代码使用 android.bluetooth API 与蓝牙硬件互动。在内部,此代码通过 Binder IPC 机制调用蓝牙进程。
- 蓝牙应用
- 蓝牙应用位于
packages/modules/Bluetooth/android/app
中,打包为 Android 应用,并在 Android 框架层级实现蓝牙配置文件。此应用通过 JNI 调用原生蓝牙堆栈。 - JNI
- 与 android.bluetooth 关联的 JNI 代码位于
packages/modules/Bluetooth/android/app/jni
中。当发生特定蓝牙操作(例如发现设备时),JNI 代码会调用蓝牙堆栈。 - 蓝牙堆栈
- 默认蓝牙堆栈在 AOSP 中提供,位于
packages/modules/Bluetooth/system
中。该堆栈实现通用蓝牙 HAL,并通过扩展程序和配置更改对其进行自定义。 - 供应商实现
- 供应商设备使用硬件接口设计语言 (HIDL) 与蓝牙堆栈互动。
HIDL
HIDL 定义了蓝牙堆栈与供应商实现之间的接口。要生成蓝牙 HIDL 文件,请将蓝牙接口文件传递到 HIDL 生成工具中。接口文件位于 hardware/interfaces/bluetooth
中。
蓝牙堆栈开发
Android 蓝牙堆栈是完全合格的蓝牙堆栈。资格认证列表位于蓝牙 SIG 网站上的 QDID 169365 下。
核心蓝牙堆栈位于 packages/modules/Bluetooth
中。开发在 AOSP 中进行,欢迎大家贡献代码。
Android 7.x 及更低版本架构
蓝牙系统服务通过 JNI 与蓝牙堆栈通信,并通过 Binder IPC 与应用通信。系统服务为开发者提供对各种蓝牙配置文件的访问权限。下图展示了蓝牙堆栈的总体结构

- 应用框架
- 在应用框架层级是应用代码,该代码使用
android.bluetooth
API 与蓝牙硬件互动。在内部,此代码通过 Binder IPC 机制调用蓝牙进程。 - 蓝牙系统服务
- 蓝牙系统服务位于
packages/apps/Bluetooth
中,打包为 Android 应用,并在 Android 框架层级实现蓝牙服务和配置文件。此应用通过 JNI 调用 HAL 层。 - JNI
- 与 android.bluetooth 关联的 JNI 代码位于
packages/apps/Bluetooth/jni
中。当发生特定蓝牙操作(例如发现设备时),JNI 代码会调用 HAL 层并接收来自 HAL 的回调。 - HAL
- 硬件抽象层定义了 android.bluetooth API 和蓝牙进程调用并需要您实现的标准接口,以确保蓝牙硬件正常运行。蓝牙 HAL 的头文件为
hardware/libhardware/include/hardware/bluetooth.h
。此外,请查看所有hardware/libhardware/include/hardware/bt_*.h
文件。 - 蓝牙堆栈
- 默认的蓝牙堆栈已为您提供,位于
system/bt
中。该堆栈实现了通用的蓝牙 HAL,并使用扩展程序和配置更改对其进行了自定义。 - 供应商扩展程序
- 要添加自定义扩展程序和用于跟踪的 HCI 层,您可以创建一个 libbt-vendor 模块并指定这些组件。
实现 HAL
蓝牙 HAL 位于 /hardware/libhardware/include/hardware/bluetooth.h
中。bluetooth.h
文件包含蓝牙堆栈的基本接口,您必须实现其功能。
特定于配置文件的文件位于同一目录中。有关详情,请参阅 HAL 文件参考。