本文基于Android9.0源码,文中代码分布位于framework/base/services/core/java/com/android/server frameworks/base/core/java/android/bluetooth(平时我们调用的api代码就位于这里) package/app/bluetooth(系统中的蓝牙app,这里是最终实现蓝牙协议的地方) system/bt/binder/bluetooth(这里定义了整个蓝牙服务中使用到的AIDL)
启动蓝牙我们需要调用frameworks/base/core/java/android/bluetooth/BluetoothAdapter的enable方法,这里会去绑定一个系统服务framework/base/services/core/java/com/android/server/BluetoothService,这个服务持有的IBinder实现在framework/base/services/core/java/com/android/server/BluetoothManagerService类里面
接下来到BluetoothManagerService
然后会调用
从上图我们看出,BluetoothManagerService实际是去bind了一个服务来操作蓝牙的,这个服务类位于package/app/bluetooth,类名AdapterService,我们接着分析AdapterService,上述代码最终会调用
这里引入了一个StateMachine状态机,这里不对状态机做进一步的分析,我们只需要知道这里最终使用的是AdapterState,我们在AdapterState搜索BLE_TURN_ON即可,其他状态的处理方式也是一样的。
接着代码会走到TurningBleOnState类中的
这里最终调用了AdapterService 的bringUpBle方法
然后启动了一个ProfileService的子类GattService,在ProfileService的onStartCommand中再次调用了AdapterService的
接着调用了
最后调用了一个native方法,在底层开启了蓝牙设备,至此蓝牙启动的Java部分代码就完成了。