蓝牙

Android Bluetooth HAL icon

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 architecture
图 1. Android 蓝牙架构
应用框架
在应用框架层级是应用代码,该代码使用 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 architecture
图 2. Android 7.x 及更低版本蓝牙架构
应用框架
在应用框架层级是应用代码,该代码使用 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 文件参考