安卓系統中藍牙協議棧的初始化流程分析

藍牙協議棧初始化流程分析

在這裏插入圖片描述

熟悉安卓系統中藍牙基本架構的同學想必對藍牙協議棧不會陌生,還不瞭解的也不必擔心,出門左轉查看我另一篇文章《安卓系統中藍牙服務層的初始化流程分析》,那篇分析裏有一幅藍牙系統在安卓中的架構圖,想來對初識藍牙的小夥伴會有很大幫助。
在這裏插入圖片描述

藍牙協議棧整體上分爲: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
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章