パッケージ

いくつかの例外を除き、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コンパイラを使用すると、バインダ化モードでは次のファイルが自動生成されます。

コンパイラによって生成されたファイル

図 1.コンパイラによって生成されたファイル
  • IFoo.h 。 C++ クラスの純粋なIFooインターフェイスについて説明します。これには、 IFoo.halファイルのIFooインターフェイスで定義されたメソッドと型が含まれており、必要に応じて C++ 型に変換されます。このインターフェースの実装に使用される RPC メカニズム (例: HwBinder ) に関連する詳細は含まれません。クラスは、パッケージとバージョンで名前空間化されます (例: ::android::hardware::samples::IFoo::V1_0 )。クライアントとサーバーの両方に次のヘッダーが含まれています。クライアントはメソッドを呼び出すため、サーバーはそれらのメソッドを実装します。
  • IHwFoo.h 。インターフェイスで使用されるデータ型をシリアル化する関数の宣言を含むヘッダー ファイル。開発者は、ヘッダーを直接インクルードしないでください (クラスは含まれていません)。
  • BpHwFoo.hIFooから継承し、インターフェイスのHwBinderプロキシ (クライアント側) 実装を記述するクラス。開発者はこのクラスを直接参照しないでください。
  • BnHwFoo.hIFoo実装への参照を保持し、インターフェイスのHwBinderスタブ (サーバー側) 実装を記述するクラス。開発者はこのクラスを直接参照しないでください。
  • FooAll.cppHwBinderプロキシと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として識別されます。