5

最近、ソース コードを読んだところ、 IPC 呼び出しAndroidを実行するときに常にメソッドのペアが呼び出されることがわかりました。Binderコメントを読みましたが、根本的な理由がはっきりとわかりません。メソッドのペアは次のとおりです。

final long origId = Binder.clearCallingIdentity();

//other local method.

Binder.restoreCallingIdentity(origId);

そのメソッドのペアの機能を知っている人はいますか? 許可に関係しているようです。

4

2 に答える 2

7

質問は古いですが、公式のメソッドの説明に加えて、さらに詳細を記載する価値があります。


IPC とは別に (または IPC とともに)Binderフレームワークの重要な役割Androidはセキュリティです。

各トランザクションは、呼び出しプロセス ( callerBinder )の ID (PID および UID) の下で実行されるため、呼び出されたプロセス ( callee ) は呼び出しプロセスのアクセス許可を検査し、要求されたメソッドを実行できるかどうかを判断できます。

このようなトランザクションを呼び出し先のIDで (一時的に) 実行する必要がある場合は、呼び出し元のトランザクションをクリアし、後でそれぞれBinder.clearCallingIdentity()および を呼び出すことで復元できますBinder.restoreCallingIdentity(long)。呼び出しの間に、呼び出し先の権限がチェックされます。

として、システム サービス (AOSP の場所: /frameworks/base/services/java/com/android/server) を考えてみましょう。system_serverプロセスで実行中のサービスは、パーミッション チェックに合格するために、発信者のUID=1000ID を一時的に消去できます。

于 2016-11-07T16:11:41.563 に答える
5

公式 API の説明よりもうまく答えられるとは思いません: http://developer.android.com/reference/android/os/Binder.html

public static final long clearCallingIdentity ()

現在のスレッドで着信 IPC の ID をリセットします。これは、着信呼び出しを処理しているときに、プロセスに対してローカルである可能性のある他のオブジェクトのインターフェイスを呼び出し、それらに着信する呼び出しに対してアクセス許可チェックを行う必要がある場合に役立ちます (したがって、それらは自分のアクセス許可をチェックします)。ローカル プロセスであり、最初に呼び出されたプロセスではありません)。

于 2013-04-18T06:52:01.587 に答える