除少數例外,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
檔案在範例套件中建立一個 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
介面檔案作為輸入,binderized 模式具有以下自動產生的檔案:
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
存根實作的類別。當客戶端呼叫介面方法時,代理程式會自動編組來自客戶端的參數並將事務傳送到綁定器內核驅動程序,該驅動程式將事務傳遞到另一端的存根(然後呼叫實際的伺服器實作)。
這些文件的結構與aidl-cpp
產生的文件類似(有關詳細信息,請參閱HIDL 概述中的「直通模式」)。唯一獨立於 HIDL 所使用的 RPC 機制的自動產生檔案是IFoo.h
;所有其他檔案都與 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 | 活頁夾特定符號。 Android 10 棄用了該函式庫。 |
libfmq | 快速訊息隊列IPC。 |
命名空間
HIDL 函式和型別(例如Return<T>
和Void()
在命名空間::android::hardware
中宣告。套件的 C++ 命名空間由套件名稱和版本決定。例如, hardware/interfaces
下版本為 1.2 的套件mypackage具有以下品質:
- C++ 命名空間為
::android::hardware::mypackage::V1_2
- 該套件中
IMyInterface
的完全限定名稱為:::android::hardware::mypackage::V1_2::IMyInterface
。 (IMyInterface
是一個標識符,不是命名空間的一部分)。 - 套件的
types.hal
檔案中定義的類型被識別為:::::android::hardware::mypackage::V1_2::MyPackageType