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 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
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 ファイルのリファレンスをご覧ください。