蓝牙如今许多人生活中不可或缺的一项技术,耳机、音箱、遥控器、手表、手环、电灯泡、手机、电脑、电视机,而Android也很常见,小到三岁孩童,老至八十老人都可能使用着它, 本系列文章将从源码角度详细剖析Android蓝牙框架,从现象看本质,看看点击一下蓝牙开关、点击一下连接就可以听到音乐背后的神秘面纱,看看app开发时调用enable
、connect
都是如何实现的。
本系列文章主要以Android14的源码为蓝本,Android13及以上版本将蓝牙相关的内容集中到packages/modules/Bluetooth目录下,而Android12及以下版本分散在各个目录,但总体的框架没有太大差异,代码获取方式:git clone https://android.googlesource.com/platform/packages/modules/Bluetooth -b android14-s2-release
,也可以从国内的一些源获取。整体框架如下图:
整体分三层,分别是apps、framework、native,向下还有bt driver等不再本系列问题讨论范围内,这里就不具体展示出来了,除了这三层还有一些中间件,如JNI、Binder。
android.bluetooth
, 在framework/java/android/bluetooth路径下)实际上是运行在apps层的,app和蓝牙服务是跨进程的,不能直接使用协议栈的能力,因此通过binder机制实现apps和蓝牙服务跨进程通信,通信的接口采用AIDL(Android Interface Definition Language)描述,api在framework/java/android/bluetooth路径下实现,binder的接口定义在system/binder/android/bluetooth路径下。下图是以打开蓝牙和连接蓝牙两个动作为例,展示了各层以及各个模块间的调用流程。这里简单预览一下其调用流程,在后续的文章中将详细的讲述,可以看到打开蓝牙和连接设备最大的区别是打开蓝牙会先通过BluetoothManagerService
再到AdapterService
,而连接蓝牙直接调用ProfileService
的提供的能力;