Androidのbinderのメモ
- tetsu_koba
- 15954
- 0
- 9
- 2
initとZygoteはだいたいわかった。binderとかActivityServiceManagerが謎なので誰か説明して欲しい。
2011-03-08 00:17:54概要を頭で理解したところで止まっていて、まだカラダで理解できていないのですよ。まだ目に鱗が張り付いたまま。 @magoroku15 binderはサーバプロセスとの間のRPCフレームワークです。....
2011-03-08 00:28:47binderはサーバプロセスとの間のRPCフレームワークです。一般のOSモデルではシステムコールを経てカーネルの共通サービス呼び出しますが。android APIの一部はbinderを経て他のユーザプロセス内部の関数を呼び出します。てなのを次々回LTで @tetsu_koba
2011-03-08 00:29:05言い換えるを垂直方向の呼び出しがシステムコール、水平方向の呼び出しがAndroid API(の一部) 水平には直接呼べないのでbinderを経由してUの字で呼び出します。
2011-03-08 00:31:08いや、誰かのつぶやきで教えてもらった。 @androidzaurus うぉぉ。なんだこの良記事。あとでじっくり読む。発掘者はてつこばさん。 http://htn.to/qPxajR
2011-03-08 11:04:46残念ながら http://www.openbinder.org/ のページは今は失われているらしい。変なロシア語っぽいものしか表示されない。
2011-03-08 11:19:56字が細かい英文のサイトは読んでると集中力が続かなくなる。こんなときはブラウザの 表示 > ズーム > 拡大 を4回くらい押してプレゼンのスライド並みのデカイ文字にして読む。
2011-03-08 11:25:35素晴らしい。openbinder.org が保全されている。 @androidzaurus http://replay.waybackmachine.org/20061205015100/http://openbinder.org/
2011-03-08 11:27:56ActivityManagerNative.getDefault().startActivity からプロセスをまたいで ActivityManagerService#startActivity が呼ばれるまでの行程をソースコードで追ってみた。そしたらbinderが理解できた。
2011-03-09 16:02:47binder: どのプロセスで実行されるのかは気にしなくてよい。もしもそれが自分のプロセスの中にあるものだったらプロセス間通信は行われずに直接呼出しになる。賢い。
2011-03-09 16:05:55Androidのbinderはいろいろ工夫されてるのがわかって面白い。初めはこんなの既存のソケットを使っても同じじゃんと思っていたけど。なるほどね。
2011-03-10 10:34:56似たようなプロセス間通信でもD-Busはsocketの上に構築されているので、binderのように独自のカーネルドライバは必要としない。なぜbinderはこんな実装になっているのか?
2011-03-10 10:54:07socketの場合カーネルの内部状態はfdに紐付けされてる。だから複数スレッドで使うときにはスレッドごとにopenしてfdを取得するべき。binderの場合は内部状態はpidに紐付けされている。userland側の状態もTLSを使うことでスレッド間の排他制御が不要になる。
2011-03-10 12:54:32その代わりにbinderではひとつのスレッドでは複数のセッションは張ることはできない。ユーザープログラムが自分で直接/dev/binderを扱うことは想定していないと思う。必ずライブラリを経由して使う。
2011-03-10 12:59:37binderのサービスをどのプロセスが提供しているかを管理しているのが/system/bin/servicemanager 昔はこれは/system/bin/runtime でやっていたらしいが変更された。
2011-03-10 13:08:44"Binder Thread #2" などの名前のスレッドがリモートでのメソッド実行の要求を受け付けるサーバスレッド。受付待ちのスレッドの数が0にならないように必要に応じてスレッド数が増える。受付タイムアウトになるとスレッドを減らすが最低1つは残す。
2011-03-10 14:56:36