バインダーの仕組み、使い方、ソースコード
バインダーメカニズムはAndroid内でプロセス間通信 (IPC) を実現する機能で、カーネルが提供するIPCメカニズムを利用しており、異なるプロセス間の通信に使用されています。
バインダーの仕組みは、
- Linuxカーネルでは、バイダーのドライバーが、バイダーデバイスというbindrという名前のキャラクタデバイスノードを作成し、そのデバイスノードを通して、バイダー機構を利用するすべてのプロセスが通信できます。
- バインダーの仕組みでは、各プロセスはバインダーノードを持っており、他のプロセスと通信ができます。
- 各Binderのノードは、リモートオブジェクトを格納するプロセス内を示すBinderオブジェクト(BinderProxy)というユニークな識別子を持ちます。
- プロセスが他のプロセスと通信を行う際には、バインダーノードを介してバインダードライバへリクエストを送信し、そこで必要なデータをやり取りします。
- バインダードライバは、リクエストをターゲットプロセスのバインダーノードに転送し、ターゲットプロセスのバインダーサービス(BinderService)にリクエスト処理を誘発します。
- ターゲットプロセスのバインダーサービスは、リクエストの処理が終わると、その結果をバインダーに返し、そのドライバによってリザルトはリクエストプロセスのバインダーノードに渡されます。
- リクエストしたプロセスに結果を返す、リクエストしたプロセスのバインダノードを介してプロセス間通信を完了します。
Binderメカニズムを使用する:
- Binderサービスを継承し、リモートインターフェースメソッドを実装するバインダーサービスを作成します。
- サーバプロセスにおいて、そのバインダサービスクラスをシステムサービスに登録し、他のプロセスがバインダノードを介してサービスにアクセスできるようにする。
- クライアントプロセスでは、バインダーノードを介してサーバープロセス内のバインダーオブジェクトを取得し、提供されたメソッドを呼び出して通信します。
Binder 機構のソースコード:
バインダー関連のソースコードの主な部分は、frameworks/base/core/java/android/os/ディレクトリにあります。具体的には Binder.java、BinderService.java、Parcel.java などのファイルです。
具体的なソースコードはAndroidのソースコードで確認することができます。