Übersicht über Ordner

Binder ist ein System für die Interprozesskommunikation, mit dem zwei Prozesse auf einem Android-Gerät miteinander kommunizieren können. Binder bietet eine Möglichkeit, Funktionsaufrufe in einem anderen Prozess auszuführen, die für den Aufrufer vollständig transparent ist.

In Binder-Begriffen wird der aufrufende Prozess als Client bezeichnet und sein Endpunkt als Binder-Proxy oder Proxy. Umgekehrt ist der aufgerufene Prozess der Server und sein Endpunkt wird als Binder-Knoten oder Knoten bezeichnet.

Jeder Knoten kann eine eigene Schnittstelle bereitstellen und implementieren. Mit einem Proxy kann der Client Methoden auf einer Knotenschnittstelle ausführen, als wäre der Aufruf ein lokaler Funktionsaufruf. Im folgenden Beispiel wird eine Methode aufgerufen:

int result = someNodeInterface.foo(a, b); // someNodeInterface is a proxy object

Angenommen, der Client, der foo() aufruft, wird in Prozess A ausgeführt und der Server, der foo() implementiert, wird in Prozess B ausgeführt. Abbildung 1 zeigt, wie dieser Aufruf ausgeführt wird:

Ausführung von Binder-Aufrufen.

Abbildung 1 : Ausführung von Binder-Aufrufen.

Wenn Sie eine Methode in einem anderen Prozess ausführen möchten, wie in Abbildung 1 dargestellt, geschieht Folgendes:

  1. Der Clientcode in Prozess A ruft den Proxycode in Prozess A auf. Der Proxycode in Prozess A erstellt eine Transaktion mit den folgenden Elementen:
    • Eine Kennung für den Knoten
    • Eine Kennung für die Methode foo() auf dem Knoten
    • Ein Puffer mit einer Kopie der Argumente a und b
  2. Die Transaktion wird an den Binder-Kernel-Treiber gesendet.
  3. Der Binder-Kernel-Treiber stellt fest, dass Prozess B den Knoten hostet.
  4. Der Kernel kopiert die gesamte Transaktion in den Adressraum von Prozess B.
  5. Der Kernel sucht einen Thread in Prozess B, um die Transaktion zu verarbeiten, und übergibt die Transaktion an ihn.
  6. Der Thread entpackt die Transaktion, sucht den Knoten und sendet die Transaktion an das Knotenobjekt.
  7. Das Knotenobjekt ruft die Funktions-ID aus der Transaktion ab, entpackt a und b aus dem Transaktionspuffer und speichert a und b in lokalen Variablen.
  8. Das Knotenobjekt ruft foo(a, b) im Servercode in Prozess B auf.
  9. Das Ergebnis des Aufrufs wird in einer Antworttransaktion zurückgegeben, die an den Kernel-Treiber und dann zurück an den aufrufenden Proxy in Prozess A übergeben wird.
  10. Der Proxy gibt dieses Ergebnis an den Aufrufer in Prozess A zurück.

Anwendungsfälle für Binder

Binder kann in einer Vielzahl von Szenarien verwendet werden, in denen die Kommunikation zwischen Software in verschiedenen Prozessen erforderlich ist. Beispiel:

  • Eine Kamera-App verwendet Binder, um mit dem Kameraserver in einem anderen Prozess zu kommunizieren. Der Kameraserver verwendet dann Binder, um mit dem Kamera-HAL in einem anderen Prozess zu kommunizieren.

  • Eine App verwendet Binder, um mit einem Systemserver in einem anderen Prozess zu kommunizieren. Der Systemserver verwendet Binder, um mit HALs in anderen Prozessen zu kommunizieren.

  • Eine App in einem Prozess verwendet Binder, um mit einer anderen App in einem anderen Prozess zu kommunizieren.

  • Der System-Daemon, der für die Installation, Aktualisierung und Entfernung von Apps zuständig ist (installd), verwendet Binder, um mit dem Android-Laufzeit-Daemon (`artd`) zu kommunizieren, um Apps zu kompilieren.

AIDL und Binder

Verwenden Sie die Android Interface Definition Language (AIDL), um Programmierschnittstellen zu definieren, die Binder für die IPC verwenden. Weitere Informationen finden Sie in der AIDL-Übersicht.