除了少數例外,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
,客戶端和服務器可以包含該標頭。使用帶有IFoo.hal
接口文件的hidl-gen
編譯器作為輸入,綁定模式具有以下自動生成的文件:
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
存根的實現的類。當客戶端調用接口方法時,代理會自動編組來自客戶端的參數並將事務發送到 binder 內核驅動程序,後者將事務傳遞到另一端的存根(然後調用實際的服務器實現)。
這些文件的結構與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