Bluetooth

Android Bluetooth HAL のアイコン

Android には、クラシック Bluetooth と Bluetooth Low Energy の両方をサポートするデフォルトの Bluetooth スタックが用意されています。Bluetooth を使用することで、Android デバイスはパーソナル エリア ネットワークを作成して、付近の Bluetooth デバイスとデータを送受信できます。

Android 4.3 以降では、Android Bluetooth スタックは Bluetooth Low Energy(BLE)を実装するための機能を備えています。BLE API を最大限に活用するには、Android Bluetooth の HCI 要件に従う必要があります。認定チップセットを搭載した Android デバイスでは、クラシック Bluetooth、またはクラシック Bluetooth と BLE の両方を実装できます。BLE には、古い Bluetooth チップセットとの下位互換性がありません。

Android 8.0 では、ネイティブ Bluetooth スタックで Bluetooth 5 に完全に対応しています。Bluetooth 5 で利用できる機能を使用するには、Bluetooth 5 に対応したチップセットをデバイスに搭載する必要があります。

Android のアーキテクチャ

Bluetooth アプリは、Binder を介して Bluetooth プロセスと通信します。Bluetooth プロセスが JNI を使用して Bluetooth スタックと通信することで、デベロッパーが各種の Bluetooth プロファイルにアクセスできるようにしています。次の図に、Bluetooth スタックの一般的な構造を示します。

Android Bluetooth アーキテクチャ
図 1. Android Bluetooth アーキテクチャ
アプリケーション フレームワーク
アプリケーション フレームワークはアプリのコードのレベルにあたり、android.bluetooth API を使用して Bluetooth ハードウェアを操作します。内部的には、このコードが Binder IPC メカニズムを通じて Bluetooth プロセスを呼び出します。
Bluetooth アプリ
Bluetooth アプリは packages/modules/Bluetooth/android/app に配置されており、Android アプリとしてパッケージ化され、Android フレームワーク レイヤで Bluetooth プロファイルを実装します。このアプリは、JNI 経由でネイティブ Bluetooth スタックを呼び出します。
JNI
android.bluetooth に関連付けられた JNI コードは、packages/modules/Bluetooth/android/app/jni に配置されています。JNI コードは、デバイスが検出されたときなど、特定の Bluetooth オペレーションが発生したときに Bluetooth スタックを呼び出します。
Bluetooth スタック
デフォルトの Bluetooth スタックは AOSP に組み込まれ、packages/modules/Bluetooth/system に配置されています。スタックでは汎用の Bluetooth HAL が実装されており、拡張機能と構成変更によってカスタマイズ可能です。
ベンダー実装
ベンダー デバイスは、ハードウェア インターフェース デザイン言語(HIDL)を使用して Bluetooth スタックを操作します。

HIDL

HIDL では、Bluetooth スタックとベンダー実装の間のインターフェースが定義されています。Bluetooth HIDL ファイルを生成するには、Bluetooth インターフェース ファイルを HIDL 生成ツールに渡します。インターフェース ファイルは hardware/interfaces/bluetooth にあります。

Bluetooth スタックの開発

Android Bluetooth スタックは、Bluetooth スタックに完全に対応しています。認証リスティングは、Bluetooth SIG ウェブサイトの QDID 169365 にあります。

コア Bluetooth スタックは packages/modules/Bluetooth にあります。開発は AOSP で行われていますが、コントリビューションも受け付けています。

Android 7.x 以前のアーキテクチャ

Bluetooth システム サービスは JNI 経由で Bluetooth スタックと通信し、Binder IPC を介してアプリと通信します。システム サービスにより、デベロッパーが各種の Bluetooth プロファイルにアクセスできるようにしています。次の図は、Bluetooth スタックの一般的な構造を示しています。

Android Bluetooth アーキテクチャ
図 2. Android 7.x 以前の Bluetooth アーキテクチャ
アプリケーション フレームワーク
アプリケーション フレームワークはアプリのコードのレベルにあたり、android.bluetooth API を使用して Bluetooth ハードウェアを操作します。内部的には、このコードが Binder IPC メカニズムを通じて Bluetooth プロセスを呼び出します。
Bluetooth システム サービス
Bluetooth システム サービスは packages/apps/Bluetooth に配置されており、Android アプリとしてパッケージ化され、Android フレームワーク レイヤで Bluetooth サービスおよびプロファイルを実装します。このアプリは JNI 経由で HAL レイヤを呼び出します。
JNI
android.bluetooth に関連付けられた JNI コードは、packages/apps/Bluetooth/jni に配置されています。JNI コードは、デバイスが検出されるなど特定の Bluetooth オペレーションが発生したときに HAL レイヤを呼び出し、HAL からコールバックを受け取ります。
HAL
Hardware Abstraction Layer では、android.bluetooth API と Bluetooth プロセスが呼び出す標準インターフェースが定義されています。Bluetooth ハードウェアを適切に機能させるには、これを実装する必要があります。Bluetooth HAL のヘッダー ファイルは hardware/libhardware/include/hardware/bluetooth.h です。また、すべての hardware/libhardware/include/hardware/bt_*.h ファイルを確認する必要があります。
Bluetooth スタック
デフォルトの Bluetooth スタックが提供されており、system/bt に配置されています。スタックでは汎用の Bluetooth HAL が実装されており、拡張機能と構成変更によってカスタマイズ可能です。
ベンダー拡張
トレース用のカスタム拡張機能と HCI レイヤを追加するには、libbt-vendor モジュールを作成して、それらのコンポーネントを指定します。

HAL の実装

Bluetooth HAL は /hardware/libhardware/include/hardware/bluetooth.h にあります。bluetooth.h ファイルには Bluetooth スタックの基本インターフェースが含まれており、この機能を実装する必要があります。

プロファイル固有のファイルは同じディレクトリにあります。詳細については、HAL ファイルのリファレンスをご覧ください。