安卓系统中蓝牙协议栈的初始化流程分析

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

在这里插入图片描述

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

蓝牙协议栈整体上分为: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_managerbt_jni_workqueue,上述时序图里黄颜色标注。

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

更多互联互通技术,欢迎关注微信公众号:Connectivity
在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值