为什么 学习协议栈之前 最好是要先梳理清楚 关键线程
蓝牙协议栈中各模块的初始化、通信、状态回调不是同步执行,而是分散在线程中通过消息队列 / 回调调度完成的。
所以:
你理解不了线程的职责、执行顺序,就等于你看不到协议栈的真实运行路径。
线程 | 主要职责 | 你必须理解的理由 |
---|---|---|
bt_stack_manager_thread |
控制协议栈生命周期(init/startup/shutdown/cleanup) | 它是协议栈“主控台”,如果你不清楚它在干嘛,无法理解栈是怎么从无到有、有到无的 |
bt_jni_thread |
JNI 层 → native 层的事件调度、回调通知 | Java 层的蓝牙开关、回调都从这来,你必须知道怎么从 Java 控 native |
bt_main_thread |
执行主线程模块任务(如 BTA/BTE 各模块调度) | 大量如 bta_sys_event() 、btm_ble_xxx() 都跑在这里,是“核心业务线程” |
bt_a2dp_sink_worker_thread |
专门处理 A2DP sink 数据包的接收、解码 | 如果你搞音频,必须清楚它什么时候开、怎么调度音频数据,避免阻塞或延迟音频 |
Java 调用 adapter.enable()
→ 触发 JNI 调用 bt_interface_t.enable()
→ JNI Thread 把 enable 请求 post
给 bt_stack_manager_thread
→ bt_stack_manager_thread
调用 event_start_up_stack()
→ 多个模块在 bt_main_thread
中初始化(比如 BTA_dm_enable()
)
→ 初始化完成后,从 bt_jni_thread
回调 Java 层 onBluetoothEnabled()
你看,不懂线程,就根本看不出上面这些跳转背后的逻辑!
搞清楚这几个核心线程,就是搭建起你理解整个蓝牙协议栈“运作模型”的基础骨架。
之后不管你调试 A2DP 不通、BLE 扫描失败,还是 callback 没响应——
第一步就是看事件跑到哪个线程了、卡在谁那了。
本节先带大家粗略的看看各个线程 的用途, 稍后会有详细章节,一一介绍。
01-10 01:47:11.367588 2008 2539 I droid.bluetooth: [0110/014711.367540:INFO:message_loop_thread.cc(226)] Run: message loop starting for thread bt_stack_manager_thread
01-10 01:47:11.370394 2008 2542 I droid.bluetooth: [0110/014711.370351:INFO:message_loop_thread.cc(226)] Run: message loop starting for thread bt_jni_thread
01-10 01:47:12.932886 2008 3002 I bt_stack: [INFO:message_loop_thread.cc(226)] Run: message loop starting for thread bt_main_thread
01-10 01:47:13.152122 2008 3073 I bt_stack: [INFO:message_loop_thread.cc(226)] Run: message loop starting for thread bt_a2dp_sink_worker_thread
作用:
负责蓝牙协议栈的全局管理,比如启动/关闭蓝牙、切换模式(BLE/经典蓝牙)
协调各个模块的初始化(HCI、A2DP、AVRCP等)
处理系统级事件(如蓝牙开关状态变化、设备连接/断开)
特点:
相当于蓝牙协议栈的"总指挥"
所有关键操作都要经过它来调度
作用:
特点:
作用:
特点:
作用:
特点:
调用流程(自上而下):
Java应用 → bt_jni_thread(翻译请求)
→ bt_stack_manager_thread(分配任务)
→ bt_main_thread(分发消息)
→ bt_a2dp_sink_thread(处理音频)
事件上报(自下而上):
硬件事件 → bt_main_thread(接收)
→ bt_stack_manager_thread(处理)
→ bt_jni_thread(回调Java)
→ 通知应用
协作特点:
bt_jni_thread
是唯一直接与Java层交互的线程
bt_stack_manager_thread
掌握最高控制权
bt_main_thread
是消息中转站
bt_a2dp_sink_thread
是专职工作者
这样设计既保证了蓝牙功能的可靠性,又确保了高性能和低延迟。