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 文件参考。