Android には、クラシック Bluetooth と Bluetooth Low Energy(BLE)の両方をサポートするデフォルトの Bluetooth スタックが用意されています。Bluetooth を使用することで、Android デバイスはパーソナル エリア ネットワークを作成して、付近の Bluetooth デバイスとデータを送受信できます。
Android 4.3 以降では、Android Bluetooth スタックは 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 プロセスが Java Native Interface(JNI)を使用して Bluetooth スタックと通信することで、デベロッパーが各種の Bluetooth プロファイルにアクセスできるようにしています。次の図は、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 が実装されており、拡張機能と構成変更によってカスタマイズ可能です。 - ベンダー実装
- ベンダー デバイスは、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 で行われていますが、コントリビューションも受け付けています。