私は、Android の BINDER IPC メカニズムの背後にあるソフトウェア アーキテクチャを理解しようとしているものをすべて読んでいます。私が理解していることから、BINDER はカーネル空間に位置し、プロセス間でメッセージを中継できる共有メモリの割り当てをユーザー空間アプリケーションに一時的に与えます。
私が理解を失い始めたのは、実際の実装がどのように機能するか、特にパーセルに関連する部分です。
ネットで調べていたところ、Network/Wifi/Notificaiton/Battery など ( Docs ) など、Android が提供する任意のサービスの実装を見つけました。私の読書から、ユーザー空間プログラムはサービスクラス自体をインスタンス化するのではなく、サービスクラスへの参照を取得する必要があることを学びました. そのため、これは、Androidが既にサービスを実行している、または少なくとも必要なときにそれを開始するためのリソースを持っていることを示す間接的な方法として受けとめました。実装は基本的に次のようにレイアウトされました。Context.getSystemService(Context.X)
Battery.class
BatteryManager.setBatteryState(){
Parcel parcelLocal = Parcel.obtain();
parcelLocal.writeInterfaceToken("android.power.BatteryManager");
parcelLocal.writeInt(1/0); //Depending on requested state
BinderObject.transact //Send the data using BINDER
CheckForExceptions(); //Upon return, check for exceptions
ReadResponse(); //If none, read the response from the target
DoAppropriateAction(); //Whatever we need to do after setting the state
parcelLocal.recycle(); //Return the parcel resource
}
最初は単純に思えます: ユーザーが次のようなことをすると:
BatteryMonitor bMonitor = Context.getSystemService(Context.POWER_SERVICE);
bMonitor.setBatteryStatus(1);
次に、user's
インスタンスは BINDER メカニズムを使用してsystem's
実際のサービス コントローラーと通信します (同じクラスのインスタンスはどれですか? )。ただし、上記のコードはシステムのバッテリー監視サービスの実装であり、BINDER データを実際に受信しているのは誰でしょうか?
TL;DR : 1000 行のコードを 10 行に凝縮しようとしたため、これがすべて非常に紛らわしい場合、要約は次のとおりです。ユーザーがネットワーク/Wifi などのハードウェアの状態を制御しようとするとき/Location/Notifications(タッチスクリーン) - Android 内で実際に何が起こっているのか、これらの抽象化されたサービスに関連付けられたハードウェアを実際に制御しているのは誰なのか?
注: 上記のコードは完全に捏造されたものであり、一般的な構造のみを示すことを目的としています。