本記事では、プロセス間通信や、BinderProxyとは何か、そして普段のAndroid開発の中でどのように登場するのかについて話していきます。
注意
末尾にも書いたのですが、こちらの記事は自分の浅い理解をもとに書いてしまっています。追って更新いたします。
簡単に話すと
BinderProxyとは、Androidのプロセス間通信(IOC)の仕組みの中で重要な要素です。プロセス間通信は、コンピュータの動作において、複数プロセス間でデータをやりとりする仕組みのことです。Androidアプリは1つのプロセスにつき1つアプリケーションを走らせることができます。日記アプリで、何か別の写真アプリを経由してに写真を投稿すると思いますが、この時日記アプリ->写真アプリ->日記アプリと複数のプロセスをまたいだやりとりをしています。この複数プロセスの間のやりとりを、Android OS上で上手くやってくれる子がBinderProxyということです。
登場人物
名前 | 解説 |
---|---|
クライアント | クライアントはサービスやデータを要求している側のプロセスです。冒頭の文章だと日記アプリですね。 |
サーバー | サーバーは、要求されたサービスやデータを提供する側のプロセスです。 冒頭の文章だと写真アプリですね。 |
バインダーシステム | IPCシステムの1種で、別プロセスであるクライアントとサーバーのやりとりを取り持ってくれるのがバインダーシステムです。公式Documentによると、バインダーシステムは別のIPCシステムに比べて効率的、高速、そしてセキュリティの観点でも優れているそうです。 |
IBinder | サーバーが、自身が提供する機能をクライアントに公開するインターフェースのこと。各サーバーが1つ持っている。 |
BinderProxy | IBinderを実装したもの。バインダーシステムのやり取りでは実際にはBinderProxyが動くので、バインダーシステムの中で何かTransactionTooLargeExceptionといった例外が投げられたときに、エラーログに現れるのはIBinderではなくBinderProxyの名前になります。 |
登場人物ってわけではないけど、ドキュメントで出てきてわかりづらかった単語
名前 | 解説 |
---|---|
remote object/remotable object | 何か特定の扱いたいobjectが別プロセスに存在していることを「remote」と表現しているようです。 |
Android開発で登場するとしたら
Android開発で1番身近なプロセス間通信は、冒頭で出てきたようなデータのやり取りだと思います。この時にBinderProxyくんが動いてくれています。
気をつけること。
BinderProxyに受け渡せるデータ量には制限があります。公式ドキュメントには1MBが上限とあります。この上限を超えてデータを受け渡す、または別プロセス先のアプリからデータが渡されてこようとすると、先ほど挙げたTransactionTooLargeExceptionが投げられてクラッシュしてしまいます。気をつけましょう。この例外はOS側から投げられてしまうもので、try~catchはできない認識です。
わからなかったこと
先述の通り、BinderProxyはプロセス間通信のための存在ですが、観測範囲ではプロセスが変わっていない時でも動いているようです。具体例はActivityの破棄時です。システムによるActivityの破棄時にonSaveInstanceStateが発火して、データがBinderProxyへと受け渡されていきます。が、システムによってActivityが破棄されたとしても、すぐにアプリケーションが最前面に戻れば同じプロセスで復帰します。なので少なくともActivityが破棄された、onSaveInstanceStateが発火したタイミングではプロセス間通信が行われると決まっていないと思います。なのに毎回プロセス間通信のためのBinderProxyに書き込みが行われる点が自分にはよくわからなかったです。詳しい方教えてください、、
この記事を書いていて何もわからなくなってしまったので、以下の本などを読み加筆していこうと思います。
参考記事
https://developer.android.com/reference/android/os/IBinder
https://developer.android.com/reference/android/os/TransactionTooLargeException
https://developer.android.com/guide/components/activities/parcelables-and-bundles?hl=ja#sdbp
https://developer.android.com/guide/components/activities/process-lifecycle?hl=ja