いくつかの例外を除き、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
スタブの両方の実装を含むクラス。クライアントがインターフェイス メソッドを呼び出すと、プロキシはクライアントからの引数を自動的にマーシャリングし、トランザクションをバインダー カーネル ドライバーに送信します。バインダー カーネル ドライバーは、トランザクションを反対側のスタブに配信します (実際のサーバー実装が呼び出されます)。
ファイルは、 aidl-cpp
によって生成されるファイルと同様の構造になっています (詳細については、「 HIDL の概要」の「パススルー モード」を参照してください)。 HIDL で使用される RPC メカニズムから独立した唯一の自動生成ファイルはIFoo.h
です。他のすべてのファイルは、HIDL で使用される HwBinder RPC メカニズムに関連付けられます。したがって、クライアントとサーバーの実装は、 IFoo
以外のものを直接参照してはなりません。これを実現するには、 IFoo.h
のみをインクルードし、生成された共有ライブラリにリンクします。
共有ライブラリへのリンク
パッケージ内のインターフェイスを使用するクライアントまたはサーバーは、次のいずれかの場所にそのパッケージの共有ライブラリを含める必要があります。
- 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。 |
名前空間
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
は識別子であり、名前空間の一部ではありません)。 - パッケージの
types.hal
ファイルで定義されたタイプは::android::hardware::mypackage::V1_2::MyPackageType
として識別されます。