Bluedroid 블루투스 스택 활성화 과정 심층 분석

Bluedroid 활성화 프로세스 개요

Bluedroid 블루투스 스택의 활성화 과정은 enable() 함수 호출로 시작됩니다. 핵심 단계는 다음과 같습니다:

  • 인터페이스 준비 검증: enable()은 interface_ready()로 하드웨어/소프트웨어 인터페이스 상태를 확인합니다
  • 비동기 스택 시작: start_up_stack_async()를 통해 블루투스 스택을 비차단 방식으로 시작합니다
  • 프로토콜 모듈 초기화: BTM, L2CAP, GATT, SDP 등 핵심 프로토콜을 순차적으로 초기화합니다
  • 하드웨어 바인딩: GD_CONTROLLER_MODULE을 통해 물리적 하드웨어와 상호작용합니다
  • 상태 동기화: future_await로 하드웨어 준비를 보장하고 JNI 스레드에 상태 변경을 알립니다

소스 코드 구현 분석

enable() 함수

static int activate_bluetooth() {
  if (!verify_interface()) return BT_STATUS_NOT_READY;
  
  get_stack_manager()->launch_stack_async(
      create_profile_interface(), &init_profiles, &deinit_profiles);
  return BT_STATUS_SUCCESS;
}

인터페이스 검증 후 비동기 방식으로 스택 실행을 시작합니다. 프로파일 초기화/종료 콜백을 등록합니다.

스택 시작 실행 함수

static void execute_stack_launch(CoreInterface* core_iface,
                                ProfileInitCallback init_profiles,
                                ProfileDeinitCallback deinit_profiles) {
  if (stack_active) return;
  
  initialize_stack_environment(core_iface);
  future_t* wait_future = future_new();
  
  get_btm().lifecycle.btm_initialize();
  module_activate(CONFIG_MODULE);
  l2cap_setup();
  sdp_setup();
  gatt_setup();
  SMP_Initialize(get_btm().security.get_mode());
  get_btm().lifecycle.btm_ble_initialize();
  RFCOMM_Setup();
  GAP_Setup();
  
  init_profiles();
  
  bta_system_init();
  module_init(LOG_MODULE);
  btif_initialization_complete();
  device_manager_init();
  device_manager_enable(security_cb, acl_cb);
  
  btm_acl_reset();
  CHECK(module_activate(CONTROLLER_MODULE));
  BTM_controller_ready();
  device_manager_hw_on();
  
  if (future_await(wait_future) != SUCCESS) {
    stack_active = true;
    shutdown_stack(deinit_profiles);
    return;
  }
  
  module_activate(RUST_MODULE);
  stack_active = true;
  run_in_jni_thread(signal_stack_ready, nullptr);
}

스택 초기화의 핵심 단계:

  1. 중복 실행 방지를 위한 상태 확인
  2. 스택 환경 초기화 및 비동기 대기 객체 생성
  3. BTM, L2CAP, GATT 등 프로토콜 계층 초기화
  4. 상위 프로파일 초기화 콜백 실행
  5. 컨트롤러 모듈 활성화 및 하드웨어 동기화
  6. 오류 발생 시 자원 정리

스택 상태 신호 함수

static void signal_stack_ready(void* context) {
  process_pending_connections();
  get_profile_interface()->events->notify_state_change(BT_STATE_ON);
}

JNI 스레드에서 실행되며 보류 중인 연결을 처리하고 어댑터 상태 변경을 상위 계층에 알립니다.

계층별 아키텍처

  • 프로토콜 계층: BTM, L2CAP - 하드웨어 추상화 담당
  • 응용 계층: BTA - 장치 관리 등 상위 기능 제공
  • 인터페이스 계층: BTIF - Android 프레임워크 연동

태그: Bluedroid Android BTM L2CAP GATT

6월 1일 17:01에 게시됨