当前位置:首页>安卓APP>蓝牙那些事,安卓profile实现代码解析 中篇

蓝牙那些事,安卓profile实现代码解析 中篇

  • 2026-11-11 14:08:36
蓝牙那些事,安卓profile实现代码解析 中篇

2026.2

蓝牙那些事,安卓蓝牙框架详解 开篇续接安卓平台蓝牙实现,从上到下层次结构清晰,对于初识安卓也可以将蓝牙架构作为示例研究。

《开篇》已经展示完整的蓝牙框架,从设置Settings UI,和SystemServer入手,展示蓝牙用户交互设计,后台服务,profiles的配置文件实现,以及profile状态机调度。

android的图形界面,设置的蓝牙用户交互尽可能的简单化,依次蓝牙开关,蓝牙名称,已配对设备,搜索列表等。

Android官方提供的框架图,设置->蓝牙界面对应下图的Apps用来管理蓝牙的UI操作:
  • Application Framework应用框架层,包含settings设置应用,android.bluetooth接口层,对外提供访问入口;通过Binder机制和蓝牙堆栈实现层对接;
  • Bluetooth Stack Process蓝牙堆栈程序,包含蓝牙守护进程AdapterService,各个profile的服务进程,bond绑定服务,各个profile的的状态机;
  • JNI层是java本地接口层,按照蓝牙app中的框架,一对一的实现接口的下层封装,对接蓝牙protocol协议栈实现;同时,也跳转到C/C++代码;
  • Bluetooth Native Stack蓝牙本地堆栈,实现蓝牙HCI之上的protocol层,直接对接JNI层;
  • HIDL接口是android后来版本引入的,对接vendor供应商的蓝牙芯片层,如《开篇》中提到的libbt-vendor.so;旨在归一化用HIDL和AIDL层固化android核心部分代码,加强管控方便统一升级。
  • 另外,蓝牙音频部分涉及到bluetooth Audio的框架层,一般是由AudioRoute控制音频路由,由AudioFlinger负责音频,然后通过socket将音频数据包发送给蓝牙Native stack本地协议栈;
而在框架图之外,还有很多类的实现,如下图BluetoothDevice设备类型对应的UI实现。为每个蓝牙设备注册名称,类型CoD,支持的profiles,自动连接,以及音量,铃声电话簿等

接下来认识一下主要的蓝牙Class类,对应application Framework层的接口方法列表:

包/类路径
说明
com.android.server.BluetoothManagerService
由SystemServer管理,蓝牙的守护进程,AIDL接口实现:IBluetoothManager。负责开关蓝牙;管理蓝牙App的 IBluetooth和 IBluetoothGatt服务。
android.bluetooth.IBluetoothManager暴露给客户端的AIDL接口。BluetoothAdapter 通过getBluetoothManagerApp获取此代理,管理蓝牙。
android.bluetooth.IBluetooth
蓝牙操作(如扫描、连接、服务搜索等)都通过它完成。
BluetoothAdapter的很多方法调用到此接口。
android.bluetooth.IBluetoothGatt
管理所有BLE相关服务,如connectGatt连接函数;

蓝牙服务service实现

包/类路径
说明
.bluetooth.btservice.AdapterService蓝牙APP的核心服务,在蓝牙打开后启动。上层服务可以通过binder绑定调用到此服务,从而管理整个适配器。
.bluetooth.btservice.RemoteDevices
用于缓存和管理所有已知(已配对和已发现)的蓝牙设备信息。配合bluetoothdevice和cachebluetoothdevice管理设备;
.bluetooth.pan.PanService
PAN个人区域网配置文件,可网络共享,以l2cap层为基础创建蓝牙网卡对接网络协议栈。
.bluetooth.map.BluetoothMapService
MAP消息访问配置文件,用于在设备间同步短信/邮件,主要用于车机场景,目前用的比较少。
.bluetooth.pbap.BluetoothPbapService
PBAP电话簿访问配置文件,同步联系人,用于车机场景,用的比较少。
.bluetooth.hfp.HeadsetService
HFP免提配置文件,蓝牙通话场景,对应上图中的“通话音频”。
.bluetooth.a2dp.A2dpService
A2DP高级音频分发配置文件,对应上图的“媒体音频”,播放音乐场景。
.bluetooth.hid.HidHostService
HID人机交互设备配置文件,连接蓝牙鼠标、键盘等场景。
.bluetooth.btservice.BondStateMachine管理绑定状态机:蓝牙设备的配对操作。包含justwork,noinputoutput设备等各种IO能力的设备,以及ssp简单配对和pin码配对方式。
.bluetooth.btservice.AdapterState
管理整个蓝牙适配器的开关状态机。处理 STATE_OFF、TURNING_ON、STATE_ON和TURNING_OFF的状态切换。

蓝牙接口层实现

包/类路径
说明
android.bluetooth.BluetoothAdapter
提供开关蓝牙、扫描、获取配对设备等基础API。
android.bluetooth.BluetoothDevice
表示发现的蓝牙蓝牙设备,保存设备信息,并且包含connect连接等接口。
android.bluetooth.BluetoothSocket
蓝牙套接字,类似网络socket。
android.bluetooth.BluetoothServerSocket
蓝牙套接字服务器端,类似网络socket。
android.bluetooth.BluetoothGatt
BLE通信类,GATT操作,如发现服务、读写特征值等。att/gatt在底层的stack协议栈有完整的实现,android方便调用或简化开发在java层复刻gatt的接口层。
android.bluetooth.BluetoothProfile
每个profile配置文件都继承此类,并扩展特定功能。
android.bluetooth.BluetoothHeadset
HFP配置文件的代理类,和Headsetservice服务通信。HSP和HFP都统一实现在这里,并没有分开;
android.bluetooth.BluetoothA2dp
A2DP配置文件的代理类,和a2dpservice通信。
android.bluetooth.BluetoothHidHost
HID配置文件的代理类,和HidHostService通信。
android.bluetooth.BluetoothMap
MAP配置文件的代理类,和BluetoothMapService通信;
android.bluetooth.BluetoothPan
PAN配置文件的代理类,和BluetoothPanService通信;

每个profile配置文件:由接口interface层,服务Serivce和stateMachine状态机组成;以A2DP为例,状态机的切换过程如下,大写的CONNECT为事件,()括号中为状态;

A2DP的connect连接函数实现

//service中连接函数,给状态机发送事件,执行连接操作;public boolean connect(BluetoothDevice device) {......    smConnect.sendMessage(A2dpStateMachine.CONNECT);//由statemachine状态机调用service服务的接口执行最终的命令操作;public boolean processMessage(Message message) {......    if (mA2dpService.okToConnect(mDevice, true)) {//收到JNI层发送过来的A2DP事件,由service交给状态机处理void messageFromNative(A2dpStackEvent stackEvent) {    sm.sendMessage(A2dpStateMachine.STACK_EVENT, stackEvent);

A2dpstatemachine的状态机代码

mDisconnected = new Disconnected();mConnecting = new Connecting();mDisconnecting = new Disconnecting();mConnected = new Connected();
A2DP对应的JNI层的接口
蓝牙的profile间相对独立,各自维护自己的状态机即可,复杂度较低;类比之下wifi的状态机就盘根错节异常复杂。
不过,AdapterState蓝牙适配器的状态机复杂度就有所提高,包含on、off、ble启动以及各种中间态;中间会考虑打开失败,或者关闭失败又重新打开等情况;
对应代码中的状态声明
addState(mOnState);addState(mBleOnState);addState(mOffState);addState(mTurningOnState);addState(mTurningOffState);addState(mTurningBleOnState);addState(mTurningBleOffState);
android实现的profile部分结构清晰,无需太熟悉蓝牙的协议实现,只需要按照api说明调用对应的接口即可。

往期文章:

蓝牙那些事,车机SAP的遗憾

蓝牙那些事,安卓蓝牙框架详解 开篇

蓝牙那些事,蓝牙三代定位技术详解

蓝牙那些事,蓝牙设备类型CoD和GATT外观,你的蓝牙长什么样

蓝牙那些事,蓝牙Host主机GAP

蓝牙那些事,BLE低功耗的秘密

蓝牙那些事,蓝牙Host主机SDP

蓝牙那些事,BLE低功耗蓝牙Host主机GATT
蓝牙那些事,蓝牙Host主机L2CAP层
蓝牙那些事,BLE低功耗蓝牙Host主机ATT
蓝牙那些事,BLE低功耗蓝牙controller
蓝牙那些事,BR/EDR经典蓝牙HCI主机控制器接口
蓝牙那些事,BR/EDR经典蓝牙controller
蓝牙那些事,前传一文讲完

参考:

https://source.android.google.cn/docs/core/connect/bluetooth?hl=zh-cn

https://developer.android.google.cn/develop/connectivity/bluetooth?hl=zh-cn

最新文章

随机文章