本文主要是翻译了 Google 的官方 文档 。
Android 提供默认的蓝牙协议栈是 BlueDroid ,分为两层:蓝牙嵌入式系统(BTE)和蓝牙应用层(BTA), BTE 层主要实现蓝牙的核心功能, BTA 层则主要负责和 Anroid 框架通信。
Android 4.2 之前,Google 一直应用的是 Linux 官方蓝牙协议栈,即知名老牌开源
项目 BlueZ 。BlueZ 实际上是由高通公司在 2001 年 5 月基于 GPL 协议 release 的一个开源项目,该项目仅 release 一个月后就被 Linux 之父 Linux Torvalds 纳入了 Linux 内核,并做为 Linux 2.4.6 内核的官方蓝牙协议栈。随着 Android 设备的流行,BlueZ 也得到了极大的完善和扩展。例如 Android 4.1 中 BlueZ 的版本升级为 4.93,它支持蓝牙核心规范4.0,并实现了绝大部分的 Profiles。但是从 Android 4.2 即 Jelly Bean 开始,Google 便在 Android 源码中推出了它和博通公司一起开发的 BlueDroid 以替代 BlueZ。虽然因为时间及成熟度的原因,大部分手机厂商在 Android 4.2 中仍继续应用 BlueZ。但是 BlueZ 的创始者,高通公司也将在基于其芯片的 Android 参考设计中去除 BlueZ,并仅支持 BlueDroid。BlueZ 的未来如何笔者姑且不论。不过,能让高通改弦易辙,BlueDroid 自有其合理之处。相比 BlueZ,BlueDroid 最值得称道的地方就是其框架结构变得更为简洁和清晰。另外,借助 HAL(Hardware Abstraction Layer,硬件抽象层),BlueDroid 终于不再和 dbus 有任何瓜葛。( 引用 )
蓝牙系统服务通过 JNI
来与蓝牙协议栈交互,通过 Binder IPC
来与应用层交互。系统服务给开发者提供各种蓝牙Profile的访问。Android 中的蓝牙总体架构如下图所示:
andorid.bluetooth
相关的 API 来和蓝牙硬件交互。其内部的实现,是通过 Binder IPC
机制来调用 Bluetooth
进程的; packages/apps/Bluetooth
,被作为一个 Android 的系统 App。它在 Android 框架层实现了蓝牙的 Service 和 Profile ,并通过 JNI 调用到 HAL 层。编译的到系统中就是 /system/app/Bluetooth.apk
; andorid.bluetooth
对应的 JNI 代码位于 packages/apps/Bluetooth/jni
, JNI 层代码调用到 HAL 层,并当发生某些蓝牙动作(例如发现了设备)的时候,接受来自 HAL 层的回调。 andorid.bluetooth
API 和蓝牙进程需要用到的标准接口,你必须实现这些接口来确保你的蓝牙硬件正常工作。蓝牙 HAL 相关的头文件位于 hardware/libhardware/include/hardware/bluetooth.h
和 hardware/libhardware/include/hardware/bt_*.h
; external/bluetooth/bluedroid
。这个协议栈实现了通用的蓝牙 HAL 接口,并且可以通过扩展(Extentions)和配置(Configuration)来自定义。编译到系统中就是 /system/lib/hw/bluetooth.default.so
; libbt-vendor
并指定这些模块,来添加自己定义扩展和 HCI 层跟踪。 各层之间的交互实例可以参考 这篇 转载文章,很抱歉原文链接也没有找到。
蓝牙的 HAL 相关文件在 hardware/libhardware/include/hardware/
,包括但不局限于以下的文件:
bluetooth.h
:这里包含蓝牙硬件的接口定义; bt_gatt.h
, bt_gatt_client.h
, 和 bt_gatt_server.h
:这里包含 GATT profile 相关的接口定义; bt_hf.h
:HFP profile 相关接口的定义; bt_hh.h
:HID host profile 相关接口的定义; bt_hl.h
:HDP profile 相关接口的定义; bt_mce.h
:MAP profile 相关接口的定义; bt_pan.h
:PAN profile 相关接口的定义; bt_rc.h
:AVRCP profile 相关接口的定义; bt_sock.h
:RFCOMM profile 相关接口的定义; 值得注意的是,Android 中蓝牙并不局限于 HAL 中暴露的这些特性和 Profile。 BlueDroid 是是蓝牙协议栈的默认是实现,它实现了默认的 HAL 以及额外的自定义特性。BlueDroid 的代码在 external/bluetooth/bluedroid
目录。
如果使用了默认的 BlueDroid 协议栈,但是想加入一些自定义功能,可以这样做:
packages/apps/Bluetooth
),并添加 Profile 的实现到 BlueDroid 中( external/bluetooth/bluedroid
); libbt-vendor
模块来添加例如额外的 AT 命令或者设备特定的配置。可以参考 vendor/broadcom/libbt-vendor
目录的例子; libbt-hci
模块来提供你自己的 HCI 接口(主要用来做调试跟踪)。参考 external/bluetooth/hci
目录的例子。