HIDL 是以介面為基礎建構而成,而介面是物件導向使用的抽象類型 定義行為每個介面都是套件的一部分。
套件
套件名稱可以包含子層級,例如 package.subpackage
。
已發布 HIDL 套件的根目錄為 hardware/interfaces
或 vendor/vendorName
(例如 Pixel 的 vendor/google
裝置)。套件名稱會在根目錄下形成一或多個子目錄
directory;所有定義套件的檔案都位於同一個目錄中。例如:
找到 package android.hardware.example.extension.light@2.0
低於 hardware/interfaces/example/extension/light/2.0
。
下表列出套件前置字串和位置:
套件前置字串 | 位置 | 介面類型 |
---|---|---|
android.hardware.* |
hardware/interfaces/* |
HAL |
android.frameworks.* |
frameworks/hardware/interfaces/* |
架構/ 相關 |
android.system.* |
system/hardware/interfaces/* |
系統/ 相關 |
android.hidl.* |
system/libhidl/transport/* |
Core |
套件目錄包含副檔名為 .hal
的檔案。每次
檔案必須包含命名套件的 package
陳述式,以及
所屬版本types.hal
檔案 (如有)
不會定義介面,而是定義每個 Pod 可存取的資料類型
套件中的介面
介面定義
除了 types.hal
以外,其他每個 .hal
檔案都會定義
存取 API介面通常定義如下:
interface IBar extends IFoo { // IFoo is another interface // embedded types struct MyStruct {/*...*/}; // interface methods create(int32_t id) generates (MyStruct s); close(); };
未以隱含方式明確宣告 extends
的介面
從 android.hidl.base@1.0::IBase
延伸 (類似
Java 中的 java.lang.Object
)。IBase 介面,以隱含方式
匯入,則宣告幾個不應和不可以的保留方法
在使用者定義的介面中重新宣告,在其他情況下則使用。這些方法
包括:
ping
interfaceChain
interfaceDescriptor
notifySyspropsChanged
linkToDeath
unlinkToDeath
setHALInstrumentation
getDebugInfo
debug
getHashChain
匯入程序
import
陳述式是存取套件的 HIDL 機制
存取另一個套件中的介面和型別import
陳述式
提出疑慮
- 匯入 ing 實體,可以是套件或 介面
- 匯入的實體,可以是套件或 介面
匯入實體是依據
import
陳述式。當陳述式位於套件的
types.hal
,整個套件都能看到正在匯入的內容;
這就是套件層級匯入作業。如果陳述出現在
介面檔案,匯入實體即為介面本身;這是
interface-level 匯入。
匯入的實體是由 import
後方的值決定
字詞。值不必是完整名稱;如果有元件是
省略時,它會自動填入目前套件中的資訊。
若為完整值,支援下列匯入案例:
- 完整套件匯入作業。如果值為套件名稱和 版本 (語法如下所述),則整個套件會匯入至 正在匯入實體。
- 部分匯入。如果值為:
- 介面、套件的
types.hal
和該介面 匯入實體 types.hal
中定義的 UDT,之後只有 UDT 會匯入到 匯入實體 (types.hal
中的其他類型不會匯入)。
- 介面、套件的
- 僅限類型匯入。如果值使用
上述部分匯入,但改用關鍵字
types
只有指定介面types.hal
中的 UDT 套件即會匯入。
匯入實體可以存取下列組合:
- 匯入套件的通用 UDT (在
types.hal
中定義的); - 匯入的套件介面 (用於整個套件匯入作業) 或指定 介面 (用於部分匯入),以便叫用這類介面 及/或沿用這類設定
匯入陳述式會使用完整的類型名稱語法來提供 所匯入套件或介面的名稱和版本:
import android.hardware.nfc@1.0; // import a whole package import android.hardware.example@1.0::IQuux; // import an interface and types.hal import android.hardware.example@1.0::types; // import just types.hal
介面繼承
介面可以是先前定義的介面的擴充功能。 擴充功能分為以下三種類型:
- 介面可整合 API 的功能,為另一個介面新增功能 不變。
- 套件可結合其 API 為另一個套件新增功能 不變。
- 介面可從套件或特定介面匯入類型。
一個介面只能擴充另一個介面 (無法擴充另一個介面)。
在包含非零子版本號碼的套件中,每個介面都必須擴充
啟用舊版套件介面舉例來說
derivative
套件 4.0 版的 IBar
會根據
(擴充) 套件 1.2 版本中的介面 IFoo
original
,original
套件的 1.3 版為
已建立,IBar
4.1 版無法擴充 1.3 版
IFoo
。相反地,IBar
4.1 版必須擴充
IBar
4.0 版,與 IFoo
1.2 版相連結。
IBar
5.0 版可擴充 IFoo
1.3 版,如有
介面擴充功能不會暗示程式庫具有依附性或跨 HAL 包含 ,直接匯入資料結構和方法 也就是 HIDL 層級的定義HAL 中的每個方法都必須在當中實作 HAL。
供應商額外資訊
在某些情況下,供應商擴充功能會以 代表其所擴充核心介面的基本物件。同一個物件 註冊使用基礎 HAL 名稱和版本,並在擴充功能的 (供應商) HAL 名稱和版本。
版本管理
套件有版本管理,且介麵包含其套件的版本。 版本是以兩個整數表示,「主要」.「次要」。
- 「主要」版本不具有回溯相容性。遞增 主要版本號碼會將子版本號碼重設為 0。
- 次要版本具有回溯相容性。遞增 次要編號代表新版本與 較舊版本您可以新增新的資料結構和方法,但不能新增 資料結構或方法簽章可能會變更。
HAL 可以同時出現在裝置上 。不過,應優先選擇次要版本,而非主要版本 因為用戶端程式碼適用於先前的子版本介面 也適用於相同介面的後續次要版本如要 有關版本管理和廠商擴充功能的詳細資訊,請參閱 HIDL 版本管理。
介面版面配置摘要
本節概述如何管理 HIDL 介面套件 (例如
hardware/interfaces
),並整合畫面中的資訊
在整個 HIDL 部分中變更閱讀前,請確認您已熟悉
HIDL 版本管理
雜湊
hidl-gen 概念和互動細節
HIDL 的一般概念,以及下列定義:
字詞 | 定義 |
---|---|
應用程式二進位檔介面 (ABI) | 應用程式設計介面加上任何所需的二進位檔連結。 |
完整名稱 (fqName) | 用於區分 Hidl 類型的名稱。範例:
android.hardware.foo@1.0::IFoo 。 |
包裹 | 含有 HIDL 介面和類型的套件。範例:
android.hardware.foo@1.0 。 |
套件根目錄 | 包含 HIDL 介面的根套件。範例:HIDL 介面
android.hardware 位於套件根目錄中
android.hardware.foo@1.0 。 |
套件根路徑 | Android 來源樹狀結構中與套件根對應關係的位置。 |
如需更多定義,請參閱 HIDL 術語。
您可以透過套件根對應和 完整名稱
將套件根目錄指定為 hidl-gen
做為引數
-r android.hardware:hardware/interfaces
。舉例來說,
套件為 vendor.awesome.foo@1.0::IFoo
和 hidl-gen
已傳送 -r vendor.awesome:some/device/independent/path/interfaces
,
則介面檔案應該位於
$ANDROID_BUILD_TOP/some/device/independent/path/interfaces/foo/1.0/IFoo.hal
。
實務上,建議使用名為「awesome
」的供應商或原始設備製造商 (OEM)
在 vendor.awesome
中加入標準介面包裹之後
選取路徑,請勿變更,因為這個架構已烘焙到
存取 API
套件路徑對應不得重複
舉例來說,如果您有 -rsome.package:$PATH_A
和
-rsome.package:$PATH_B
,$PATH_A
必須等於
$PATH_B
用於一致的介面目錄 (這也會
版本管理
)。
套件根目錄必須具備版本管理檔案
如果您要建立
-r vendor.awesome:vendor/awesome/interfaces
,你也應該
建立檔案
$ANDROID_BUILD_TOP/vendor/awesome/interfaces/current.txt
,需要
應包含使用 -Lhash
選項產生的介面雜湊
hidl-gen
(我們會在
雜湊
hidl-gen)。
介面獨立於裝置間 地點
在實務上,我們建議在分支版本之間共用介面。這個 允許多次重複使用程式碼,並針對不同的 裝置和用途