计算机系统应用教程网站

网站首页 > 技术文章 正文

安卓系统中蓝牙协议栈 bluedroid 的初始化

btikc 2024-10-27 08:35:04 技术文章 7 ℃ 0 评论

蓝牙协议栈初始化流程分析


熟悉安卓系统中蓝牙基本架构的同学想必对蓝牙协议栈不会陌生,还不了解的也不必担心,出门左转查看我另一篇文章《安卓系统中蓝牙服务层的初始化流程分析》,那篇分析里有一幅蓝牙系统在安卓中的架构图,想来对初识蓝牙的小伙伴会有很大帮助。


蓝牙协议栈整体上分为:HOST + Controller,它们之间以HCI为界线形象地分为上下两部分。Controller对应蓝牙固件也就是蓝牙芯片,这块协议的实现和各家厂商的策略差异很大,但依赖的协议都是相同的。而Host部分最为核心的就是协议栈,本篇分析我们就来扒一扒安卓系统中蓝牙协议栈初始化的实现流程,大家坐稳,出发了。


协议栈源码路径:\system\bt\


从该仓库下的相关编译配置文件可以知道,协议栈模块最终会被编译成动态so库的形式供其他模块调用。相关配置路径为:system\bt\main\ Android.bp(安卓8之前为Android.mk)


上面的架构图可以明显看出协议栈的动态so库是被JNI层加载的,JNI使用系统提供的动态so库加载方法实现获取协议栈so库对应的句柄即内存地址,再从打开的so库中查找对应的函数地址,这样JNI就达到调用协议栈中函数的目的。我们先来看下协议栈的初始化时序图:

再简单对上面的时序图做如下几点分析:

  1. 蓝牙JNI层通过dlopen()的系统调用根据蓝牙协议栈动态库名libbluetooth.so获取到该库对应的句柄,相当于文件描述符吧。
  2. 再通过dlsym()查找到bluetoothInterface对应的HAL函数接口,即内存地址。
  3. 通过获取到的函数接口初始化协议栈,主要设置了一组回调函数,同时协议栈主要创建了两个重要的子线程:stack_manager,bt_jni_workqueue,上述时序图里黄颜色标注。


通过以上三步,协议栈的初始化大概就完成了。本篇分析就到这儿,对蓝牙技术感兴趣的小伙伴欢迎私信留言一起讨论。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表