安卓蓝牙启动(第一篇)

了解一下android的蓝牙

setting app(按钮操作) ->framkwork (binder)->bluetooth app service (JNI_OnLoad)-> native (dlopen)-> default.so(dlopen) -> vendor.so -> dev

整个过程的核心在default.so,蓝牙协议会放这里,比如修改inquiry scan page scan  interval window等等参数

目录在 system/bt

经常要修改配置在

system/bt/include/bt_target.h

system/bt/conf/bt_stack.conf

每个厂家的BT

android8之前,会有些厂商修改system/bt,后面大多只是改vendor了,主要就是启动蓝牙方式不同,8.0之后启动部分vendor.so也放到了vendor分区,启动有一个class为hal的init启动

整个部分肯定很庞大在android

先看一下bluetooth.app部分,主要跑了蓝牙需要的service,如图是蓝牙连接起来最重要service

还有其它可以选择的service,a2dp播放需要之类

选择的地方在config.xml

这个可以选择需要的profile,刚开始跑起来的时候,就是这些service跑到最前面,有些必须要跑,有些可以选择跑或者不跑,

像AdapterService 就是跑在最前的,可以说的上是init函数,都不用选,必须得跑,像gatt service都是必须要跑的,低的安卓版本不跑gatt蓝牙直接起不来。

接下来要分析一个android 7.1版本   "按setting打开蓝牙按钮,然后打开蓝牙的一部分过程",这样对整个架构会有点感觉

如果从setting app开始,肯定会乱,从中间到两边分步骤,舒服一点,也可以由此进去打开门

android 7.1版本(其它版本多少有点改动,但也差不多)

第一部分:从bluetooth app -> native

这一部分的目的就是要找到,哪个地方调用了JNI 打开蓝牙的接口,先定位一下打开蓝牙的接口。

这个地方其实不难找到

就在AdapterService上面,enableNative 这个函数就是JNI打开蓝牙的接口,已经找到了终点的接口,

那这一部分的起点在哪里???这个很难找,而且不止是能不能找到的问题,还有逻辑上的关系。

一共涉及到有如下几个文件

src/com/android/bluetooth/btservice/ProfileService.java
src/com/android/bluetooth/btservice/AdapterService.java
src/com/android/bluetooth/btservice/AdapterState.java
src/com/android/bluetooth/gatt/GattService.java

总体思路:先打开GATT profile,打开GATT的时候enable 蓝牙,这个enable过程包括蓝牙module 协议栈初始化,比如hci_module init的时候,就会打开串口,使能或者不使能流控,加载蓝牙模块的固件(包括config和fw)

然后再打开其它其它的profile,这些profile以service的方式在后台运行,state的状态在framkwork以接口定义,在bluetooth app使用,profile如下显示,过程就到此先。

1、这个就是起点,从bluetooth app的起点,先不用管framkwork是怎么跑到这里来的

这个地方通过管道的方式sendMessage BLE_TURN_ON给 AdapterState

2、跑到 AdapterState的 BLE_TURN_ON

这个上面调用了BleOnProcessStart

3、运行到BleOnProcessStart 

这个部分就跑到了setGattProfileServiceState,

这个是一个重点!一个重点,BluetoorfAdapter.STATE_ON,这个参数是为什么运行别的profile不会enable蓝牙

因为就是从STATE_OFF -> STATE_ON,这个变化会触发enable 蓝牙

开启gatt  profile

4、运行setGattProfileServiceState

5、从startService跑到GattService.java的打开onStartConmmand

看到哪个Override没有,叫做重写,

就是隐藏在这里

6、重写的父类中,有enable 蓝牙的逻辑,开始运行到

从STATE_OFF -> STATE_ON,这个变化会触发enable 蓝牙

如果从STATE_ON ->STATE_OFF 这个变化就会关闭蓝牙。

为什么打开其它profile不会再enable蓝牙,因为已经变成STATE_ON了

在ProfileService.java管理着这些profile

看到没有,还没完,还有很多事情,这个父类当中,有跑doStop和doStart,我们只看doStart

7、我们去doStart看看 

找到notifyProfileServiceStateChanged,看看这个东东,记着这个BluetoothAdapter.STATE_ON

8、notifyProfileServiceStateChanged

打开GATT的时候,是notifyProfileServiceStateChanged,其它profile是onProfileConnectionStateChanged经常会用到在ACL链路上连接的时候cid建立时。

说全一点可以看看framkwork的定义,看看,看一下

9、看看onProfileServiceStatechanged

10、看看MESSAGE_PROFILE_SERVICE_STATE_CHANGED

11、看看processProfileServiceStateChanged

isBleTurningOn在offstate的时候,这个值是设置为true的

当开启其它profile才会从isBleTurningOn变成isTurningOn

然后就是干了这件事情

mAdapterStateMachine.sendMessage(mAdapterStateMachine.obtainMessage(AdapterState.BLE_STARTED));

发消息BLE_STARTED

12、终于找到native的接口

这里终于调用native打开蓝牙,这部分可以

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值