7

Androidのバインダーについて質問です。私の理解が正しければ、プロセス間で Binder を渡すことができます。サービス側には、Binder オブジェクト (元のオブジェクト) があります。クライアント側 (別のプロセス) には、AIDL データのマーシャリングを処理する BinderProxy オブジェクトがあります。

私の質問は、2 つの BinderProxy オブジェクトが等しいかどうかを確認するにはどうすればよいですか? つまり、サービス プロセスで同じ Binder オブジェクトを参照します。equals() メソッドを使用できますか? BinderProxy オブジェクトは元の Binder オブジェクトと同じメモリ アドレスを持っていますか?

ありがとう!

編集:

David Wasser のコメントへの返答:

これを行う必要がある理由を説明するのは少し複雑ですが、明確に説明できるかどうか見てみましょう --

リモート サービスは AIDL API を提供します (クライアントは onServiceConnected で IBinder を受け取ることによって取得します)。AIDL API には、とりわけ 2 つのメソッドが含まれています。

IBinder getInterface (文字列 interfaceName );

void releaseInterface (IBinder バインダー);

これは、クライアント アプリケーションがさまざまなインターフェイスのバインダーに対してリモート サービスを要求できるという考え方です。インターフェイス実装の dex コードとそのバインダーは動的にサービスに読み込まれますが、事前にはわかりません。このサービスは、インターフェイス名に基づいて、クライアント アプリが動的に読み込まれたインターフェイスのバインダーにアクセスするためのこれら 2 つの AIDL メソッドを提供します。

App1 と App2 があるとします。それぞれが 'binder1 = getInterface( "SomeInterface1" );' を行います その動的にロードされたインターフェース「SomeInterface1」のバインダーを取得します。使用後、アプリは「releaseInterface(binder1);」と言ってインターフェイス バインダーを解放します。サービスがインターフェイスの dex コードをアンロードし、クリーンアップを実行できるようにします。

ただし、 App1 と App2 の両方がインターフェイス バインダーを解放しない限り、インターフェイス dex コードをアンロードすることはできません。そのため、サービスでは、動的に読み込まれる各バインダーの参照カウントを維持します。(マップ キー{バインダー} ==> 値{参照カウント} とします)。アプリが getInterface() を実行すると、参照カウントが増加します。releaseInterface(binder1) を実行するときは、参照カウントを減らす必要があります。ただし、そのためには、binder1 がマップ内のバインダー キーと等しいかどうかを確認する必要があります。

バインダーは、サービス (元のバインダー オブジェクト) からクライアント アプリ (getInterface() によって返されるバインダー プロキシ) に渡され、再びサービスに (releaseInterface() のパラメーターとして) 渡されていることに注意してください。オリジナル??)。

App1 と App2 は、同じインターフェイス名に対して異なるバインダー オブジェクト (インターフェイスの異なる実装) を取得する可能性があります。そのため、バインダーを使用してリリースします。

これがあまり混乱していないことを願っています!助けてくれてありがとう。

カルティック

4

2 に答える 2

0

私が知る限り、これに対する簡単な解決策はありません。BinderProxy は、android.os.Binder 内の最終クラスです。ソースはこちらにあります。1 つの解決策は、Binder を拡張する独自のクラスを作成し、独自の実装を作成して、Binder のインスタンスを BinderProxy に格納するか、その逆にすることです。どちらのクラスも他のクラスを直接参照していないため、難しいです。私があなたの質問を誤解している場合、またはここから離れている場合は申し訳ありません。

于 2012-07-13T18:11:30.503 に答える