除了少數例外狀況,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 套件中建立 IFoo 介面:
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
,可供用戶端和伺服器納入。使用 hidl-gen
編譯器,並以 IFoo.hal
介面檔案做為輸入內容,繫結器模式會產生下列自動產生的檔案:
圖 1. 由編譯器產生的檔案。
IFoo.h
:說明 C++ 類別中的純IFoo
介面;其中包含IFoo.hal
檔案中IFoo
介面中定義的方法和類型,並視需要轉譯為 C++ 類型。不包含與用於實作此介面的 RPC 機制 (例如HwBinder
) 相關的詳細資料。這個類別的命名空間會包含套件和版本,例如::android::hardware::samples::IFoo::V1_0
。用戶端和伺服器都會加入這個標頭:用戶端用於呼叫方法,伺服器用於實作這些方法。IHwFoo.h
。標頭檔案,其中包含用於序列化介面中所用資料類型的函式宣告。開發人員絕不應直接加入標頭 (因為標頭不包含任何類別)。BpHwFoo.h
:繼承自IFoo
的類別,可說明介面的HwBinder
代理程式 (用戶端) 實作方式。開發人員不應直接參照此類別。BnHwFoo.h
:這個類別會保留IFoo
實作的參照,並說明介面的HwBinder
存根 (伺服器端) 實作。開發人員不應直接參照這個類別。FooAll.cpp
:包含HwBinder
代理程式和HwBinder
輔助程式的實作項目的類別。當用戶端呼叫介面方法時,Proxy 會自動對齊用戶端的引數,並將交易傳送至 Binder 核心驅動程式,後者會將交易傳送至另一端的 Stub (接著呼叫實際的伺服器實作項目)。
這些檔案的結構與 aidl-cpp
產生的檔案類似 (詳情請參閱 HIDL 簡介中的「傳送模式」)。IFoo.h
是唯一與 HIDL 使用的 RPC 機制無關的自動產生檔案;所有其他檔案都與 HIDL 使用的 HwBinder RPC 機制相關。因此,用戶端和伺服器實作一律不得直接參照 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 |
Binder 專屬符號。Android 10 已淘汰此程式庫。 |
libfmq |
快速訊息佇列 IPC。 |
命名空間
Return<T>
和 Void()
等 HIDL 函式和類型會在命名空間 ::android::hardware
中宣告。套件的 C++ 命名空間取決於套件名稱和版本。舉例來說,在 hardware/interfaces
下,版本為 1.2 的套件 mypackage 具有下列品質:
- C++ 命名空間為
::android::hardware::mypackage::V1_2
- 該套件中
IMyInterface
的完整名稱 為:::android::hardware::mypackage::V1_2::IMyInterface
。(IMyInterface
是 ID,並非命名空間的一部分)。 - 套件
types.hal
檔案中定義的類型會標示為:::android::hardware::mypackage::V1_2::MyPackageType