Android Bluetooth(一) — 蓝牙模块代码整体架构

Android Bluetooth(一) — 蓝牙模块代码整体架构

  • 0. 前言
  • 1. 代码分布
  • 2. 整体结构
  • 3. 常用类和名词解释
  • 4. 以蓝牙 打开 enable 为例简单说明下蓝牙工作的整个过程:
  • 5. 后续分析

0. 前言

  我之前提过,我目前接触的最多的Android 版本是 Android kk(4.4)与Android P(9.0),因为最近在Android kk上做了一个wifi模组的移植适配工作,因此对WiFi&BT模块有了些了解,本系列主要基于Android kk进行了解分析,也许其他版本有些出入,但不影响我们理解主要流程,蓝牙工作的主干流程是没有变的,上电、加载驱动这些动作少不了的,只是这些功能的实现代码位置变了不少。希望本文可以让大家对android 4.4的蓝牙部分代码有一个初步的了解。

  入手一个新的模块或应用,当然首先要知道它都有什么了,与它相关的代码在那里,所以先一起看下蓝牙代码分布吧。

1. 代码分布

  • packages/apps/settings/
    settings下面有BluetoothUI部分代码。主要负责蓝牙的开/关和蓝牙设备查找等。
  • packages/apps/Bluetooth/
    看这路径肯定是蓝牙应用方面的代码了,主要是关于蓝牙应用协议的表现代码,包括opp、hfp、hdp、a2dp、pan等等,这些名词后面再解释
    编译出来便是蓝牙的Bluetooth.apk文件,提供上层服务和底层交互。这个目录里的代码更像一个桥梁承上启下的作用,承上:通过Binder和framework/base/core/java/android/bluetooth蓝牙服务通信。启下:通过 JNI和external/bluetooth/blueroid蓝牙协议通信。
  • frameworks/base/core/java/android/server/
    4.2以后这个目录虽然还有了,但里面代码已经转移到应用层了,就是前面那个目录,所以4.2.2上的蓝牙这里可以忽略。
  • framework/base/core/java/android/bluetooth
    这个目录里面有供java层使用一些类,也有对应的aidl文件联系C、C++部分的代码,还是挺重要的。
  • kernel\drivers\bluetooth Bluetooth
    具体协议实现。包括hci,hid,rfcomm,sco,SDP等协议
  • kernel\net\bluetooth Linux kernel
    对各种接口的Bluetoothdevice的驱动。例如:USB接口,串口等,上面kernel这两个目录有可能看不到的,但一定会有的。
  • external\bluetooth\bluedroid 官方蓝牙协议栈。相当于蓝牙HAL操作。供所有蓝牙的实际操作,开关蓝牙,HCI,ACL,SCO,L2CAP,RFComm,蓝牙的所有Profile等。
  • system\bluetoothBluetooth 适配层代码,和framework那个作用类似,是串联framework与blueZ的工具。

  大致代码分布就是这些,协议栈的代码也可包含在模组商提供的蓝牙驱动代码里,这些代码可能因为项目的原因放置在不同路径里,但是应该都存在,不会缺少,初步查看后让我们再来看下蓝牙的整体结构。

2. 整体结构

Android Bluetooth(一) — 蓝牙模块代码整体架构_第1张图片

  1. Applications是蓝牙相关的上层应用UI部分,这里我们主要分析 Settings APP下面有关蓝牙的部分。

  2. Java Framework主要是蓝牙服务的API 接口,提供给Settings APP下蓝牙设置调用。

  3. Bluetooth APP是 packages/apps/Bluetooth/ 下面的代码,提供蓝牙的核心服务,主要是通过JNI 调用 Bluedroid 蓝牙协议栈。

  4. Bluedroid 蓝牙协议栈,是external\bluetooth\bluedroid下面的代码,实现了具体蓝牙打开,关闭,查找等功能。

3. 常用类和名词解释

  1. \packages\apps\Settings\src\com\android\settings\bluetooth

    • BluetoothEnabler.java 界面上蓝牙开启、关闭的开关就是它了,
    • BluetoothSettings.java 主界面,用于管理配对和连接设备
    • LocalBluetoothManager.java 提供了蓝牙API上的简单调用接口,这里只是开始。
    • CachedBluetoothDevice.java 描述蓝牙设备的类,对BluetoothDevice的再封装
    • BluetoothPairingDialog.java 那个配对提示的对话框
  2. /packages/apps/Phone/src/com/android/phone/

    • BluetoothPhoneService.java 在phone的目录肯定和电话相关了,蓝牙接听挂断电话会用到这个
  3. /packages/apps/Bluetooth/src/com/android/bluetooth/btservice/

    • AdapterService.java 4.2后才有的代码,蓝牙打开、关闭、扫描、配对都会走到这里,其实更准确的说它替代了4.1之前的BluetoothService.java,原来的工作就由这个类来完成了。说到这里不能不说4.2蓝牙的目录变了,在4.1及以前的代码中packages层的代码只有opp协议相关应用的代码,也就是文件传输那部分,而4.2的代码应用层的代码则丰富了许多,按具体的蓝牙应用协议来区别,分为以下文件夹(这里一并对蓝牙一些名词作个简单解释):

      • a2dp 蓝牙立体声,和蓝牙耳机听歌有关那些,另还有个avrcp–音频/视频远程控制配置文件,是用来听歌时暂停,上下歌曲选择的。
      • btservice 这个前面AdapterService.java的描述大家应该能猜到一些,关于蓝牙基本操作的目录,一切由此开始。
      • hdp 蓝牙关于医疗方面的应用 Bluetooth Health Device Profile
      • hfp 和电话相关,蓝牙接听、挂断电话 Hands-free Profile
      • hid 人机交互接口,蓝牙鼠标键盘什么的就是这个了
      • opp 不多解释,以前就有。
      • pan 描述了两个或更多个 Bluetooth 设备如何构成一个即时网络,和网络有关的还有串行端口功能(SPP),拨号网络功能(DUN)
      • pbap 电话号码簿访问协议(Phonebook Access Profile)

  android 4.4的蓝牙应用层部分代码更丰富了,虽然有些目录还没具体代码,不过说不准哪个版本更新就有了,就像4.0添加了hdp医疗那部分一样。

  另外原本在framework的JNI代码也被移到packages/apps/bluetooth当中。

  1. /frameworks/base/core/java/android/bluetooth/

    • BluetoothA2dp.java A2DP的功能实现
    • BluetoothAdapter.java 蓝牙action的定义,虚拟设备属性以及操作方法
    • BluetoothAudioGateway.java 蓝牙语音网关
    • BluetoothClass.java 蓝牙设备类型的定义
    • BluetoothDevice.java 蓝牙设备属性
    • BluetoothDevicePicker.java 定义远程蓝牙设备的特性,比如需要认证,设备类型
    • BluetoothHeadset.java 定义蓝牙headset功能的属性以及接口
    • BluetoothInputStream.java 蓝牙流接口的实现(输入流)
    • BluetoothOutputStream.java 蓝牙流接口的实现(输出流)
    • BluetoothServerSocket.java 蓝牙socket服务端具备的方法
    • BluetoothSocket.java 蓝牙socket的封装
    • BluetoothUuid.java 蓝牙uuid的定义以及uuid的解析

  以上java文件在使用具体功能会用到,现在只是简单描述下,至于具体使用在后续文章用到时再给出。同时代码说明部分也就写这些了

  对于C、C++部分的代码一方面没看那么多,另一方面根据android JNI的命名习惯,大家找起来也很容易。

4. 以蓝牙 打开 enable 为例简单说明下蓝牙工作的整个过程:

Settings UI enable() ----->> Framwork BluetoothManagerService enable()------>>> Bluetooth APP AdapterService enable()------>>>Bluedroid enableNative().

5. 后续分析

  前面从整体上描述蓝牙的基本知识,落实在具体的代码分析上,我们按几个主线功能来走,蓝牙的开关、搜索配对、蓝牙耳机与电话和文件传输

  这几个也算是蓝牙的常用必备功能了,所以在后续文章中将按着这个顺序来跟一下它们代码调用流程。希望可以让你快速的了解蓝牙,当然如果有失误写错的地方,欢迎反馈,谢谢。

你可能感兴趣的:(#,Android,wifi&bt,Android,Android源码,Bluetooth,Android,4.4,jni)