当前位置: 首页 > news >正文

【android bluetooth 框架分析 01】【关键线程 2】【bt_stack_manager_thread线程介绍】

1. bt_stack_manager_thread

bt_stack_manager_thread 是蓝牙协议栈中的核心调度线程,负责串行化处理协议栈的生命周期事件,包括初始化、启动、关闭与清理操作。它确保这些状态切换在同一线程中按顺序执行,避免竞态和资源冲突。作为蓝牙栈的“总指挥”,它协调模块管理器、协议子系统(如 L2CAP、GATT、BTM)、以及 JNI 层之间的事件传递,是协议栈有序启动与安全退出的关键保障。

本节就来详细介绍一下 bt_stack_manager_thread 线程。

1.1 线程启动流程


static MessageLoopThread management_thread("bt_stack_manager_thread");

static void ensure_manager_initialized() {
  if (management_thread.IsRunning()) return;

  management_thread.StartUp(); // 这里启动我们的 bt_stack_manager_thread 线程
  if (!management_thread.IsRunning()) {
    LOG_ERROR("%s unable to start stack management thread", __func__);
    return;
  }
}

const stack_manager_t* stack_manager_get_interface() {
  ensure_manager_initialized();
  return &interface;
}

调用流程如下:
com_android_bluetooth_btservice_AdapterService.cpp

static void classInitNative(JNIEnv* env, jclass clazz) {

	if (hal_util_load_bt_library((bt_interface_t const**)&sBluetoothInterface)) {
    ALOGE("No Bluetooth Library found");
  }
}

int hal_util_load_bt_library(const bt_interface_t** interface) {
  *interface = &bluetoothInterface;
  return 0;

}
  • 通过 hal_util_load_bt_library 加载 sBluetoothInterface
  • 此时加载的接口是 bluetoothInterface , 这个接口是 bluetooth.cc 中的
    • system/btif/src/bluetooth.cc
EXPORT_SYMBOL bt_interface_t bluetoothInterface = {
    sizeof(bluetoothInterface),
    init, // 这个里面 创建了 bt_stack_manager_thread 线程
    enable,
    disable,
    cleanup,
    get_adapter_properties,
    get_adapter_property,
    set_adapter_property,
    get_remote_device_properties,
    get_remote_device_property,
    set_remote_device_property,
    nullptr,
    get_remote_services,
    start_discovery,
    cancel_discovery,
    create_bond,
    create_bond_out_of_band,
    remove_bond,
    cancel_bond,
    get_connection_state,
    pin_reply,
    ssp_reply,
    get_profile_interface,
    dut_mode_configure,
    dut_mode_send,
    le_test_mode,
    set_os_callouts,
    read_energy_info,
    dump,
    dumpMetrics,
    config_clear,
    interop_database_clear,
    interop_database_add,
    get_avrcp_service,
    obfuscate_address,
    get_metric_id,
    set_dynamic_audio_buffer_size,
    generate_local_oob_data,
    allow_low_latency_audio,
    clear_event_filter,
    load_remote_oob_data,
    metadata_changed};
函数名功能说明
size接口结构体的大小,必须设置为 sizeof(bt_interface_t)
init初始化 Bluetooth 接口,注册回调函数,is_atv 表示是否为 Android TV
enable启用蓝牙,可指定是否为访客模式(guest_mode)
disable禁用蓝牙
cleanup清理接口,释放资源
get_adapter_properties获取蓝牙适配器的所有属性
get_adapter_property获取指定类型的蓝牙适配器属性
set_adapter_property设置指定类型的蓝牙适配器属性(如地址、设备名等)
get_remote_device_properties获取远程设备的所有属性
get_remote_device_property获取远程设备指定类型的属性
set_remote_device_property设置远程设备指定类型的属性
get_remote_service_record获取远程设备指定 UUID 的服务记录
get_remote_services执行 SDP 查询,获取远程设备提供的所有服务
start_discovery开始设备扫描(发现附近蓝牙设备)
cancel_discovery取消设备扫描
create_bond建立配对连接(bonding)
create_bond_out_of_band使用 OOB 数据建立配对连接
remove_bond移除设备配对信息
cancel_bond取消正在进行的配对
get_connection_state获取指定设备的连接状态(0=未连接,非0=已连接)
pin_reply针对传统配对流程返回 PIN 码
ssp_reply针对 SSP(安全简单配对)流程返回结果,例如确认或输入 PIN
get_profile_interface获取指定蓝牙 profile 的接口,例如 A2DP、HFP 等
dut_mode_configure设置 DUT(Device Under Test)模式,开启蓝牙测试模式
dut_mode_send向控制器发送 HCI 测试命令,仅限 DUT 模式下使用
le_test_mode发送 BLE 测试模式命令,如接收测试、发射测试等
set_os_callouts设置 OS 层接口,如警报、唤醒锁的调用方式
read_energy_info读取能量信息(控制器电量、耗电情况)
dump用于 dumpsys 命令输出调试信息
config_clear清除 /data/misc/bt_config.conf 中的蓝牙配置信息
interop_database_clear清除设备兼容性数据库的动态部分
interop_database_add向兼容性数据库添加设备 workarounds 条目,用于特定厂商设备问题处理
  • 在 init 中我们触发创建了 bt_stack_manager_thread 线程
  • android/app/jni/com_android_bluetooth_btservice_AdapterService.cpp
static bool initNative(JNIEnv* env, jobject obj, jboolean isGuest,
                       jboolean isCommonCriteriaMode, int configCompareResult,
                       jobjectArray initFlags, jboolean isAtvDevice,
                       jstring userDataDirectory) {


// 调用 init 函数
  int ret = sBluetoothInterface->init(
      &sBluetoothCallbacks, isGuest == JNI_TRUE ? 1 : 0,
      isCommonCriteriaMode == JNI_TRUE ? 1 : 0, configCompareResult, flags,
      isAtvDevice == JNI_TRUE ? 1 : 0, user_data_directory);

}

  • system/btif/src/bluetooth.cc
static int init(bt_callbacks_t* callbacks, bool start_restricted,
                bool is_common_criteria_mode, int config_compare_result,
                const char** init_flags, bool is_atv,
                const char* user_data_directory) {
  (void)user_data_directory;
  LOG_INFO(
      "%s: start restricted = %d ; common criteria mode = %d, config compare "
      "result = %d",
      __func__, start_restricted, is_common_criteria_mode,
      config_compare_result);

...

  // 这里调用了 stack_manager_get_interface()
  stack_manager_get_interface()->init_stack();
  return BT_STATUS_SUCCESS;
}
  • system/btif/src/stack_manager.cc
const stack_manager_t* stack_manager_get_interface() {
  ensure_manager_initialized();
  return &interface;
}

static void ensure_manager_initialized() {
  if (management_thread.IsRunning()) return;

  // 这里启动了  bt_stack_manager_thread 线程
  management_thread.StartUp();
  if (!management_thread.IsRunning()) {
    LOG_ERROR("%s unable to start stack management thread", __func__);
    return;
  }
}

1.2 如何工作的?

上面小节 介绍了 management_thread 是如何启动的,本节介绍是如何 工作的。

  • system/btif/src/stack_manager.cc
static const stack_manager_t interface = {init_stack, start_up_stack_async,
                                          shut_down_stack_async, clean_up_stack,
                                          get_stack_is_running};

const stack_manager_t* stack_manager_get_interface() {
  ensure_manager_initialized();
  return &interface;
}
  • stack manager 暴露了如下接口
    • init_stack -> event_init_stack
    • start_up_stack_async -> event_start_up_stack
    • shut_down_stack_async -> event_shut_down_stack
    • clean_up_stack -> event_clean_up_stack
    • get_stack_is_running -> return stack_is_running
static void init_stack() {

  semaphore_t* semaphore = semaphore_new(0);
  management_thread.DoInThread(FROM_HERE,
                               base::Bind(event_init_stack, semaphore));
  semaphore_wait(semaphore);
  semaphore_free(semaphore);
}
  • management_thread.DoInThread 将 event_init_stack 任务交给 management_thread 线程处理。
  • 其他接口类似

咱们就来通俗地剖析一下 bt_stack_manager_thread 的工作流程,重点分析提到的几个事件:

  • event_init_stack

  • event_start_up_stack

  • event_shut_down_stack

  • event_clean_up_stack


bt_stack_manager_thread 是啥?

这是一个 专门用于管理蓝牙协议栈生命周期的线程,负责按顺序执行蓝牙栈的几个重要状态转换:

  1. 初始化蓝牙栈(Init)

  2. 启动蓝牙栈(StartUp)

  3. 关闭蓝牙栈(ShutDown)

  4. 清理资源(CleanUp)

每个状态对应一个事件(event),这些事件会被派发到 bt_stack_manager_thread 这个线程去处理,避免多线程并发操作蓝牙栈带来的崩溃或竞态问题


1. event_init_stack

🕰️ 触发时机:当系统 拉起 AdapterService 服务时自动触发。
🔧 做了啥

public class AdapterService extends Service {

    static {
        classInitNative(); // 会最终触发调用 event_init_stack
    }

}
# 具体看  2.1 线程启动流程
[classInitNative] -> [sBluetoothInterface->init]

-> [stack_manager_get_interface()->init_stack()] 

👉 具体做了:

// `context`: 上层传入的信号量指针(semaphore),用于同步等待(也可能为 NULL)
    
// 函数是异步派发到 `bt_stack_manager_thread` 中执行的,避免主线程卡顿

static void event_init_stack(void* context) {
  // 如果 context 有值,表示调用方需要知道初始化是否完成(用信号量机制通知)
  semaphore_t* semaphore = (semaphore_t*)context;

  LOG_INFO("is initializing the stack");

  // 避免重复初始化,保证蓝牙栈只初始化一次
  // 在热启动或某些异常恢复流程中非常重要
  if (stack_is_initialized) {
    LOG_INFO("found the stack already in initialized state");
  } else {
    /*
    初始化内部的模块管理系统,比如创建 module 列表、管理模块状态等。所有后续 `module_init()`、`module_start_up()` 都依赖它。
    */
    module_management_start();

	// 初始化 操作系统抽象层(OSI),提供 log、alarm、semaphore、thread 管理等基础功能。
    module_init(get_local_module(OSI_MODULE));

	// 蓝牙通用工具模块,如设备地址工具、设备信息解析、通用接口辅助。
    module_init(get_local_module(BT_UTILS_MODULE));

    // 负责启动 [GD(Gabeldorsche)](https://source.android.com/docs/core/connect/bluetooth/gd) 框架中的 idle 模块,为新架构蓝牙做准备(Android 11+ 引入)。
    module_start_up(get_local_module(GD_IDLE_MODULE));

	// 负责加载并管理配置文件(`bt_config.conf`),如配对记录、配对密钥等。
    module_init(get_local_module(BTIF_CONFIG_MODULE));

	/*
	Bluetooth Interface(BTIF)层初始化,它是 JNI 和 native stack 之间的桥梁 
	例如处理 Java 层调用 enable()、disable() 等动作
	*/
    btif_init_bluetooth();

	/*
	初始化设备兼容性工作模块,用于处理某些设备的特定 workaround(如音响连接问题)
	*/
    module_init(get_local_module(INTEROP_MODULE));

	/*
	这是真正启动 classic Bluetooth stack 的核心入口:

	初始化 HCI 模块

	启动 GAP、SDP、BNEP、RFCOMM 等协议层

	注册 internal 回调机制
	*/
    bte_main_init();

	// 负责加载栈的启动参数配置,比如 Feature Flag、调试开关、协议开关等
    module_init(get_local_module(STACK_CONFIG_MODULE));

    // stack init is synchronous, so no waiting necessary here
    // 标记栈初始化完成
    stack_is_initialized = true;
  }

  LOG_INFO("finished");

	// 发信号(通知等待线程)
  if (semaphore) semaphore_post(semaphore);
}
  • 调用 init_stack()
步骤模块含义
1module_management_start()启动模块系统
2OSI_MODULE基础操作系统抽象
3BT_UTILS_MODULE蓝牙通用工具
4GD_IDLE_MODULE新架构蓝牙 IDLE
5BTIF_CONFIG_MODULE配对信息读取模块
6btif_init_bluetooth()初始化 JNI 层接口
7INTEROP_MODULE兼容性模块
8bte_main_init()启动 classic 蓝牙协议栈
9STACK_CONFIG_MODULE加载栈配置项
  • event_init_stack() 负责蓝牙栈中最基础的模块初始化,所有后续功能都依赖它的正确执行。

  • 如果这一步挂了,蓝牙后续一切功能都不会工作。

  • 常见触发点:应用层 enable()、蓝牙重启、系统冷启动。拉起蓝牙服务时,就会触发

举例:你点开手机蓝牙开关,就会触发这个流程


2. event_start_up_stack

触发时机:当系统调用 开启蓝牙后, 各个profile 服务启动时,就会触发, 这里拿 GattService 举例,
在这里插入图片描述

01-10 01:47:11.513188  2008  2008 D GattService: doStart()

01-10 01:47:11.552258  2008  2008 D BluetoothAdapterService: processProfileServiceStateChanged: GattService, state: 12

01-10 01:47:11.552428  2008  2539 I bt_stack_manager: packages/modules/Bluetooth/system/btif/src/stack_manager.cc:283 event_start_up_stack: event_start_up_stack is bringing up the stack
static int enable() {
  if (!interface_ready()) return BT_STATUS_NOT_READY;

  stack_manager_get_interface()->start_up_stack_async();
  return BT_STATUS_SUCCESS;
}

调用流程:

[ProfileService:doStart]  -> 

[mAdapterService.onProfileServiceStateChanged(this, BluetoothAdapter.STATE_ON);] ->

[processProfileServiceStateChanged((ProfileService) msg.obj, msg.arg1);] ->

[enableNative();] ->

[sBluetoothInterface->enable();] ->

[stack_manager_get_interface()->start_up_stack_async();]


  • 上层 profile server 都是继承 ProfileService 。

event_start_up_stack() 逻辑:
是 Bluetooth Stack 启动的第二阶段event_start_up_stack(),它是在 event_init_stack() 成功执行之后调用的,用于 启动协议栈功能层模块(包括 L2CAP、SDP、GATT、A2DP、RFCOMM、HID 等),完成蓝牙的“上电”启动。

// Synchronous function to start up the stack
static void event_start_up_stack(UNUSED_ATTR void* context) {

  // 防重复启动
  if (stack_is_running) {
    LOG_INFO("%s stack already brought up", __func__);
    return;
  }
  // 如果 event_init_stack() 没跑,就跑一次,确保一切基础组件就绪
  ensure_stack_is_initialized();

  LOG_INFO("%s is bringing up the stack", __func__);


  // 创建 future,用于异步等待
  // 用来等待整个启动过程中某些异步操作完成,比如 controller 模块初始化
  future_t* local_hack_future = future_new();
  hack_future = local_hack_future;

  // 清理旧模块 + 启动新模块
  LOG_INFO("%s Gd shim module enabled", __func__);
  module_shut_down(get_local_module(GD_IDLE_MODULE)); // 关闭 GD_IDLE_MODULE(空模块)
  get_btm_client_interface().lifecycle.btm_init(); // 初始化 BTM 模块(底层管理模块)
  module_start_up(get_local_module(GD_SHIM_MODULE)); // 启动 GD_SHIM_MODULE:GD 是新蓝牙架构模块(Android 11+)
  module_start_up(get_local_module(BTIF_CONFIG_MODULE)); // BTIF_CONFIG 再次启动,以支持后续读写 

  // 初始化协议栈模块(重点)
	l2c_init();         // L2CAP 层
	sdp_init();         // 服务发现协议
	gatt_init();        // GATT 层(BLE)
	SMP_Init();         // 安全配对协议(BLE 安全)
	get_btm_client_interface().lifecycle.btm_ble_init();  // BLE BTM 层

	RFCOMM_Init();      // 串口仿真层
	BNEP_Init();        // 蓝牙以太网仿真协议
	PAN_Init();         // 个人局域网协议
	A2DP_Init();        // 高质量音频传输
	AVRC_Init();        // 遥控控制协议
	GAP_Init();         // 通用访问协议
	HID_HostInit();     // 人机交互设备(鼠标、键盘)

	bta_sys_init();     // 初始化 BTA 系统核心调度
	bta_ar_init();      // 注册音频相关 profile(如 A2DP + AVRCP)

	// 启用调试日志收集,便于排查协议过程中的问题
  module_init(get_local_module(BTE_LOGMSG_MODULE));

  // 启动主线程 bt_main_thread
  // 主线程处理主状态机事件(如连接、断开、认证请求)
  main_thread_start_up();

  // JNI Bridge 初始化完毕,通知上层
  btif_init_ok();     // JNI 层回调标志:Bluetooth Native 已准备好

  // 启动核心状态管理模块  
	BTA_dm_init();                      // Device Manager 初始化
	bta_dm_enable(bte_dm_evt);         // 启动 DM 并注册事件处理器

  // 控制器初始化 & 状态同步
	  bta_set_forward_hw_failures(true);         // 设置硬件错误转发
	btm_acl_device_down();                     // 清除旧 ACL 连接
	CHECK(module_start_up(get_local_module(GD_CONTROLLER_MODULE)));  // 控制器启动
	BTM_reset_complete();                      // 标记芯片初始化完成

  // 通知上层 “蓝牙已上电”
  BTA_dm_on_hw_on();       // 通知 BTA 层 “controller 就绪”

	// 等待异步 future 完成
  if (future_await(local_hack_future) != FUTURE_SUCCESS) {
    LOG_ERROR("%s failed to start up the stack", __func__);
    stack_is_running = true;  // So stack shutdown actually happens
    event_shut_down_stack(nullptr); // 自动触发关闭
    // 如果 controller 初始化失败,则强制回滚,触发 `event_shut_down_stack()`
    return;
  }

  // 启动成功,通知 JNI 层
  // 通知 Android Framework 蓝牙栈已准备完成,可以对外服务!
  stack_is_running = true;
  LOG_INFO("%s finished", __func__);
  do_in_jni_thread(FROM_HERE, base::Bind(event_signal_stack_up, nullptr));
}
  • 启动模块(有顺序):

    • shim, Gki, Bte_main, BTIF_CONFIG_MODULE, BTIF_CONFIG_INTERFACE

    • 启动 HCI 模块(就是控制器通信模块)

    • 启动 profile,如 A2DP、HFP 等

  • 设置 HAL 状态为 BT_STATE_ON

  • 回调通知上层 “蓝牙启动成功”

功能内容
协议层初始化L2CAP、SDP、GATT、SMP
Profile 初始化A2DP、AVRCP、HID、PAN、RFCOMM
Controller 初始化启动蓝牙芯片控制器通信能力
上报系统状态通知 JNI “蓝牙栈已准备”
错误回滚如果启动失败,立即关闭蓝牙栈防止残留

举例:你点开蓝牙开关之后,系统蓝牙图标亮起,表示可以连接设备了


3. event_shut_down_stack

触发时机:调用 disable() 或系统关机前触发

event_shut_down_stack() 做的事:
这是 Bluetooth 栈生命周期中第三阶段:event_shut_down_stack()。它负责在关闭蓝牙或失败回滚时,干净、安全地关闭所有协议模块、资源清理、通知上层状态变更。

static void event_shut_down_stack(UNUSED_ATTR void* context) {
 // 防止重复关闭
  if (!stack_is_running) {
    LOG_INFO("%s stack is already brought down", __func__);
    return;
  }

  LOG_INFO("%s is bringing down the stack", __func__);

  // 创建异步 future + 设置状态
  // 后续异步流程依然使用 `future` 来等待任务结束
  future_t* local_hack_future = future_new();
  hack_future = local_hack_future;
  stack_is_running = false;

  // 清理 BLE 功能, 这些操作是异步的,在 `main_thread` 中执行
  do_in_main_thread(FROM_HERE, base::Bind(&btm_ble_multi_adv_cleanup)); // 清理 BLE 广播(BLE Advertising)

  do_in_main_thread(FROM_HERE, base::Bind(&btm_ble_scanner_cleanup)); // 清理 BLE 扫描器(BLE Scanner)


  // 清理 Profile 层, 将所有对外连接/监听都关闭
  
	btif_dm_on_disable();    // 关闭设备管理模块
	btif_sock_cleanup();     // 清除 socket server
	btif_pan_cleanup();      // PAN profile 清理


  // 停止设备管理
  // `bta_dm_disable()` 停止连接管理、bonding、搜索等
  do_in_main_thread(FROM_HERE, base::Bind(bta_dm_disable));
  // 等待任务完成,确保状态稳定
  future_await(local_hack_future);

  // 协议核心关闭
  local_hack_future = future_new();
  hack_future = local_hack_future;

	bta_sys_disable();                 // 停止 BTA 系统任务调度
	bta_set_forward_hw_failures(false);  // 关闭错误转发
	BTA_dm_on_hw_off();               // 通知 BTA 硬件已断电

  // 模块卸载
	module_shut_down(get_local_module(BTIF_CONFIG_MODULE));

  future_await(local_hack_future); // 等待卸载完成

	main_thread_shut_down();         // 主线程停止任务调度


 // 内存释放:GATT/SDP/L2CAP/BTM
 // 完全释放底层协议分配的资源和内存
  module_clean_up(get_local_module(BTE_LOGMSG_MODULE));  // 日志系统清理
	gatt_free();
	sdp_free();
	l2c_free();
	get_btm_client_interface().lifecycle.btm_ble_free();   // BLE BTM 释放

  LOG_INFO("%s Gd shim module disabled", __func__);
  // 关闭 GD 模块,恢复 Idle 状态
  
  module_shut_down(get_local_module(GD_SHIM_MODULE));  // GD 模块关闭
	get_btm_client_interface().lifecycle.btm_free();     // BTM 模块释放
	module_start_up(get_local_module(GD_IDLE_MODULE));   // 回归 idle 模块状态

 // 通知 JNI:蓝牙栈已关闭
 // 通知 Android Framework,**蓝牙状态 = 已关闭**
  hack_future = future_new();
  do_in_jni_thread(FROM_HERE, base::Bind(event_signal_stack_down, nullptr));
  future_await(hack_future);
  LOG_INFO("%s finished", __func__);
}
步骤动作
异步清理 BLE 功能模块多播、扫描器
清理 Profile 服务socket、PAN
停止设备管理任务bta_dm_disable
关闭主线程清理主事件调度系统
清除协议栈内存gatt, sdp, l2cap 等
切换模块状态GD_SHIM → GD_IDLE
通知 Android 上层蓝牙栈关闭完成
  • 停用所有模块(reverse 顺序)

    • 先断开 Profile(如 A2DP、HFP)

    • 再停 HCI、BTIF、Main、Gki、Shim 等

  • 设置 HAL 状态为 BT_STATE_OFF

  • 回调通知上层 “蓝牙已关闭”

举例:你点关蓝牙,会先触发这个阶段


4. event_clean_up_stack

触发时机shut_down_stack() 执行完后触发

``event_clean_up_stack() 做的事:

static void event_clean_up_stack(std::promise<void> promise) {
  if (!stack_is_initialized) {
    LOG_INFO("%s found the stack already in a clean state", __func__);
    goto cleanup;
  }

  ensure_stack_is_not_running();

  LOG_INFO("%s is cleaning up the stack", __func__);
  stack_is_initialized = false;

  btif_cleanup_bluetooth();

  module_clean_up(get_local_module(STACK_CONFIG_MODULE));
  module_clean_up(get_local_module(INTEROP_MODULE));

  module_clean_up(get_local_module(BTIF_CONFIG_MODULE));
  module_clean_up(get_local_module(BT_UTILS_MODULE));
  module_clean_up(get_local_module(OSI_MODULE));
  module_shut_down(get_local_module(GD_IDLE_MODULE));
  module_management_stop();
  LOG_INFO("%s finished", __func__);

cleanup:;
  promise.set_value();
}
  • 完全清理模块管理器 module_clean_up(get_module_manager())

  • 释放 alarm、timer、logging 等资源

  • 蓝牙模块生命周期彻底结束,等待下一次 init

举例:系统重启中、蓝牙长时间不用需要彻底释放资源

1.3 Bluetooth Stack 生命周期概览

阶段关键函数功能核心动作
初始化event_init_stack()准备 Stack 的基本模块初始化模块、配置、btif_init_bluetooth()
启动event_start_up_stack()启动完整蓝牙协议栈启动 L2CAP/GATT/A2DP 等,初始化 BTM、BTA
关闭event_shut_down_stack()停止蓝牙协议栈停止 BTA、释放协议栈模块
清理event_clean_up_stack()完全清理所有模块清除 BTIF/UTILS/OSI 模块,停止管理器

event_init_stack()

  • 触发时机bt_interface_t.init() 时,Bluetooth HAL 初始化蓝牙栈。

  • 作用:初始化蓝牙相关基础模块。

  • 关键逻辑

    • 检查是否已初始化(stack_is_initialized

    • 启动模块管理器

    • 初始化:OSI_MODULE, BT_UTILS_MODULE, INTEROP_MODULE, STACK_CONFIG_MODULE

    • 初始化蓝牙框架层:btif_init_bluetooth(), bte_main_init()

    • 设置标志:stack_is_initialized = true


event_start_up_stack()

  • 作用:启动所有核心蓝牙协议。

  • 关键逻辑

    • 启动 BTIF_CONFIG 模块、关闭 GD_IDLE 模块,初始化 BLE 和 GATT 协议等

    • 启动协议层模块:L2CAP、RFCOMM、A2DP、HID、GAP、AVRCP、BNEP、PAN 等

    • 启动 BTA(Bluetooth Application layer)

    • 通知 JNI 层:event_signal_stack_up


event_shut_down_stack()

  • 作用:优雅地关闭所有协议模块,释放资源。

  • 关键逻辑

    • 调用 cleanup 方法:btif_dm_on_disable, btif_sock_cleanup

    • 关闭:BTA、GATT、L2CAP、GAP、BNEP、SHIM、BTM

    • 通知 JNI:event_signal_stack_down


event_clean_up_stack()

  • 作用:彻底清理蓝牙栈模块和资源。

  • 关键逻辑

    • 只有在 stack_is_initialized 为 true 且 stack 已停止时执行

    • 清理:BTIF_CONFIG, INTEROP, STACK_CONFIG, OSI, BT_UTILS

    • 停止模块管理器

相关文章:

  • 告别运动控制不同步:某车企用异构PLC实现99.98%焊接合格率
  • VMware Fusion Pro 13 for Mac虚拟机软件
  • LabVIEW运动控制(三):EtherCAT运动控制器的高效加工指令自定义封装
  • 滤波器:模拟滤波器和数字滤波器的区别
  • 【嵌入式系统设计师】知识点:第9章 嵌入式系统安全性基础知识
  • Chrome 浏览器插件收录
  • 10:00开始面试,10:08就出来了,问的问题有点变态。。。
  • QML面试笔记--UI设计篇06信息展示控件
  • 在shell脚本中,$@和$#的区别与联系
  • 【Python中读取并显示遥感影像】
  • 数据库基线检查-MongoBD/Kingbaser人大金仓/Oracel/PostgreSQL/Mysql安全加固
  • 【C++】Stack Queue 仿函数
  • linux下MMC_TEST的使用
  • skynet.rawcall使用详解及应用场景
  • jspm会计凭证自动录入预处理系统(源码+lw+部署文档+讲解),源码可白嫖!
  • mindie1.0新特性及调试问题总结
  • 鸿蒙app开发中Emitter 订阅器
  • Reactive编程框架与工具
  • Java 集合介绍
  • Linux--文件系统
  • 2025年度上海市住房城乡建设管理委工程系列中级职称评审工作启动
  • 央行谈MLF:逐步退出政策利率属性回归流动性投放工具
  • 梅花奖在上海|第六代“杨子荣”是怎样炼成的?
  • 大风暴雨致湖南岳阳县6户房屋倒塌、100多户受损
  • “救护车”转运病人半路加价,从宝鸡到西安往返都要多收钱
  • 复旦设立新文科发展基金,校友曹国伟、王长田联合捐赠1亿元