安卓系統中藍牙服務層的初始化流程分析

安卓系統中藍牙服務層的初始化流程分析

在這裏插入圖片描述
藍牙系統依賴於安卓,從上到下,層次分明。本篇文章我們就來簡單分析下藍牙服務層初始化的相關流程。

首先來了解下安卓系統中的藍牙模塊大致分爲以下幾部分:
在這裏插入圖片描述
對安卓系統啓動時序有大概瞭解的小夥伴想必都知道藍牙服務的管理對象BluetoothManagerService會在系統SystemServer啓動過程中被初始化,處於系統進程中運行,然後在系統啓動的不同階段執行不同的操作。

因此藍牙系統初始化的觸發時機主要有如下兩種:

  1. 藍牙服務管理在PHASE_ACTIVITY_MANAGER_READY的啓動階段,根據Settings中的藍牙關機前的狀態,如果不是關閉狀態,則自動打開藍牙。
  2. 第三方應用通過藍牙適配器BluetoothAdapter主動打開藍牙。

但不管哪種觸發方式,對藍牙服務來說,執行的流程都是一致的,接下來我們主要分析下服務層的初始化流程,首先參考如下時序圖:
在這裏插入圖片描述
上面的時序圖中有以下幾點需要重點說明:

1、黃色標註的圖框表示BluetoothManagerService中bind藍牙服務的調用,由於其綁定的是IBluetooth.class.getName(),那根據Bluetooth.apk的清單文件:packages\apps\Bluetooth\AndroidManifest.xml可以知道其要去綁定的服務爲AdapterService
在這裏插入圖片描述
2、啓動com.android.bluetooth服務進程時,會首先實例化AdapterApp並加載藍牙JNI的so庫。

3、綠色標註的框圖代表加載系統中支持的藍牙協議,根據配置文件config.xml中各個協議字段的布爾值來決定。由於藍牙協議分爲Server和Client兩部分,所以安卓系統中也會根據當前系統的使用場景來配置相應的協議:

  • 手機(Server),配置路徑A: packages\apps\Bluetooth\res\values\config.xml

  • 藍牙耳機、車載等設備(Client),配置路徑B:packages\services\Car\car_product\overlay\packages\apps\Bluetooth\res\values\config.xml

實際商用的安卓系統中可能還有廠商自己添加的配置文件,這時藍牙協議是否加載就是這幾份文件共同作用的結果了。

我這裏使用高通的安卓源碼來簡單舉例,高通自己還在如下路徑下也配置了藍牙協議字段,配置路徑C
device\qcom\common\product\overlay\packages\apps\Bluetooth\res\values\config.xml

所以對於手機這類設備的安卓系統中藍牙協議配置就是A+C共同作用的結果,而對於車載設備的安卓系統中藍牙協議配置則是A+B+C共同作用的結果。

這三個路徑下藍牙協議的具體配置如下幾個截圖所示。
路徑A

在這裏插入圖片描述

路徑B

在這裏插入圖片描述

路徑C
在這裏插入圖片描述

這三個路徑的優先級有如下規則參考:

  • 對於手機設備:A<C
  • 對於車載藍牙設備:A<B<C

即對於某個協議來說,安卓藍牙系統中是否配置該協議最終以高優先級的藍牙協議配置文件中的配置值爲準,如果高優先級的配置文件中沒有該協議字段,則以低優先級的配置文件中的配置值爲準,以此類推,直到該藍牙協議對應的字段有明確的定義爲止。

因此在高通的車載安卓系統中結合上述三份配置文件可以得出支持的藍牙協議有如下幾種:

  • profile_supported_a2dp_sink(true)—A2dpSinkService
  • profile_supported_pan(true)—PanService
  • profile_supported_gatt(true)—GattService
  • profile_supported_hfpclient(true)—HeadsetClientService
  • profile_supported_avrcp_target(true)—AvrcpTargetService
  • profile_supported_avrcp_controller(true)—AvrcpControllerService
  • profile_supported_sap(true)—SapService
  • profile_supported_pbapclient(true)—PbapClientService
  • profile_supported_mapmce(true)—MapClientService
  • profile_supported_opp(true)—BluetoothOppService

藍牙服務層Config.java加載支持的藍牙協議見log截圖:
在這裏插入圖片描述

上述三點簡單做出說明後,藍牙服務及協議棧初始化完成,通過onBind()將藍牙服務層的IBinder對象返回給BluetoothManagerService繼續執行接下來使能藍牙enable的流程。

本篇藍牙服務層的初始化就簡單分析到這兒,後面會繼續分析藍牙相關模塊的流程,對藍牙技術感興趣的小夥伴別忘了關注一波哦,精彩內容持續更新中,也歡迎私信留言一起討論。

更多互聯互通技術,歡迎關注微信公衆號:Connectivity
在這裏插入圖片描述

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