本文授权微信公众号fanfan程序媛独家发布
转载请注明出处,本文出自fanfan的带你解锁蓝牙skill系列
蓝牙这块儿算是系统中的一个大块儿,刚开始分析确实很容易没有头绪,所以在进入庞大的源码之前先确定一个分析顺序,也好避免越学越乱。
对于源码的分析不外乎whw(what—how—why)
对于蓝牙各协议的功能以及如何演示都已经分析完了,具体可以参考
带你解锁蓝牙skill(一)以及带你解锁蓝牙skill(二)。转载请注明出处,本文出自fanfan。
本文以Android7.0为例进行源码分析。开始分析源码之前,先来看看蓝牙相关的都有什么东西
4,如何开始
在对一个新事物进行研究之前,我们已经了解了他是什么,那么接下来就是庖丁解牛了。但是目前还做不到目无全牛哈哈。 蓝牙代码实现不外乎包括以下三个方面- 界面UI
- 设置应用中蓝牙的ui
- 蓝牙本身这个系统应用中的ui
- 蓝牙开关默认值
- 协议配置开关:手机是否要支持各种协议
- 对于系统开发工作者
- 掌握基础界面修改及相关逻辑
- 掌握手机蓝牙开关的系统默认值
- 掌握蓝牙各协议开关(即禁用/启用蓝牙协议)
- 掌握如何新增蓝牙协议(更高要求)
- 掌握蓝牙的基本用法:包括开关,扫描,配对,连接等等(毕竟系统应用你并不能决定,你只能是调用各接口)
- 掌握各蓝牙协议的基本用法(比如实现一个读取联系人的操作)
5,蓝牙源码研究
按照第四部分确定的大致方向来进行接下来的研究。不论是蓝牙开关默认值还是协议的开关的值,对这些值还好说,三下五除二就分析好了,但是蓝牙界面仍旧有一个大工程在。从驱动往应用层方向,蓝牙相关的代码位置如下- 第一部分,系统应用设置Settings中的蓝牙相关,显示从设置进入蓝牙的一些界面,代码位置为:packages/apps/Settings/src/com/android/settings/bluetooth/目录结构如下:包括蓝牙开关,蓝牙扫描,蓝牙配对框,蓝牙重命名框,蓝牙选择框等等
- 第二部分,系统中有个蓝牙应用Bluetooth,显示界面诸如蓝牙文件传入传出历史记录,蓝牙配对框,蓝牙文件传输框等等,代码位置为:/packages/apps/Bluetooth,Java代码目录结构如下:
可以看出Bluetooth应用中的代码是按照各协议模块进行区分目录的,但是在各协议模块中并不包含对profile的具体定义,以A2DP为例
在packages/apps/Bluetooth/src/com/anddroid/bluetooth/a2dp文件夹中只有两个文件A2dpService和A2dpStateMachine,至于这两个文件是干什么,后续会介绍,暂时先了解一个大致的目录结构
- 第三部分,就是蓝牙协议的具体实现,代码所在路径:/frameworks/base/packages/SettingsLib/src/com/android/settingslib/bluetooth/
在该目录下就是一些蓝牙profile的相关的配置了。
- 第四部分,集成的一些蓝牙接口:frameworks/base/core/java/android/bluetooth/,目录结构如下:
- 第五部分,手机开机后启动的蓝牙服务是BluetoothManagerService,代码目录结构为:/frameworks/base/services/core/java/com/android/server/
可以看到很多在开发过程中常见的类:BluetoothAdapter,BluetoothDevice,BluetoothSocket等等,蓝牙的核心代码和接口的具体实现都在这里!!!
对蓝牙的应用层的代码接口有了一个大致了解之后,我们开始进行分析
1>,蓝牙界面相关
估计有着急的人会说,看什么界面啊,我就想知道功能是怎么实现的
但我想说,如果没有界面,你如何知道他到底实现了什么功能??
如果没有界面,你该如何下手??
界面大致包括两部分,设置中的蓝牙界面和蓝牙应用中的蓝牙界面
-
设置中蓝牙相关的界面
蓝牙界面相关的分析在去年做过,虽然是4.4.2但是原理还是一样的,也没必要再做那么多无用功,贴上博客链接
蓝牙界面实现分析(一) 蓝牙界面实现分析(二) 蓝牙界面实现分析(三)有需要的可以看一下
在这里需要说明一下:关于已配对设备的各种配置协议显示界面
蓝牙设备间的连接其实就是各协议之间的连接,蓝牙设备间有可能有多个协议连接,但每个协议仅支持一个连接在设备进行配对时,发送设备配对状态发生改变的广播,在监听到广播后设备会去获取到remote设备所支持的协议,并尝试进行连接,比如如果remote设备支持手机音频或者媒体音频,那么本机设备就会尝试该协议的连接。但如果本机设备已经与另一台B远程设备进行了手机音频的连接,那么本机设备会先断开与B设备的连接,去尝试和remote设备进行手机音频的连接。
也就是说某一个时刻设备某个协议连接只能支持一个远程设备,但是可以支持多个远程设备进行多个协议连接。 设备A在某时刻可以和远程设备B进行媒体音频连接同时保持和远程设备C之间的手机音频连接,如果设备A需要播放媒体音频(比如音乐,视频等)音频会在设备B中进行播放,如果设备A需要进行播放手机音频(即手机通话)会在设备C中进行播放。 蓝牙应用相关界面
蓝牙应用是为了配合各蓝牙协议而存在的,所以,针对蓝牙应用相关界面会穿插在蓝牙协议的分析中
蓝牙配对弹出框过程分析讲述了蓝牙配对弹出框的原理。蓝牙协议开关
蓝牙协议开关这篇文章中讲述了作为系统开发人员如何禁止掉蓝牙某个协议(包括上层和底层)
2>,蓝牙协议实现
对于蓝牙协议我只能是分析常见且我的测试机可以实现的,计划要分析的协议如下
- opp文件传输协议
- 互联网协议
- Hsp手机音频协议
- A2dp媒体音频协议
也许后续计划会有所改变,先暂时确定这样。
i>,opp协议
以蓝牙传输图片为例,opp文件传输包括文件的传入和传出两方面,分别来考虑
传出文件
传入文件
传出文件
在分享蓝牙图片时,选择蓝牙分享——接下一篇
转载请注明出处,本文出自fanfan的带你解锁蓝牙skill系列
如有疑问可扫描右下方二维码关注微信公众号:fanfan程序媛