Androidフレームワーク周りのサービスをRPCする仕組みメモ

Androidのフレームワーク周りを見ていると、なんちゃらNative、なんちゃらProxyがいっぱい出てきます。
そして、たとえばActivityManagerServiceを停止させるshutdownメソッドはインターフェイスIActivityManagerで定義されており、ActivityManagerServiceで実装されていて、ActivityManagerNativeでも実装されてるし、ActivityManagerProxyでも実装されています。

どれがどれやら混乱したので自分用にメモしました。

Androidではプログラム毎にプロセスが異なります。
そのため、他のプログラムからサービスの機能を呼び出そうとするとプロセス間通信を行う必要があります。このややこしい仕組みはリモートプロシージャコール(以後RPC)を意識せずAndroidのサービスを扱うためのものです。

ActivityManagerの場合、クラス図は次のような感じです。他のサービスも同じ仕組みでRPCを実現していました。

binder

各クラスの目的は次のような感じです。

  • IActivityManager – ActivityManagerのインターフェイスを定義
  • ActivityManagerProxy – プロセス間通信が必要な場合、このProxy内部でRPCを行い、プロセス間通信をしていることを隠す
  • ActivityManagerNative – ProxyからのRPC要求を受け取り、実装クラス(ActivityManagerService)のメソッドを実行し、結果を返す処理を実装
  • ActivityManagerService – ActivityManagerの処理を実装

ActivityManagerを利用する場合、次のようにしてインスタンスを取得します。

IActivityManager  am = ActivityManagerNative.getDefault();

Binderの機能により、プロセス間通信の必要が無い場合(ActivityManagerのプロセスから実行した場合)は、ActivityManagerServiceを返します。
プロセス間通信が必要な場合(ActivityManagerのプロセス以外から実行した場合)は、ActivityManagerProxyを生成し返します。

プロセス間通信が必要ない場合はActivityManagerServiceで実装したメソッドはそのまま直接実行されます。
プロセス間通信が必要な場合はProxyのメソッドを実行することになり、Proxyの中でBinderのRPC機能を利用してActivityManagerのプロセスにあるNativeのインスタンスを経由してActivityManagerServiceのメソッドを実行します。

この仕組みがあるおかげでRPCしている事を意識せず各サービスを利用できるわけですね。便利!ありがとうBinder!

RPCを担当している裏にはServiceManagerやBinderがいるのですが、複雑なのでまだちゃんと理解はしていません。
ここもきっちり理解しないとモヤモヤ感が消えず、何となく理解程度で止まりそうです。

No Comments

Post a Comment

コメントを投稿するには、下の計算の答えを入力する必要があります。答えは半角数字で入力してください。 *