HAL モジュールの変換

hardware/libhardware/include/hardware のヘッダーを変換して、既存の HAL モジュールを HIDL HAL モジュールに更新できます。

c2hal の使用

c2hal ツールがほとんどの変換作業を処理するため、必要な手動変更の数を削減できます。たとえば、NFC HAL の HIDL .hal ファイルを生成するには、次のコマンドを実行します。

make c2hal
c2hal -r android.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport -p android.hardware.nfc@1.0 hardware/libhardware/include/hardware/nfc.h

これらのコマンドにより、hardware/interfaces/nfc/1.0/ にファイルが追加されます。$ANDROID_BUILD_TOP ディレクトリから hardware/interfaces/update-makefiles.sh を実行すると、必要な makefile も HAL に追加されます。ここから手動で変更して、HAL を完全に変換できます。

c2hal のアクティビティ

c2hal を実行すると、ヘッダー ファイル内のすべてが .hal ファイルに転送されます。

c2hal は、指定されたヘッダー ファイル内の関数ポインタを含む構造体を特定し、各構造体を個別のインターフェース ファイルに変換します。 たとえば、alloc_device_tIAllocDevice HAL モジュール(IAllocDevice.hal ファイル内)に変換されます。

他のすべてのデータ型は、types.hal ファイルにコピーされます。 #define は列挙型に移行されます。HIDL の一部ではないアイテムまたは変換不能なアイテム(静的関数宣言など)はコメントにコピーされ、「NOTE」というテキストでマークされます。

手動アクティビティ

c2hal ツールは、特定の構造を検出したときにどのように対処すべきか判断できません。たとえば、HIDL には生のポインタの概念がありません。このため、c2hal がヘッダー ファイルでポインタを検出した場合、ポインタを配列として解釈すべきか、別のオブジェクトへの参照として解釈すべきか判断できません。void ポインタも同様にはっきりしない存在です。

int reserved[7] などのフィールドは、HIDL への移行中に手動で削除する必要があります。戻り値の名前などのアイテムは、よりわかりやすいものに更新する必要があります。たとえば、NFC の write などのメソッドのリターン パラメータを、自動生成された int32_t write_ret から Status status に変換します(ここで、Status は、可能な NFC ステータスを含む新しい列挙型です)。

HAL の実装

HAL を表す .hal を作成した後、C++ と Java の言語サポートを作成する makefile(Make または Soong)を生成する必要があります(HAL が Java でサポートされていない機能を使用している場合を除く)。./hardware/interfaces/update-makefiles.sh スクリプトは、hardware/interfaces ディレクトリにある HAL 用の makefile を自動的に生成できます(他の場所にある HAL の場合は、スクリプトを更新してください)。

makefile が最新になったら、ヘッダー ファイルを生成してメソッドを実装できます。生成されたインターフェースを実装する方法については、HIDL C++(C++ 実装の場合)または HIDL Java(Java 実装の場合)をご覧ください。