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_t
は IAllocDevice
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 実装の場合)をご覧ください。