Android 蓝牙框架

基于Android9.0 Amlogic代码分析,
蓝牙应用通过 Binder 与蓝牙进程进行通信。蓝牙进程使用 JNI 与蓝牙堆栈通信,并向开发者提供对各种蓝牙配置文件的访问权限。下图显示了蓝牙堆栈的常规结构:

应用框架
client:
frameworks/base/core/java/android/bluetooth/*
servie:
framework/base/services/core/java/com/android/server/BluetoothService.java
framework/base/services/core/java/com/android/server/BluetoothManagerService.java

这部分主要提供给app调用的api,跟其他系统服务一样,分为client端和service端,通过binder通讯

蓝牙系统服务
蓝牙系统服务(位于 packages/apps/Bluetooth 中)被打包为 Android 应用,并在 Android 框架层实现蓝牙服务和配置文件。此应用通过 JNI 调用原生蓝牙堆栈。

JNI
与 android.bluetooth 相关联的 JNI 代码位于 packages/apps/Bluetooth/jni 中。当发生特定蓝牙操作时(例如发现设备时),JNI 代码会调用蓝牙堆栈。

蓝牙堆栈
AOSP 中提供了默认蓝牙堆栈(位于 system/bt 中)。该堆栈实现常规蓝牙 HAL,并通过扩展程序和更改配置对其进行自定义

供应商实现
供应商设备使用硬件接口设计语言 (HIDL) 与蓝牙堆栈交互。

framework与bluetootk app

android 蓝牙framework层跟其他系统服务有点不同,framework层的service主要是跟bluetooth app的sercive进行绑定,大部分功能逻辑都是在bluetooth app实现

mManagerService在打开蓝牙的时候会间接调用到handleEnable方法,handleEnable的dobind会绑定BluetoothService,回调到BluetoothServiceConnection方法中把service赋值给mBluetooth,这样我们就可以拿到Bluetooth app里的service(AdapterService)进行操作了

    //打开蓝牙的时候会间接调用到handleEnable方法private void handleEnable(boolean quietMode) {mQuietEnable = quietMode;try {mBluetoothLock.writeLock().lock();if ((mBluetooth == null) && (!mBinding)) {//绑定bluetooth app Serviceif (!doBind(i, mConnection, Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT,UserHandle.CURRENT)) {mHandler.removeMessages(MESSAGE_TIMEOUT_BIND);} else {mBinding = true;}} else if (mBluetooth != null) {}} finally {mBluetoothLock.writeLock().unlock();}}boolean doBind(Intent intent, ServiceConnection conn, int flags, UserHandle user) {ComponentName comp = intent.resolveSystemService(mContext.getPackageManager(), 0);intent.setComponent(comp);if (comp == null || !mContext.bindServiceAsUser(intent, conn, flags, user)) {Slog.e(TAG, "Fail to bind to: " + intent);return false;}return true;}private BluetoothServiceConnection mConnection = new BluetoothServiceConnection();private class BluetoothServiceConnection implements ServiceConnection {public void onServiceConnected(ComponentName componentName, IBinder service) {String name = componentName.getClassName();if (DBG) {Slog.d(TAG, "BluetoothServiceConnection: " + name);}//service绑定成功后,会回调。第一步是先绑定AdapterService,//之后通过AdapterService 去启动GattService,并且Message msg = mHandler.obtainMessage(MESSAGE_BLUETOOTH_SERVICE_CONNECTED);if (name.equals("com.android.bluetooth.btservice.AdapterService")) {msg.arg1 = SERVICE_IBLUETOOTH;} else if (name.equals("com.android.bluetooth.gatt.GattService")) {msg.arg1 = SERVICE_IBLUETOOTHGATT;} else {Slog.e(TAG, "Unknown service connected: " + name);return;}msg.obj = service;mHandler.sendMessage(msg);}public void onServiceDisconnected(ComponentName componentName) {}}case MESSAGE_BLUETOOTH_SERVICE_CONNECTED: {if (DBG) {Slog.d(TAG, "MESSAGE_BLUETOOTH_SERVICE_CONNECTED: " + msg.arg1);}IBinder service = (IBinder) msg.obj;try {mBluetoothLock.writeLock().lock();if (msg.arg1 == SERVICE_IBLUETOOTHGATT) {mBluetoothGatt =IBluetoothGatt.Stub.asInterface(Binder.allowBlocking(service));continueFromBleOnState();break;} // else must be SERVICE_IBLUETOOTH//Remove timeoutmHandler.removeMessages(MESSAGE_TIMEOUT_BIND);mBinding = false;mBluetoothBinder = service;mBluetooth = IBluetooth.Stub.asInterface(Binder.allowBlocking(service));//Do enable requesttry {if (!mQuietEnable) {if (!mBluetooth.enable()) {Slog.e(TAG, "IBluetooth.enable() returned false");}} else {if (!mBluetooth.enableNoAutoConnect()) {Slog.e(TAG, "IBluetooth.enableNoAutoConnect() returned false");}}}

和bluetooth app service绑定成功后,BluetoothManagerService会获取到bluetooth app 两个service binder对象
mBluetooth 绑定的是 AdapterService
mBluetoothGatt 绑定的是 GattService

总结:

  1. BluetoothManagerService 通过 bind 绑定AdapterService,连接成功后,通过回调onServiceConnected获取到AdapterService 里面的binder对象
  2. 调用AdapterService enable,触发enable流程,enable流程中会启动GattService去打开蓝牙和Ble。
  3. 蓝牙打开成功后会native会回调AdapterService。AdapterService会继续调用状态机进行处理,而在每次状态机发生改变后,AdapterService 都会回调BluetoothManagerService bluetoothStateChangeHandler
  4. BluetoothManagerService 收到回调后会再次通过bind 绑定GattService
  5. 绑定成功后 会走continueFromBleOnState() --> onLeServiceUp流程, 启动bluetooth app里面其他service

相对详细的流程看下节分析

#bluetooth app
Bluetooth apk是蓝牙功能逻辑具体的实现。常规打开关闭功能在AdapterService入口实现。这些方法最后跟踪都会跟踪到native方法上

####enable流程
上层或设置同过enable接口打开蓝牙时,会调用到AdapterService.java的接口enable,大体时序图如下所示:

AdapterService通过AdapterState进行状态转换

private AdapterState mAdapterStateMachine;public synchronized boolean enable(boolean quietMode) {...mAdapterStateMachine.sendMessage(AdapterState.BLE_TURN_ON);}

AdapterState.java代码片段

private TurningOnState mTurningOnState = new TurningOnState();
private TurningBleOnState mTurningBleOnState = new TurningBleOnState();
private TurningOffState mTurningOffState = new TurningOffState();
private TurningBleOffState mTurningBleOffState = new TurningBleOffState();
private OnState mOnState = new OnState();
private OffState mOffState = new OffState();
private BleOnState mBleOnState = new BleOnState();private AdapterState(AdapterService service) {super(TAG);addState(mOnState);addState(mBleOnState);addState(mOffState);addState(mTurningOnState);addState(mTurningOffState);addState(mTurningBleOnState);addState(mTurningBleOffState);mAdapterService = service;setInitialState(mOffState);}

AdapterState 是一个状态机,状态机改变状态时就会执行类的一些行为。构造函数默认是mOffState,收到BLE_TURN_ON消息。那么第一个地方就是OffState的processMessage处理BLE_TURN_ON,消息也是再直接传递到TurningBleOnState

AdapterState.java代码片段

private class OffState extends BaseAdapterState {...@Overridepublic boolean processMessage(Message msg) {switch (msg.what) {case BLE_TURN_ON:transitionTo(mTurningBleOnState);break;}}
private class TurningBleOnState extends BaseAdapterState {...@Overridepublic void enter() {super.enter();sendMessageDelayed(BLE_START_TIMEOUT, BLE_START_TIMEOUT_DELAY);mAdapterService.bringUpBle();}

这里会调用到AdapterService,开始启动ble 服务

 void bringUpBle() {...//Start Gatt servicesetProfileServiceState(GattService.class, BluetoothAdapter.STATE_ON);}private void setProfileServiceState(Class service, int state) {Log.e(TAG, "setProfileServiceStat :" + service.getSimpleName());Intent intent = new Intent(this, service);intent.putExtra(EXTRA_ACTION, ACTION_SERVICE_STATE_CHANGED);intent.putExtra(BluetoothAdapter.EXTRA_STATE, state);startService(intent);}

bluetooth apk里面很多service都时继承自ProfileService, 这里通过启动startService会调用到ProfileService的onStartCommand,service启动完后会回调到AdapterService

ProfileService.java 代码片段

 private void doStart() {// 回调到 AdapterService MESSAGE_PROFILE_SERVICE_REGISTEREDmAdapterService.addProfile(this);  //调用到对应子类的的 start方法mProfileStarted = start();if (!mProfileStarted) {Log.e(mName, "Error starting profile. start() returned false.");return;}// 回调到 AdapterService MESSAGE_PROFILE_SERVICE_REGISTEREDmAdapterService.onProfileServiceStateChanged(this, BluetoothAdapter.STATE_ON);}

这是第一步先启动GattService。

##启动其他Service
在蓝牙打开成功之后,JNI层会通过JniCallbacks的stateChangeCallback方法把消息回调给AdapterService处理,AdapterService则继续把消息给到状态机处理:

AdapterService.java代码片段:

void stateChangeCallback(int status) {if (status == AbstractionLayer.BT_STATE_OFF) {debugLog("stateChangeCallback: disableNative() completed");mAdapterStateMachine.sendMessage(AdapterState.BLE_STOPPED);} else if (status == AbstractionLayer.BT_STATE_ON) {mAdapterStateMachine.sendMessage(AdapterState.BLE_STARTED);} else {Log.e(TAG, "Incorrect status " + status + " in stateChangeCallback");}}

此时的AdapterState处于TurningBleOnState状态,TurningBleOnState在接收到BLE_STARTED消息后,迁入到BleOnState状态:

AdapterState.java代码片段:

private class TurningBleOnState extends BaseAdapterState {.......@Overridepublic boolean processMessage(Message msg) {switch (msg.what) {case BLE_STARTED:transitionTo(mBleOnState);break;........}

每一个状态的迁移,都会触发AdapterService的updateAdapterState,这个方法内部会把状态改变回调给远程的监听者:

AdapterState.java代码片段:

private abstract class BaseAdapterState extends State {abstract int getStateValue();@Overridepublic void enter() {int currState = getStateValue();infoLog("entered ");mAdapterService.updateAdapterState(mPrevState, currState);mPrevState = currState;}

AdapterService.java代码片段:

void updateAdapterState(int prevState, int newState) {mAdapterProperties.setState(newState);if (mCallbacks != null) {int n = mCallbacks.beginBroadcast();debugLog("updateAdapterState() - Broadcasting state " + BluetoothAdapter.nameForState(newState) + " to " + n + " receivers.");for (int i = 0; i < n; i++) {try {mCallbacks.getBroadcastItem(i).onBluetoothStateChange(prevState, newState);  //远程回调} catch (RemoteException e) {debugLog("updateAdapterState() - Callback #" + i + " failed (" + e + ")");}}mCallbacks.finishBroadcast();}

这里会远程回调到BluetoothManagerService里面的监听接口,经过handler消息处理机制会调用到bluetoothStateChangeHandler方法:

BluetoothManagerService.java代码片段

private class BluetoothHandler extends Handler {...@Overridepublic void handleMessage(Message msg) {
case MESSAGE_BLUETOOTH_SERVICE_CONNECTED: {IBinder service = (IBinder) msg.obj;try {mBluetoothLock.writeLock().lock();if (msg.arg1 == SERVICE_IBLUETOOTHGATT) {mBluetoothGatt = IBluetoothGatt.Stub.asInterface(Binder.allowBlocking(service));continueFromBleOnState();break;} private void continueFromBleOnState() {...mBluetooth.onLeServiceUp();}

mBluetooth.onLeServiceUp() 调用到了AdapterService

AdapterService.java 代码片段

    void onLeServiceUp() {mAdapterStateMachine.sendMessage(AdapterState.USER_TURN_ON);}

接着是跟上面启动gattService的流程差不多, 通过状态机切换,调用到AdapterService,启动

AdapterState.java代码片段

private class TurningOnState extends BaseAdapterState {@Overridepublic void enter() {...mAdapterService.startProfileServices();}

AdapterService.java 代码片段

void startProfileServices() {Class[] supportedProfileServices = Config.getSupportedProfiles();...setAllProfileServiceStates(supportedProfileServices, BluetoothAdapter.STATE_ON);}}
private void setAllProfileServiceStates(Class[] services, int state) {for (Class service : services) {if (GattService.class.getSimpleName().equals(service.getSimpleName())) {continue;}setProfileServiceState(service, state);}}private void setProfileServiceState(Class service, int state) {Intent intent = new Intent(this, service);intent.putExtra(EXTRA_ACTION, ACTION_SERVICE_STATE_CHANGED);intent.putExtra(BluetoothAdapter.EXTRA_STATE, state);startService(intent);}

这里用for循环,启动supportedProfileServices里面的所有service, 这里的service都是继承自ProfileService, 每个service启动完后都会回调到AdapterService,当所有service都启动完后会走到下面else if的流程

 private void processProfileServiceStateChanged(ProfileService profile, int state) {switch (state) {case BluetoothAdapter.STATE_ON:if (GattService.class.getSimpleName().equals(profile.getName())) {enableNativeWithGuestFlag();} else if (mRegisteredProfiles.size() == Config.getSupportedProfiles().length - 1&& mRegisteredProfiles.size() == mRunningProfiles.size()) {mAdapterProperties.onBluetoothReady();updateUuids();setBluetoothClassFromConfig();mAdapterStateMachine.sendMessage(AdapterState.BREDR_STARTED);}break;

####app启动总结:

图片来自https://blog.csdn.net/yus201120/article/details/119038589

参考:
https://source.android.google.cn/devices/bluetooth?hl=zh-cn
https://www.jianshu.com/p/b15314d91df0
https://blog.csdn.net/yus201120/article/details/119038589

Android 蓝牙框架

基于Android9.0 Amlogic代码分析,
蓝牙应用通过 Binder 与蓝牙进程进行通信。蓝牙进程使用 JNI 与蓝牙堆栈通信,并向开发者提供对各种蓝牙配置文件的访问权限。下图显示了蓝牙堆栈的常规结构:

应用框架
client:
frameworks/base/core/java/android/bluetooth/*
servie:
framework/base/services/core/java/com/android/server/BluetoothService.java
framework/base/services/core/java/com/android/server/BluetoothManagerService.java

这部分主要提供给app调用的api,跟其他系统服务一样,分为client端和service端,通过binder通讯

蓝牙系统服务
蓝牙系统服务(位于 packages/apps/Bluetooth 中)被打包为 Android 应用,并在 Android 框架层实现蓝牙服务和配置文件。此应用通过 JNI 调用原生蓝牙堆栈。

JNI
与 android.bluetooth 相关联的 JNI 代码位于 packages/apps/Bluetooth/jni 中。当发生特定蓝牙操作时(例如发现设备时),JNI 代码会调用蓝牙堆栈。

蓝牙堆栈
AOSP 中提供了默认蓝牙堆栈(位于 system/bt 中)。该堆栈实现常规蓝牙 HAL,并通过扩展程序和更改配置对其进行自定义

供应商实现
供应商设备使用硬件接口设计语言 (HIDL) 与蓝牙堆栈交互。

framework与bluetootk app

android 蓝牙framework层跟其他系统服务有点不同,framework层的service主要是跟bluetooth app的sercive进行绑定,大部分功能逻辑都是在bluetooth app实现

mManagerService在打开蓝牙的时候会间接调用到handleEnable方法,handleEnable的dobind会绑定BluetoothService,回调到BluetoothServiceConnection方法中把service赋值给mBluetooth,这样我们就可以拿到Bluetooth app里的service(AdapterService)进行操作了

    //打开蓝牙的时候会间接调用到handleEnable方法private void handleEnable(boolean quietMode) {mQuietEnable = quietMode;try {mBluetoothLock.writeLock().lock();if ((mBluetooth == null) && (!mBinding)) {//绑定bluetooth app Serviceif (!doBind(i, mConnection, Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT,UserHandle.CURRENT)) {mHandler.removeMessages(MESSAGE_TIMEOUT_BIND);} else {mBinding = true;}} else if (mBluetooth != null) {}} finally {mBluetoothLock.writeLock().unlock();}}boolean doBind(Intent intent, ServiceConnection conn, int flags, UserHandle user) {ComponentName comp = intent.resolveSystemService(mContext.getPackageManager(), 0);intent.setComponent(comp);if (comp == null || !mContext.bindServiceAsUser(intent, conn, flags, user)) {Slog.e(TAG, "Fail to bind to: " + intent);return false;}return true;}private BluetoothServiceConnection mConnection = new BluetoothServiceConnection();private class BluetoothServiceConnection implements ServiceConnection {public void onServiceConnected(ComponentName componentName, IBinder service) {String name = componentName.getClassName();if (DBG) {Slog.d(TAG, "BluetoothServiceConnection: " + name);}//service绑定成功后,会回调。第一步是先绑定AdapterService,//之后通过AdapterService 去启动GattService,并且Message msg = mHandler.obtainMessage(MESSAGE_BLUETOOTH_SERVICE_CONNECTED);if (name.equals("com.android.bluetooth.btservice.AdapterService")) {msg.arg1 = SERVICE_IBLUETOOTH;} else if (name.equals("com.android.bluetooth.gatt.GattService")) {msg.arg1 = SERVICE_IBLUETOOTHGATT;} else {Slog.e(TAG, "Unknown service connected: " + name);return;}msg.obj = service;mHandler.sendMessage(msg);}public void onServiceDisconnected(ComponentName componentName) {}}case MESSAGE_BLUETOOTH_SERVICE_CONNECTED: {if (DBG) {Slog.d(TAG, "MESSAGE_BLUETOOTH_SERVICE_CONNECTED: " + msg.arg1);}IBinder service = (IBinder) msg.obj;try {mBluetoothLock.writeLock().lock();if (msg.arg1 == SERVICE_IBLUETOOTHGATT) {mBluetoothGatt =IBluetoothGatt.Stub.asInterface(Binder.allowBlocking(service));continueFromBleOnState();break;} // else must be SERVICE_IBLUETOOTH//Remove timeoutmHandler.removeMessages(MESSAGE_TIMEOUT_BIND);mBinding = false;mBluetoothBinder = service;mBluetooth = IBluetooth.Stub.asInterface(Binder.allowBlocking(service));//Do enable requesttry {if (!mQuietEnable) {if (!mBluetooth.enable()) {Slog.e(TAG, "IBluetooth.enable() returned false");}} else {if (!mBluetooth.enableNoAutoConnect()) {Slog.e(TAG, "IBluetooth.enableNoAutoConnect() returned false");}}}

和bluetooth app service绑定成功后,BluetoothManagerService会获取到bluetooth app 两个service binder对象
mBluetooth 绑定的是 AdapterService
mBluetoothGatt 绑定的是 GattService

总结:

  1. BluetoothManagerService 通过 bind 绑定AdapterService,连接成功后,通过回调onServiceConnected获取到AdapterService 里面的binder对象
  2. 调用AdapterService enable,触发enable流程,enable流程中会启动GattService去打开蓝牙和Ble。
  3. 蓝牙打开成功后会native会回调AdapterService。AdapterService会继续调用状态机进行处理,而在每次状态机发生改变后,AdapterService 都会回调BluetoothManagerService bluetoothStateChangeHandler
  4. BluetoothManagerService 收到回调后会再次通过bind 绑定GattService
  5. 绑定成功后 会走continueFromBleOnState() --> onLeServiceUp流程, 启动bluetooth app里面其他service

相对详细的流程看下节分析

#bluetooth app
Bluetooth apk是蓝牙功能逻辑具体的实现。常规打开关闭功能在AdapterService入口实现。这些方法最后跟踪都会跟踪到native方法上

####enable流程
上层或设置同过enable接口打开蓝牙时,会调用到AdapterService.java的接口enable,大体时序图如下所示:

AdapterService通过AdapterState进行状态转换

private AdapterState mAdapterStateMachine;public synchronized boolean enable(boolean quietMode) {...mAdapterStateMachine.sendMessage(AdapterState.BLE_TURN_ON);}

AdapterState.java代码片段

private TurningOnState mTurningOnState = new TurningOnState();
private TurningBleOnState mTurningBleOnState = new TurningBleOnState();
private TurningOffState mTurningOffState = new TurningOffState();
private TurningBleOffState mTurningBleOffState = new TurningBleOffState();
private OnState mOnState = new OnState();
private OffState mOffState = new OffState();
private BleOnState mBleOnState = new BleOnState();private AdapterState(AdapterService service) {super(TAG);addState(mOnState);addState(mBleOnState);addState(mOffState);addState(mTurningOnState);addState(mTurningOffState);addState(mTurningBleOnState);addState(mTurningBleOffState);mAdapterService = service;setInitialState(mOffState);}

AdapterState 是一个状态机,状态机改变状态时就会执行类的一些行为。构造函数默认是mOffState,收到BLE_TURN_ON消息。那么第一个地方就是OffState的processMessage处理BLE_TURN_ON,消息也是再直接传递到TurningBleOnState

AdapterState.java代码片段

private class OffState extends BaseAdapterState {...@Overridepublic boolean processMessage(Message msg) {switch (msg.what) {case BLE_TURN_ON:transitionTo(mTurningBleOnState);break;}}
private class TurningBleOnState extends BaseAdapterState {...@Overridepublic void enter() {super.enter();sendMessageDelayed(BLE_START_TIMEOUT, BLE_START_TIMEOUT_DELAY);mAdapterService.bringUpBle();}

这里会调用到AdapterService,开始启动ble 服务

 void bringUpBle() {...//Start Gatt servicesetProfileServiceState(GattService.class, BluetoothAdapter.STATE_ON);}private void setProfileServiceState(Class service, int state) {Log.e(TAG, "setProfileServiceStat :" + service.getSimpleName());Intent intent = new Intent(this, service);intent.putExtra(EXTRA_ACTION, ACTION_SERVICE_STATE_CHANGED);intent.putExtra(BluetoothAdapter.EXTRA_STATE, state);startService(intent);}

bluetooth apk里面很多service都时继承自ProfileService, 这里通过启动startService会调用到ProfileService的onStartCommand,service启动完后会回调到AdapterService

ProfileService.java 代码片段

 private void doStart() {// 回调到 AdapterService MESSAGE_PROFILE_SERVICE_REGISTEREDmAdapterService.addProfile(this);  //调用到对应子类的的 start方法mProfileStarted = start();if (!mProfileStarted) {Log.e(mName, "Error starting profile. start() returned false.");return;}// 回调到 AdapterService MESSAGE_PROFILE_SERVICE_REGISTEREDmAdapterService.onProfileServiceStateChanged(this, BluetoothAdapter.STATE_ON);}

这是第一步先启动GattService。

##启动其他Service
在蓝牙打开成功之后,JNI层会通过JniCallbacks的stateChangeCallback方法把消息回调给AdapterService处理,AdapterService则继续把消息给到状态机处理:

AdapterService.java代码片段:

void stateChangeCallback(int status) {if (status == AbstractionLayer.BT_STATE_OFF) {debugLog("stateChangeCallback: disableNative() completed");mAdapterStateMachine.sendMessage(AdapterState.BLE_STOPPED);} else if (status == AbstractionLayer.BT_STATE_ON) {mAdapterStateMachine.sendMessage(AdapterState.BLE_STARTED);} else {Log.e(TAG, "Incorrect status " + status + " in stateChangeCallback");}}

此时的AdapterState处于TurningBleOnState状态,TurningBleOnState在接收到BLE_STARTED消息后,迁入到BleOnState状态:

AdapterState.java代码片段:

private class TurningBleOnState extends BaseAdapterState {.......@Overridepublic boolean processMessage(Message msg) {switch (msg.what) {case BLE_STARTED:transitionTo(mBleOnState);break;........}

每一个状态的迁移,都会触发AdapterService的updateAdapterState,这个方法内部会把状态改变回调给远程的监听者:

AdapterState.java代码片段:

private abstract class BaseAdapterState extends State {abstract int getStateValue();@Overridepublic void enter() {int currState = getStateValue();infoLog("entered ");mAdapterService.updateAdapterState(mPrevState, currState);mPrevState = currState;}

AdapterService.java代码片段:

void updateAdapterState(int prevState, int newState) {mAdapterProperties.setState(newState);if (mCallbacks != null) {int n = mCallbacks.beginBroadcast();debugLog("updateAdapterState() - Broadcasting state " + BluetoothAdapter.nameForState(newState) + " to " + n + " receivers.");for (int i = 0; i < n; i++) {try {mCallbacks.getBroadcastItem(i).onBluetoothStateChange(prevState, newState);  //远程回调} catch (RemoteException e) {debugLog("updateAdapterState() - Callback #" + i + " failed (" + e + ")");}}mCallbacks.finishBroadcast();}

这里会远程回调到BluetoothManagerService里面的监听接口,经过handler消息处理机制会调用到bluetoothStateChangeHandler方法:

BluetoothManagerService.java代码片段

private class BluetoothHandler extends Handler {...@Overridepublic void handleMessage(Message msg) {
case MESSAGE_BLUETOOTH_SERVICE_CONNECTED: {IBinder service = (IBinder) msg.obj;try {mBluetoothLock.writeLock().lock();if (msg.arg1 == SERVICE_IBLUETOOTHGATT) {mBluetoothGatt = IBluetoothGatt.Stub.asInterface(Binder.allowBlocking(service));continueFromBleOnState();break;} private void continueFromBleOnState() {...mBluetooth.onLeServiceUp();}

mBluetooth.onLeServiceUp() 调用到了AdapterService

AdapterService.java 代码片段

    void onLeServiceUp() {mAdapterStateMachine.sendMessage(AdapterState.USER_TURN_ON);}

接着是跟上面启动gattService的流程差不多, 通过状态机切换,调用到AdapterService,启动

AdapterState.java代码片段

private class TurningOnState extends BaseAdapterState {@Overridepublic void enter() {...mAdapterService.startProfileServices();}

AdapterService.java 代码片段

void startProfileServices() {Class[] supportedProfileServices = Config.getSupportedProfiles();...setAllProfileServiceStates(supportedProfileServices, BluetoothAdapter.STATE_ON);}}
private void setAllProfileServiceStates(Class[] services, int state) {for (Class service : services) {if (GattService.class.getSimpleName().equals(service.getSimpleName())) {continue;}setProfileServiceState(service, state);}}private void setProfileServiceState(Class service, int state) {Intent intent = new Intent(this, service);intent.putExtra(EXTRA_ACTION, ACTION_SERVICE_STATE_CHANGED);intent.putExtra(BluetoothAdapter.EXTRA_STATE, state);startService(intent);}

这里用for循环,启动supportedProfileServices里面的所有service, 这里的service都是继承自ProfileService, 每个service启动完后都会回调到AdapterService,当所有service都启动完后会走到下面else if的流程

 private void processProfileServiceStateChanged(ProfileService profile, int state) {switch (state) {case BluetoothAdapter.STATE_ON:if (GattService.class.getSimpleName().equals(profile.getName())) {enableNativeWithGuestFlag();} else if (mRegisteredProfiles.size() == Config.getSupportedProfiles().length - 1&& mRegisteredProfiles.size() == mRunningProfiles.size()) {mAdapterProperties.onBluetoothReady();updateUuids();setBluetoothClassFromConfig();mAdapterStateMachine.sendMessage(AdapterState.BREDR_STARTED);}break;

####app启动总结:

图片来自https://blog.csdn.net/yus201120/article/details/119038589

参考:
https://source.android.google.cn/devices/bluetooth?hl=zh-cn
https://www.jianshu.com/p/b15314d91df0
https://blog.csdn.net/yus201120/article/details/119038589

Android 上层蓝牙enable流程相关推荐

  1. Android Bluetooth蓝牙enable过程

    Android Bluetooth蓝牙enable过程 Android Bluetooth框架 enable的追踪从settings app开始,一直到最底层的driver,基本按照上图的框架,把函数 ...

  2. Android 蓝牙开关打开enable流程--framework层---全网最详细

    同学,别退出呀,我可是全网最牛逼的 Android 蓝牙分析博主,我写了上百篇蓝牙文章,请点击下面了解本专栏,进入本博主主页看看再走呗,一定不会让你后悔的,记得一定要去看主页置顶文章哦.   本文详细 ...

  3. android ble 蓝牙绑定流程,android BLE蓝牙开发

    蓝牙BLE设备是目前比较热门的设备.由于BLE有低功耗等特点,被广泛应用到身边的电子产品上.如智能手表.手环.防丢器等各种产品上.最近研究一下android上的ble应用开发.跟大家分享一下相关的内容 ...

  4. Android Studio 蓝牙开发流程

    1. 权限 关于蓝牙的权限主要涉及到下面三个: BLUETOOTH:允许配对的设备进行连接 BLUETOOTH_ADMIN:允许搜索和配对设备 ACCESS_COARSE_LOCATION:广播接收器 ...

  5. android ble 蓝牙绑定流程,BLE 配对与绑定过程详细解析

    1. 蓝牙绑定 绑定真正来说属于通用访问规范的讨论范畴.绑定指的无非是将密钥及相关身份信息保存到数据库中.如果设备不保存这些值,他们虽然能匹配,但不能绑定. 只要当中某一个设备不保存,重新连接后,只有 ...

  6. Android经典蓝牙开发全流程

    一.基本介绍   所谓蓝牙(Bluetooth)技术,实际上是一种短距离无线电技术,最初是由爱立信公司公司发明的.技术始于爱立信公司 1994 方案,它是研究在移动电话和其他配件间进行低功耗.低成本无 ...

  7. 蓝牙enable的流程分析

    本文主要基于高通Android 12 来分析蓝牙enable的流程 framework 流程不做分析,直接从packages\apps\Bluetooth进行分析 packages/apps/Blue ...

  8. android上层应用apk到G-sensor driver的大致流程

    android上层应用apk到G-sensor driver的大致流程: Android HAL层,即硬件抽象层,是Google响应厂家"希望不公开源码"的要求推出的新概念 1,源 ...

  9. Android wifi carlife,carlife可以无线连接吗?carlife蓝牙连接流程

    Carlife可以无线连接.目前无线连接支持iPhone手机使用,而安卓手机只有少部分可以使用.连接方法如下: 1.打开手机设置启用蜂窝移动数据,再打开手机WiFi,并且开一个无线热点. 2.找到车机 ...

最新文章

  1. java中异常与return
  2. 一个类似京东商城那种多条件筛选效果
  3. PHP特性整合(PHP5.X到PHP7.1.x)
  4. 高中数学立体几何证明套路高考试题(附答案)
  5. Excel数组与数组公式
  6. python mysqldb 安装_python MySQLdb在windows环境下的快速安装、问题解决方式
  7. 写给自己:入职两个月的收获与变化
  8. 8.Spring学习笔记_使用外部属性文件(by尚硅谷_佟刚)
  9. 论文写作 9: 引言需要讲述完整的故事
  10. xss/reflected/default
  11. ROS Kinetic安装记录
  12. 9.leetcode题目189: Rotate Array
  13. SpringMVC04:数据处理及跳转
  14. python 邮件_Python发送邮件(常见四种邮件内容)
  15. 泛谈移动互联时代的交互设计师
  16. 使用Burp,nbsp;Sqlmap进行自动化SQL注入渗透测试
  17. win7打开计算机无法最大化,如何解决win7开启远程功能时无法全屏
  18. java实现数字签名算法
  19. 计算机程序扩展名是什么,c语言源程序的扩展名是什么?
  20. 天才如周杰伦与周星驰也难逃孤独

热门文章

  1. 医疗时鲜资讯:自由执业能否给电子病历、影像中心 “云端化” 带来机遇?
  2. JQuery核心:1.jQuery( expression, context )
  3. 哈理工 2139 魔幻菱形
  4. Integer 和 int 的区别
  5. 【Matlab】电流转速闭环直流电机系统仿真
  6. linux 数据盘分区并挂载
  7. Hha mysql_RedHat as4常用应用之mysql+freeradius+cisco路由器
  8. 人工智能写作_智能写作软件_文案策划写作_写作机器人服务商|Giiso智搜
  9. 心田花开php面试,心田花开面试试题是什么?心田花开怎么面试的?
  10. 华为认证HCIA-AI人工智能