除了少數例外,HIDL 介面套件位於
hardware/interfaces
或 vendor/
目錄。
hardware/interfaces
頂層地圖到
android.hardware
套件命名空間;版本是子目錄
放在套件 (而非介面) 命名空間底下。
hidl-gen
編譯器會將 .hal
檔案編譯成
一組 .h
和 .cpp
檔案。來自這些自動產生的內容
建立供用戶端/伺服器實作連結的共用程式庫。
建立這個共用資料庫的 Android.bp
檔案是
由 hardware/interfaces/update-makefiles.sh
自動產生
指令碼每當您在 hardware/interfaces
中新增套件時,或者
在現有套件新增/移除 .hal
檔案,您必須重新執行
指令碼,確保產生的共用資料庫是最新版本。
舉例來說,IFoo.hal
範例檔案應位於
hardware/interfaces/samples/1.0
。範例
IFoo.hal
檔案會在
samples 套件:
package android.hardware.samples@1.0; interface IFoo { struct Foo { int64_t someValue; handle myHandle; }; someMethod() generates (vec<uint32_t>); anotherMethod(Foo foo) generates (int32_t ret); };
產生的檔案
HIDL 套件中自動產生的檔案會連結至單一共用
與套件同名的程式庫 (例如
android.hardware.samples@1.0
)。共用資料庫也會匯出
單一標頭 IFoo.h
,可由用戶端和
伺服器搭配 IFoo.hal
使用 hidl-gen
編譯器
繫結化模式已自動產生下列
檔案:
圖 1. 編譯器產生的檔案。
IFoo.h
。說明純IFoo
C++ 類別中的方法;這個註解包含IFoo.hal
檔案中的IFoo
介面,轉譯為 C++ 並視需要顯示。不包含與 用於實作此介面的 RPC 機制 (例如HwBinder
)。 類別為具有套件和版本的命名空間,例如::android::hardware::samples::IFoo::V1_0
。用戶端和伺服器 包含此標頭: 可在其和伺服器上呼叫方法的用戶端 實作這些方法IHwFoo.h
。包含以下內容的標頭檔案 宣告的函式。 開發人員不得直接加入標題 (未包含 類別)。BpHwFoo.h
。繼承IFoo
並說明HwBinder
Proxy (用戶端) 介面的實作。開發人員絕對不應參照此類別BnHwFoo.h
。包含 類別 參照IFoo
實作並描述HwBinder
介面的虛設常式 (伺服器端) 實作。 開發人員不應直接參照這個類別。FooAll.cpp
。類別,其中包含HwBinder
Proxy 和HwBinder
虛設常式。當用戶端呼叫介面方法時,Proxy 自動拼湊用戶端的引數,並傳送交易 繫結至繫結器核心驅動程式,這個元件會將交易傳送至 另一端 (接著呼叫實際的伺服器實作)。
這些檔案的結構與
aidl-cpp
(詳情請參閱「直通模式」
HIDL 總覽)。只有
自動產生的檔案 (與 HIDL 使用的遠端程序呼叫 (RPC) 機制無關)
IFoo.h
;所有其他檔案都繫結至於所用 HwBinder RPC 機制
也就是 HIDL。因此,用戶端和伺服器實作一律不應
直接參照 IFoo
以外的任何內容。為了達成
請只加入 IFoo.h
,並連結至生成的共用資源
資源庫。
共用資料庫的連結
若用戶端或伺服器使用套件中的任何介面,就必須包含 該套件的共用程式庫位於以下一 (1) 內 地區:
- 在 Android.mk 中:
LOCAL_SHARED_LIBRARIES += android.hardware.samples@1.0
- 在 Android.bp 中:
shared_libs: [ /* ... */ "android.hardware.samples@1.0", ],
可能需要加入的其他程式庫:
libhidlbase |
包含標準 HIDL 資料類型。在 Android 裝置上開始行動
10,這也包含先前
「libhidltransport 」和
libhwbinder 。
|
---|---|
libhidltransport |
處理透過不同 RPC/IPC 機制的 HIDL 呼叫傳輸。 Android 10 已淘汰這個程式庫。 |
libhwbinder |
繫結機制專屬符號。Android 10 這個程式庫就會淘汰 |
libfmq |
快速訊息佇列處理序間通訊 (IPC)。 |
命名空間
HIDL 函式和類型,例如 Return<T>
和
Void()
已在命名空間「::android::hardware
」中宣告。
套件的 C++ 命名空間取決於套件名稱和版本。
例如:1.2 以下版本的套件 mypackage:
hardware/interfaces
具有下列特質:
- C++ 命名空間是
::android::hardware::mypackage::V1_2
- 這裡有
IMyInterface
的完整名稱 套件為:::android::hardware::mypackage::V1_2::IMyInterface
。 (IMyInterface
是 ID,不是命名空間的一部分)。 - 套件的
types.hal
檔案中定義的類型 會識別為:::android::hardware::mypackage::V1_2::MyPackageType