Ü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, der für den Aufrufer vollständig transparent ist.

Im Binder-Kontext wird der aufrufende Prozess als Client und sein Endpunkt als Binder-Proxy oder Proxy bezeichnet. 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. Über einen Proxy kann der Client Methoden auf einer Knotenschnittstelle ausführen, als wäre der Aufruf ein lokaler Funktionsaufruf. Das folgende Beispiel zeigt, wie eine Methode aufgerufen wird:

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.

Um eine Methode in einem anderen Prozess auszuführen, wie in Abbildung 1 dargestellt, passiert Folgendes:

  1. Der Clientcode in Prozess A ruft den Proxycode in Prozess A auf. Der Proxy-Code in Prozess A erstellt eine Transaktion mit den folgenden Elementen:
    • Eine Kennung für den Knoten
    • Eine Kennung für die foo()-Methode für den 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 findet einen Thread in Prozess B, der die Transaktion verarbeiten kann, und übergibt die Transaktion an diesen Thread.
  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) für den Servercode in Prozess B auf.
  9. Das Ergebnis des Aufrufs wird in einer Antworttransaktion zurückgegeben, die an den Kerneltreiber 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 verantwortlich ist (installd), verwendet Binder, um mit dem Android-Laufzeit-Daemon („artd“) zu kommunizieren und Apps zu kompilieren.