【android bluetooth 框架分析 04】【bt-framework 層詳解 5】【AbstractionLayer介紹】

1. AbstractionLayer 介紹

我們在閱讀 native 和 java 層 藍牙服務代碼時,會發現很多 AbstractionLayer.xxxxx 的字段。 這些字段 雖然很容易理解是干什么的。 但是 大家有沒有考慮過, 為啥要專門定義一個類來存放他們。 這樣設計的意義是什么?

1.字段解釋

  • packages/modules/Bluetooth/android/app/src/com/android/bluetooth/btservice/AbstractionLayer.java

package com.android.bluetooth.btservice;/** @hide*/public final class AbstractionLayer {// Do not modify without upating the HAL files.// TODO: Some of the constants are repeated from BluetoothAdapter.java.// Get rid of them and maintain just one.static final int BT_STATE_OFF = 0x00;static final int BT_STATE_ON = 0x01;static final int BT_SCAN_MODE_NONE = 0x00;static final int BT_SCAN_MODE_CONNECTABLE = 0x01;static final int BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE = 0x02;static final int BT_PROPERTY_BDNAME = 0x01;static final int BT_PROPERTY_BDADDR = 0x02;static final int BT_PROPERTY_UUIDS = 0x03;static final int BT_PROPERTY_CLASS_OF_DEVICE = 0x04;static final int BT_PROPERTY_TYPE_OF_DEVICE = 0x05;static final int BT_PROPERTY_SERVICE_RECORD = 0x06;static final int BT_PROPERTY_ADAPTER_SCAN_MODE = 0x07;static final int BT_PROPERTY_ADAPTER_BONDED_DEVICES = 0x08;static final int BT_PROPERTY_ADAPTER_DISCOVERABLE_TIMEOUT = 0x09;static final int BT_PROPERTY_REMOTE_FRIENDLY_NAME = 0x0A;static final int BT_PROPERTY_REMOTE_RSSI = 0x0B;static final int BT_PROPERTY_REMOTE_VERSION_INFO = 0x0C;static final int BT_PROPERTY_LOCAL_LE_FEATURES = 0x0D;static final int BT_PROPERTY_DYNAMIC_AUDIO_BUFFER = 0x10;static final int BT_PROPERTY_REMOTE_IS_COORDINATED_SET_MEMBER = 0x11;public static final int BT_DEVICE_TYPE_BREDR = 0x01;public static final int BT_DEVICE_TYPE_BLE = 0x02;public static final int BT_DEVICE_TYPE_DUAL = 0x03;static final int BT_PROPERTY_LOCAL_IO_CAPS = 0x0e;static final int BT_PROPERTY_LOCAL_IO_CAPS_BLE = 0x0f;static final int BT_BOND_STATE_NONE = 0x00;static final int BT_BOND_STATE_BONDING = 0x01;static final int BT_BOND_STATE_BONDED = 0x02;static final int BT_SSP_VARIANT_PASSKEY_CONFIRMATION = 0x00;static final int BT_SSP_VARIANT_PASSKEY_ENTRY = 0x01;static final int BT_SSP_VARIANT_CONSENT = 0x02;static final int BT_SSP_VARIANT_PASSKEY_NOTIFICATION = 0x03;static final int BT_DISCOVERY_STOPPED = 0x00;static final int BT_DISCOVERY_STARTED = 0x01;static final int BT_ACL_STATE_CONNECTED = 0x00;static final int BT_ACL_STATE_DISCONNECTED = 0x01;static final int BT_UUID_SIZE = 16; // bytespublic static final int BT_STATUS_SUCCESS = 0;public static final int BT_STATUS_FAIL = 1;public static final int BT_STATUS_NOT_READY = 2;public static final int BT_STATUS_NOMEM = 3;public static final int BT_STATUS_BUSY = 4;public static final int BT_STATUS_DONE = 5;public static final int BT_STATUS_UNSUPPORTED = 6;public static final int BT_STATUS_PARM_INVALID = 7;public static final int BT_STATUS_UNHANDLED = 8;public static final int BT_STATUS_AUTH_FAILURE = 9;public static final int BT_STATUS_RMT_DEV_DOWN = 10;public static final int BT_STATUS_AUTH_REJECTED = 11;public static final int BT_STATUS_AUTH_TIMEOUT = 12;
}

這段代碼 用于定義藍牙 HAL 與上層服務之間的通用常量(狀態、屬性、錯誤碼等)。這些常量的設計目的是提供一個統一的“抽象層接口”,便于 Bluetooth HAL(C/C++ 層)與 Java 層進行交互時傳遞標準化信息。

下面用表格的方式對這些常量的用途和適用場景進行整理說明:

類別常量名數值含義/用途說明使用場景示例
藍牙狀態BT_STATE_OFF0x00藍牙關閉狀態通知 Java 層當前藍牙關閉
BT_STATE_ON0x01藍牙開啟狀態通知 Java 層當前藍牙開啟
掃描模式BT_SCAN_MODE_NONE0x00不可連接也不可被發現設置藍牙掃描策略時
BT_SCAN_MODE_CONNECTABLE0x01可被連接但不可被發現廣播連接狀態變化
BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE0x02可被連接也可被發現配對時開啟可發現
屬性類型BT_PROPERTY_BDNAME0x01本地設備名稱設置/獲取本地藍牙名稱
BT_PROPERTY_BDADDR0x02本地設備地址獲取本地地址
BT_PROPERTY_UUIDS0x03支持的服務 UUID 列表SDP 結果上報
BT_PROPERTY_CLASS_OF_DEVICE0x04設備類型編碼配對時判斷設備類別
BT_PROPERTY_TYPE_OF_DEVICE0x05藍牙設備類型(BR/EDR、BLE、Dual)設置設備屬性時
BT_PROPERTY_SERVICE_RECORD0x06遠端設備服務記錄(SDP)服務搜索時返回
BT_PROPERTY_ADAPTER_SCAN_MODE0x07當前掃描模式獲取當前適配器屬性
BT_PROPERTY_ADAPTER_BONDED_DEVICES0x08獲取已配對設備列表啟動時獲取已配對設備
BT_PROPERTY_ADAPTER_DISCOVERABLE_TIMEOUT0x09可被發現模式的超時時長設置發現超時
BT_PROPERTY_REMOTE_FRIENDLY_NAME0x0A遠程設備名稱獲取遠端名稱
BT_PROPERTY_REMOTE_RSSI0x0B遠程設備信號強度BLE 掃描中上報
BT_PROPERTY_REMOTE_VERSION_INFO0x0C協議版本號(HCI/LMP)配對成功后回調
BT_PROPERTY_LOCAL_LE_FEATURES0x0D本地 LE 特性初始化時上報
BT_PROPERTY_DYNAMIC_AUDIO_BUFFER0x10音頻緩沖設置Audio streaming 配置
BT_PROPERTY_REMOTE_IS_COORDINATED_SET_MEMBER0x11是否為協調播放組成員(如多設備音頻)LE Audio 使用
設備類型BT_DEVICE_TYPE_BREDR0x01傳統藍牙設備設置設備屬性
BT_DEVICE_TYPE_BLE0x02低功耗藍牙設備BLE 配對等場景
BT_DEVICE_TYPE_DUAL0x03同時支持 BR/EDR 與 BLE 的雙模設備常見手機
本地 I/O 能力BT_PROPERTY_LOCAL_IO_CAPS0x0e本地 IO 能力(配對時使用)SSP 配對時
BT_PROPERTY_LOCAL_IO_CAPS_BLE0x0f本地 BLE IO 能力BLE 設備配對時
配對狀態BT_BOND_STATE_NONE0x00未配對配對流程中狀態變化
BT_BOND_STATE_BONDING0x01正在配對顯示進度
BT_BOND_STATE_BONDED0x02配對完成保存設備記錄
SSP 配對類型BT_SSP_VARIANT_PASSKEY_CONFIRMATION0x00確認配對碼人機交互確認界面
BT_SSP_VARIANT_PASSKEY_ENTRY0x01輸入配對碼輸入框場景
BT_SSP_VARIANT_CONSENT0x02用戶授權同意彈窗授權
BT_SSP_VARIANT_PASSKEY_NOTIFICATION0x03顯示配對碼顯示數字碼
發現流程狀態BT_DISCOVERY_STOPPED0x00發現已停止搜索過程
BT_DISCOVERY_STARTED0x01發現已開始搜索開始時廣播
ACL 鏈接狀態BT_ACL_STATE_CONNECTED0x00ACL 已連接ACL 連接建立后通知
BT_ACL_STATE_DISCONNECTED0x01ACL 已斷開ACL 斷開后通知
UUID 尺寸BT_UUID_SIZE16UUID 長度為 16 字節(128 bit)UUID 檢查或轉換時使用
狀態碼(返回值)BT_STATUS_SUCCESS0操作成功HAL 接口返回
BT_STATUS_FAIL1操作失敗錯誤處理
BT_STATUS_NOT_READY2適配器未準備好藍牙未初始化時返回
BT_STATUS_NOMEM3內存不足動態分配失敗
BT_STATUS_BUSY4當前操作繁忙多任務沖突時
BT_STATUS_DONE5操作已完成異步操作結束
BT_STATUS_UNSUPPORTED6不支持的功能某些設備不支持特性
BT_STATUS_PARM_INVALID7參數無效參數檢查失敗
BT_STATUS_UNHANDLED8沒有處理該情況框架遺漏處理邏輯
BT_STATUS_AUTH_FAILURE9認證失敗配對失敗
BT_STATUS_RMT_DEV_DOWN10遠程設備斷開狀態同步失敗
BT_STATUS_AUTH_REJECTED11認證被拒絕用戶取消
BT_STATUS_AUTH_TIMEOUT12認證超時藍牙連接不響應
  • 當 HAL 層通過 JNI 通知 Java 藍牙服務狀態時,會使用這些常量進行信息編碼。

  • 例如:

    • bt_property_type 用于表示 Bluetooth HAL 上報的屬性類型;

    • BT_DISCOVERY_STARTED 會在 onDiscoveryStateChanged() 中通過廣播發送;

    • BT_STATUS_SUCCESS 是很多 native 回調函數中的返回碼,表示調用成功。

2. 設計的意義

這個 AbstractionLayer 類的設計在 AOSP 藍牙服務中提供了一個“抽象層常量集中地”,它本身不包含行為邏輯,而是定義了一批與藍牙 HAL(Hardware Abstraction Layer)通信的核心常量。這樣的設計有以下幾個 重要好處


1. 設計好處匯總表

設計目的/優勢說明
統一管理常量,避免魔法數字所有關鍵狀態、屬性、錯誤碼、設備類型等都使用命名常量,避免代碼中出現“0x03”、“0x0C”這類不可讀的“魔法數字”。
代碼可讀性提升例如 BT_STATUS_AUTH_TIMEOUT12 更清晰表達“認證超時”的語義,使維護者無需查表也能讀懂邏輯。
易于維護和擴展如果底層 HAL 接口更新(例如新增屬性),只需在這里添加新常量,其他代碼不需修改多處。
確保與 HAL 保持同步HAL 和 Java 層可能用 AIDL 或 JNI 通信,必須確保狀態碼一致;集中定義可減少錯漏風險。注釋中也明確寫道:“Do not modify without updating the HAL files”。
方便封裝抽象該類名為 AbstractionLayer,意圖明確:它作為 Bluetooth native 層與 framework 層的橋梁,封裝底層值定義,避免上層代碼直接接觸 native 細節。
跨模塊復用性強同一套常量可以在多個模塊中共享,比如 BluetoothAdapter、BluetoothService、JNI 等模塊都能引用這組常量,避免重復定義。
支持雙向通信常量可用于 Java → native 下發請求(如 scan mode 設置),也可用于 native → Java 回調(如 discovery started 通知),有助于狀態映射和協議一致性。

3. 典型使用場景

這些常量通常用于以下幾個場景:

場景舉例涉及常量
設備屬性設置與讀取讀取本地設備名、地址等BT_PROPERTY_BDNAME, BT_PROPERTY_BDADDR
狀態通知與回調藍牙開關、掃描模式變化通知BT_STATE_ON, BT_SCAN_MODE_CONNECTABLE
配對與綁定流程顯示綁定狀態或配對方式提示BT_BOND_STATE_BONDING, BT_SSP_VARIANT_PASSKEY_ENTRY
錯誤處理與狀態返回藍牙操作失敗時給上層狀態反饋BT_STATUS_FAIL, BT_STATUS_AUTH_TIMEOUT
連接狀態監控連接建立或斷開通知BT_ACL_STATE_CONNECTED, BT_ACL_STATE_DISCONNECTED
設備類型識別判斷是 BLE 還是 BR/EDR 設備BT_DEVICE_TYPE_BLE, BT_DEVICE_TYPE_DUAL

4. 總結:

AbstractionLayer 的設計是面向 HAL 與 Framework 解耦的一種“常量協議集中定義”模式,既提升了可讀性和維護性,也為不同層間通信提供了統一語言,符合 AOSP 架構的一貫風格(尤其在 HAL / JNI 層交互中非常常見)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/909192.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/909192.shtml
英文地址,請注明出處:http://en.pswp.cn/news/909192.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI大模型從0到1記錄學習 大模型技術之機器學習 day27-day60

機器學習概述 機器學習(Machine Learning, ML)主要研究計算機系統對于特定任務的性能,逐步進行改善的算法和統計模型。通過輸入海量訓練數據對模型進行訓練,使模型掌握數據所蘊含的潛在規律,進而對新輸入的數據進行準確…

c/c++ 匯編碼中的.cfi 指令有什么用途?

author: hjjdebug date: 2025年 06月 12日 星期四 14:24:40 CST descrip: c/c 匯編碼中的.cfi 指令有什么用途? 文章目錄 1. 幾個簡寫詞.2. 看一個簡單的測試代碼:3. 生成匯編代碼:4. 分析.cfi 指令5. 小結: 1. 幾個簡寫詞. cfi(call frame info) 調用幀信息, 名詞. 描述的是…

ArcGIS Pro 3.4 二次開發 - 任務

環境:ArcGIS Pro SDK 3.4 + .NET 8 文章目錄 任務1 任務1.1 檢索項目中的所有任務項1.2 打開任務文件 - .esriTasks 文件1.3 打開項目任務項1.4 關閉任務項1.5 導出任務項1.6 獲取任務信息 - 從 TaskProjectItem1.7 獲取任務信息 - 從 .esriTasks 文件1.8 在任務文件中打開特定…

vscode如何修改終端的默認配置

問題困擾: 每次打開都是 powershell, 因為每次要是用 git bash, 所以每次手動切換很麻煩。 要將默認終端設置為 Git Bash,可以通過以下步驟完成。以下是詳細的操作方法: 步驟 1:打開終端設置 在 Visual Studio Code 的菜單欄中…

kafka快速入門與知識匯總

? kafka快速入門與知識匯總 一、前言 kafka是一款消息中間件,可以用于傳輸消息和日志收集、監控項目狀況。與其類似的技術棧有rocketmq、rabbitmq等,但這些技術棧大多應用在一些簡單的消息傳輸平臺,而kafka則因其對大量數據的高性能處理在…

設計模式——觀察者設計模式(行為型)

摘要 本文詳細介紹了觀察者設計模式,包括其定義、結構、實現方式、適用場景以及實戰示例。通過代碼示例展示了如何在Spring框架下實現觀察者模式,以及如何通過該模式實現狀態變化通知。同時,對比了觀察者模式與消息中間件在設計理念、耦合程…

uniapp 頁面棧一定深度后,回首頁導航到新頁面的解決方案

uniapp 頁面棧一定深度后,回首頁導航到新頁面的解決方案 uniapp 頁面導航解決方案 在 uniapp 中,要實現先彈出頁面棧回到首頁,然后再跳轉到指定頁面。 /*** description 后臺選擇鏈接專用跳轉*/ interface Link {path: string;name?: stri…

數據結構 散列表 學習 2025年6月12日15:30:48

數據結構 散列表 哈希表(Hash Table): 通過哈希函數將鍵&#xff08;key&#xff09;映射到存儲位置&#xff0c;從而實現快速的插入、刪除和查找操作。 哈希表是現代編程中最重要的數據結構之一&#xff0c;幾乎所有編程語言都提供了內置實現。 計數 #include <stdio.h&g…

數據結構之LinkedList

系列文章目錄 數據結構之ArrayList-CSDN博客 目錄 系列文章目錄 前言 一、模擬實現鏈表 1. 遍歷鏈表 2. 插入節點 3. 刪除節點 4. 清空鏈表 二、鏈表的常見操作 1. 反轉鏈表 2. 返回鏈表的中間節點 3. 鏈表倒數第 k 個節點 4. 合并兩個有序鏈表 5. 分割鏈表 6. 判…

DC3靶機滲透

1. 靶機介紹 主要的內容有 sql 注入漏洞、joomla 框架漏洞、ssh 攻擊、shell 反彈、提權 信息收集(ip、端口、目錄、指紋信息)--->利用漏洞--->反彈---->提權 2. 信息收集 2.1. 掃描存活 ip 192.168.220.134 2.2. 端口掃描 nmap -T4 -A -p- 192.168.220.134 …

C# 線程交互

一、為什么要進行線程交互 在C#中&#xff0c;線程交互通常涉及到多個線程之間的數據共享和同步。?. 一、全局變量 在C#中&#xff0c;全局變量是指在程序的任何地方都可以訪問的變量。通常&#xff0c;全局變量是在類的外部定義的&#xff0c;或者在所有方法之外定義的。全…

Cursor 編輯器中的 Notepad 功能使用指南

Cursor 編輯器中的 Notepad 功能使用指南 摘要 本指南全面介紹了 Cursor 編輯器中的 Notepad 功能&#xff0c;涵蓋其用途、多種訪問方式、適用場景以及與其它功能的整合技巧等內容&#xff0c;助力用戶高效利用該功能提升工作流程效率。 不同訪問方式介紹 功能概述 Curso…

用于評估大語言模型(LLMs)能力的重要基準任務(Benchmark)

基準任務涵蓋了 多領域&#xff08;如語言理解、數學、推理、編程、醫學等&#xff09;和 多能力維度&#xff08;如事實檢索、計算、代碼生成、鏈式推理、多語言處理&#xff09;。常用于模型發布時的對比評測&#xff0c;例如 GPT-4、Claude、Gemini、Mistral 等模型的論文或…

力扣HOT100之技巧:169. 多數元素

這道題如果不考慮空間復雜度和時間復雜度的限制的話很好做&#xff0c;一種思路是通過一次遍歷將所有元素的數量記錄在一個哈希表中&#xff0c;然后我們直接返回出現次數最多的鍵即可。另一種思路是直接對數組進行排序&#xff0c;數組中間的值一定是多數元素&#xff0c;因為…

wordpress首頁調用指定ID頁面內的相冊

要在WordPress首頁調用ID為2的頁面中的相冊&#xff0c;你可以使用以下幾種方法&#xff1a; 方法一&#xff1a;使用短代碼和自定義查詢 首先&#xff0c;在你的主題的functions.php文件中添加以下代碼&#xff1a; function display_page_gallery($atts) {$atts shortcod…

基于深度學習的異常檢測系統:原理、實現與應用

前言 在現代數據驅動的業務環境中&#xff0c;異常檢測&#xff08;Anomaly Detection&#xff09;是一個關鍵任務&#xff0c;它能夠幫助企業和組織及時發現數據中的異常行為或事件&#xff0c;從而采取相應的措施。異常檢測廣泛應用于金融欺詐檢測、網絡安全、工業設備故障監…

Java基于BS架構的OA流程可視化實戰:從工作流引擎到前端交互(附完整源代碼+論文框架)

一、引言&#xff1a;BS架構OA系統的流程可視化需求 在企業信息化建設中&#xff0c;基于瀏覽器/服務器&#xff08;BS&#xff09;架構的OA系統通過流程自動化提升辦公效率&#xff0c;而流程可視化是實現流程監控、優化的核心模塊。本文基于Java技術棧&#xff0c;結合Activ…

JavaWeb-數據庫連接池

目錄 1.springboot默認Hikari(追光者)連接池 2.切換為Druid(德魯伊)連接池 1.springboot默認Hikari(追光者)連接池 2.切換為Druid(德魯伊)連接池 一般幾乎用不到&#xff0c;不需要切換 <!--Druid連接池--> <dependency><groupId>com.alibaba</groupId&…

c# 完成恩尼格瑪加密擴展

c# 完成恩尼格瑪加密擴展 恩尼格瑪擴展為可見字符恩尼格瑪的設備原始字符順序轉子的設置反射器的設置連接板的設置 初始數據的設置第一版 C# 代碼第二版 C# 代碼 總結 恩尼格瑪 在之前&#xff0c;我們使用 python 實現了一版恩尼格瑪的加密算法&#xff0c;但是這一版&#x…

【Redisson】鎖可重入原理

目錄 一、基本原理 二、源碼解析&#xff1a; &#xff08;2&#xff09;獲取鎖 &#xff08;1&#xff09;釋放鎖&#xff1a; 之前給大家介紹過redisson的分布式鎖&#xff0c;用redisson來實現比自己手搓簡單的分布式鎖有很多好處&#xff0c;因為這些可重入、可重試的邏…