首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

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

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

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

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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200426A0769Q00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券