安卓系统中蓝牙服务层的初始化流程分析
蓝牙系统依赖于安卓,从上到下,层次分明。本篇文章我们就来简单分析下蓝牙服务层初始化的相关流程。
首先来了解下安卓系统中的蓝牙模块大致分为以下几部分:
对安卓系统启动时序有大概了解的小伙伴想必都知道蓝牙服务的管理对象BluetoothManagerService会在系统SystemServer启动过程中被初始化,处于系统进程中运行,然后在系统启动的不同阶段执行不同的操作。
因此蓝牙系统初始化的触发时机主要有如下两种:
- 蓝牙服务管理在PHASE_ACTIVITY_MANAGER_READY的启动阶段,根据Settings中的蓝牙关机前的状态,如果不是关闭状态,则自动打开蓝牙。
- 第三方应用通过蓝牙适配器BluetoothAdapter主动打开蓝牙。
但不管哪种触发方式,对蓝牙服务来说,执行的流程都是一致的,接下来我们主要分析下服务层的初始化流程,首先参考如下时序图:
上面的时序图中有以下几点需要重点说明:
1、黄色标注的图框表示BluetoothManagerService中bind蓝牙服务的调用,由于其绑定的是IBluetooth.class.getName(),那根据Bluetooth.apk的清单文件:packages\apps\Bluetooth\AndroidManifest.xml可以知道其要去绑定的服务为AdapterService
2、启动com.android.bluetooth服务进程时,会首先实例化AdapterApp并加载蓝牙JNI的so库。
3、绿色标注的框图代表加载系统中支持的蓝牙协议,根据配置文件config.xml中各个协议字段的布尔值来决定。由于蓝牙协议分为Server和Client两部分,所以安卓系统中也会根据当前系统的使用场景来配置相应的协议:
-
手机(Server),配置路径A: packages\apps\Bluetooth\res\values\config.xml
-
蓝牙耳机、车载等设备(Client),配置路径B:packages\services\Car\car_product\overlay\packages\apps\Bluetooth\res\values\config.xml
实际商用的安卓系统中可能还有厂商自己添加的配置文件,这时蓝牙协议是否加载就是这几份文件共同作用的结果了。
我这里使用高通的安卓源码来简单举例,高通自己还在如下路径下也配置了蓝牙协议字段,配置路径C:
device\qcom\common\product\overlay\packages\apps\Bluetooth\res\values\config.xml
所以对于手机这类设备的安卓系统中蓝牙协议配置就是A+C共同作用的结果,而对于车载设备的安卓系统中蓝牙协议配置则是A+B+C共同作用的结果。
这三个路径下蓝牙协议的具体配置如下几个截图所示。
路径A:
路径B:
路径C:
这三个路径的优先级有如下规则参考:
- 对于手机设备:A<C
- 对于车载蓝牙设备:A<B<C
即对于某个协议来说,安卓蓝牙系统中是否配置该协议最终以高优先级的蓝牙协议配置文件中的配置值为准,如果高优先级的配置文件中没有该协议字段,则以低优先级的配置文件中的配置值为准,以此类推,直到该蓝牙协议对应的字段有明确的定义为止。
因此在高通的车载安卓系统中结合上述三份配置文件可以得出支持的蓝牙协议有如下几种:
- profile_supported_a2dp_sink(true)—A2dpSinkService
- profile_supported_pan(true)—PanService
- profile_supported_gatt(true)—GattService
- profile_supported_hfpclient(true)—HeadsetClientService
- profile_supported_avrcp_target(true)—AvrcpTargetService
- profile_supported_avrcp_controller(true)—AvrcpControllerService
- profile_supported_sap(true)—SapService
- profile_supported_pbapclient(true)—PbapClientService
- profile_supported_mapmce(true)—MapClientService
- profile_supported_opp(true)—BluetoothOppService
蓝牙服务层Config.java加载支持的蓝牙协议见log截图:
上述三点简单做出说明后,蓝牙服务及协议栈初始化完成,通过onBind()将蓝牙服务层的IBinder对象返回给BluetoothManagerService继续执行接下来使能蓝牙enable的流程。
本篇蓝牙服务层的初始化就简单分析到这儿,后面会继续分析蓝牙相关模块的流程,对蓝牙技术感兴趣的小伙伴别忘了关注一波哦,精彩内容持续更新中,也欢迎私信留言一起讨论。
更多互联互通技术,欢迎关注微信公众号:Connectivity