USB HAL の実装

Android 8.0 リリースでは、USB コマンドの処理を init スクリプトからネイティブ USB デーモンに移行し、構成とコードの信頼性が向上しました。ガジェット機能の構成を設定する場合は、init スクリプト(プロパティ トリガー)を使用して、デバイス固有のガジェット操作を実行します。

以前のリリースでは、こうしたデバイス固有の構成を設定するために、プロパティ トリガーを用いたデバイス固有の init スクリプトを使用していました。ハードウェア抽象化レイヤ(HAL)での設計に移行したことで次のような問題が解決され、よりクリーンな実装ができるようになりました。

  1. カーネル sysfs ノードへの書き込みなどの操作でエラーが発生しても、プロパティ トリガーが設定されたフレームワーク コードまで伝わらず、エラーが返されないため、失敗したことに関して通知されない場合であってもフレームワークは操作が成功したと誤認識してしまう。
  2. init スクリプトで実行可能な操作の回数に制限がある。

Android 12 リリースでは、ネットワーク制御モデル(NCM)と、HAL バージョン番号と USB 速度の両方を返す API 呼び出しに対する USB ガジェット HAL サポートが追加されています。USB HAL を通じて使用できる API 呼び出しについて詳しくは、android.hardware.usb パッケージの概要をご覧ください。

HAL と Treble

デバイス固有の init スクリプトは、デバイス固有の USB 操作を実行する HAL レイヤの代替として使用されました。USB(ADB 経由)は、システムで発生した問題をデバッグするための主要なインターフェースです。ネイティブ デーモンを USB 構成で実行するように設定するとフレームワーク コードとの依存関係がなくなるため、フレームワークがクラッシュした場合でも USB の実行は継続されます。

Android 8.0 で導入された Treble モデルでも、すべての HAL はシステム サービスから分離されているため、独自のネイティブ デーモンで実行する必要があります。これにより、HAL レイヤが USB デーモンとして適切に機能するようになるため、専用の USB デーモンを使用する必要がなくなります。

デフォルトの HAL 実装は、Android 8.0 より前のすべてのデバイスを対象としています。したがって、Android 8.0 より前のデバイスにはデバイス固有の処理というものがありません。Android 8.0 では、HAL インターフェースを使用して USB ポートのステータスのクエリを実行し、データロールとパワーロールの切り替えを行います。

実装

新しい USB HAL インターフェースは、Android 8.0 で起動するすべてのデバイスに実装する必要があります。 デフォルトの実装は、Android 8.0 より前のデバイスを対象としています。デバイスが Type-C のポート ステータスをレポートするために dual_role_usb クラスを使用する場合は、デフォルトの実装で十分です。Type-C のノードの所有権をシステムに移行するには、デバイス固有の USB スクリプトに若干の変更が必要になる場合があります。