Android 蓝牙启动流程

1,128 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

一、APP层


目录:packages/apps/Settings/src/com/android/settings/bluetooth/BluetoothEnabler.java 在这里插入图片描述 开关是个SwitchBar,监听事件callbackonSwitchChanged,调用mLocalAdapter.setBluetoothEnabled(isChecked)mLocalAdapter是个com.android.settingslib.bluetooth.LocalBluetoothAdapter的一个实例:

frameworks/base/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothAdapter.java

在这里插入图片描述 这里的mAdapter是BluetoothAdapter的实例,在LocalBluetoothAdapter的构造函数中初始化.

二、Framework层


然后到framework层的BluetoothAdapter 1.frameworks/base/core/java/android/bluetooth/BluetoothAdapter.java 在这里插入图片描述

这里面mManagerServiceBluetoothManagerServicebinder的代理。

在这里插入图片描述

  1. BluetoothManagerService是在SystemServer中被拉起,跑在SystemServer进程中。 所有最终的enable是在BluetoothManagerService这里执行的。

在这里插入图片描述

这个方法里,会先做一些权限检查,然后:sendEnableMsg(false, packageName);

在这里插入图片描述

sendEnableMsg最终会通过Handler发送MESSAGE_ENABLE消息。

在这里插入图片描述

在这里插入图片描述

mBluetooth是IBluetooth类型的实例,IBluetooth是aidl,由AdapterService里的内部类AdapterServiceBinder继承实现,AdapterService是packages/apps/Bluetooth里的类。如果支持BLE,那此时mBluetooth.getState()的返回值是BluetoothAdapter.STATE_BLE_ON, 所以下一步走到mBluetooth.onLeServiceUp()。 packages/apps/Bluetooth/src/com/android/bluetooth/btservice/AdapterService.java

在这里插入图片描述 mAdapterStateMachine是AdapterState的实例, AdapterState是个状态机,继承自com.android.internal.util.StateMachine。所以发的消息USER_TURN_ON就要看目前是在哪个状态,便在哪个状态处理这个消息。 打开蓝牙,enable()前便已进入BleOnState状态,所以USER_TURN_ON消息也在此状态中处理: packages/apps/Bluetooth/src/com/android/bluetooth/btservice/AdapterState.java

在这里插入图片描述

可以看到进入了PendingCommandState状态,且adapterService.startCoreServices() packages/apps/Bluetooth/src/com/android/bluetooth/btservice/AdapterService.java

在这里插入图片描述

其中Config.getSupportedProfiles()获取的是Config类中的SUPPORTED_PROFILES。在打开蓝牙,拉起Bluetooth进程,第一个会执行的可见方法中便会初始化且赋值,里面放的是支持的协议List。这里面包含了BLE的协议和传统蓝牙的协议,具体支持哪些协议在这里配置:packages/apps/Bluetooth/res/values/config.xml。 知道了支持的协议,便是一个一个拉起各个service,即setProfileServiceState这个方法里实现。