Android Binder トランザクション呼び出しメソッドのコーミング

Binder 対話中のプロトコル コマンド

Binder 対話中のプロトコル コマンド

  AIDL の Proxy の mRemote は BinderProxy です。
  Java層のBinderProxyは、C++層のBinderProxyNativeDataに対応する。(BinderProxyNativeData の mObject は BpBinder を指します)。
  Java 層
  プロキシはインターフェイス メソッドを実装します—「BinderProxy transact()—」
  JNI は C++ 層
  android_util_Binder.cpp ファイルに入ります android_os_BinderProxy_transact()—"BpBinder transact()—"IPCThreadState::self()->transact() (ここにあります)また、writeTransactionData() を呼び出して cmd2 (次の cmd を区別するために cmd2 として記述) を mOut) に書き込みます) --> IPCThreadState waitForResponse(reply) --> IPCThreadState talkWithDriver() --> ioctl(mProcess->mDriverFD, BINDER_WRITE_READ, &bwr) ここで cmd=BINDER_WRITE_READ を設定します。——"
  システム コールは、kernel\common\drivers\android\binder.c のドライバー層コードを入力します。
  binding_ioctl() ——” cmd=BINDER_WRITE_READ に従い、binder_ioctl_write_read() を入力します ——” 1. bwr.write_size > 0 の場合、binder_thread_write() を実行します。2. bwr.read_size > 0 の場合、binder_thread_read() を実行します。

  binding_thread_write(): cmd2 == BC_TRANSACTION または BC_REPLY に従って、binder_transaction() を呼び出します。上の図の BC_TRANSACTION プロトコルと BC_REPLY プロトコルの処理が binding_transaction() 内にあることがわかります。
  呼び出し元のスレッドが BC_TRANSACTION の処理を​​完了すると、BINDER_WORK_TRANSACTION_COMPLETE タイプの binding_work をスレッドの保留イベント リスト thread->todo に配置し、スレッドが処理のために binding_thread_read() に入るのを待ちます。また、トランザクション イベントをターゲットに追加します。 process スレッドの保留中のイベント リストで、ターゲット プロセスのスレッドをウェイクアップします。
  呼び出し側スレッドは、binder_thread_read() を入力すると、BINDER_WORK_TRANSACTION_COMPLETE タイプの binding_work を処理します。これは、図のバインダー対話プロセスのプロトコル コマンドの BR_TRANSACTION_COMPLETE プロトコルに対応します。ドライバーの処理が完了すると、ユーザー モードの IPCThreadState::talkWithDriver() ——> IPCThreadState::waitForResponse() に戻ります。BR_TRANSACTION_COMPLETE 処理後、talkWithDriver()によりカーネルモードに入り、対象プロセスの処理結果を待ちます。今回は bwr.write_size == 0 なので、直接 binding_thread_read() にジャンプし、対象プロセスの戻り結果を待ちます。
  ターゲットプロセスのスレッドが起動すると、binder_thread_read()から実行され、BR_TRANSACTIONプロトコルの処理を継続します。ユーザーモードに戻り、IPCThreadState::talkWithDriver() ——” IPCThreadState::waitForResponse() ——” IPCThreadState::executeCommand() を実行し、BR_TRANSACTION を処理し、ターゲット プロセスで BBinder オブジェクトの transact() を呼び出します。この BBinder オブジェクトも JavaBBinder オブジェクトです。onTransact() を入力します。これは、JavaBBinder オブジェクトの mObject が Java 層の Binder オブジェクトを指しているため、Java 層の Binder オブジェクトの Transact() を呼び出します。次に、sendReply() を通じて BC_REPLY を書き込みます。次に、waitForResponse()——「talkWithDriver()」を介して、カーネル内の binding_transaction() に入ります。
  ターゲット プロセス スレッドが BC_REPLY の処理を​​完了すると、BR_TRANSACTION_COMPLETE プロトコルも受信します。また、呼び出し側プロセスのスレッドも起動します。BR_TRANSACTION_COMPLETE プロトコルの処理後、ターゲット プロセス スレッドはタスクを完了し、引き続き binding_thread_read() に入り、スリープを待ちます。
  呼び出し元プロセスのスレッドが起動され、引き続き BR_REPLY の処理が行われ、処理後、トランザクション全体の処理が完了します。

おすすめ

転載: blog.csdn.net/q1165328963/article/details/126374771