Présentation de Binder

Binder est un système de communication interprocessus qui permet à deux processus sur un appareil Android de communiquer. Binder permet d'exécuter des appels de fonction dans un autre processus de manière totalement transparente pour l'appelant.

En termes de binder, le processus appelant est considéré comme le client et son point de terminaison est appelé proxy de binder ou proxy. À l'inverse, le processus appelé est le serveur et son point de terminaison est appelé nœud de binder ou nœud.

Chaque nœud peut exposer et implémenter sa propre interface. À l'aide d'un proxy, le client peut exécuter des méthodes sur une interface de nœud comme si l'invocation était un appel de fonction local. L'exemple suivant montre comment une méthode est appelée :

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

Supposons que le client appelant foo() s'exécute dans le processus A et que le serveur implémentant foo() s'exécute dans le processus B. La figure 1 montre comment cet appel est exécuté :

Exécution de l'appel Binder.

Figure 1 : Exécution de l'appel Binder.

Pour exécuter une méthode dans un autre processus, comme illustré dans la figure 1, les opérations suivantes se produisent :

  1. Le code client du processus A appelle le code proxy du processus A. Le code de proxy du processus A crée une transaction contenant les éléments suivants :
    • Identifiant du nœud
    • Identifiant de la méthode foo() sur le nœud
    • Un tampon contenant une copie des arguments a et b
  2. La transaction est envoyée au pilote du noyau Binder.
  3. Le pilote du noyau Binder détermine que le processus B héberge le nœud.
  4. Le noyau copie l'intégralité de la transaction dans l'espace d'adressage du processus B.
  5. Le noyau trouve un thread dans le processus B pour gérer la transaction et la lui transmet.
  6. Le thread décompresse la transaction, trouve le nœud et envoie la transaction à l'objet de nœud.
  7. L'objet de nœud obtient l'identifiant de fonction à partir de la transaction, décompresse a et b à partir du tampon de transaction, puis stocke a et b dans des variables locales.
  8. L'objet de nœud appelle foo(a, b) sur le code du serveur dans le processus B.
  9. Le résultat de l'appel est renvoyé dans une transaction de réponse, qui est transmise au pilote du noyau, puis renvoyée au proxy appelant dans le processus A.
  10. Le proxy renvoie ce résultat à l'appelant dans le processus A.

Cas d'utilisation de Binder

Binder peut être utilisé dans différents scénarios où la communication entre logiciels dans différents processus doit avoir lieu. Exemple :

  • Une application d'appareil photo utilise Binder pour communiquer avec le serveur de l'appareil photo dans un autre processus. Le serveur de caméras utilise ensuite Binder pour communiquer avec la HAL de caméras dans un autre processus.

  • Une application utilise Binder pour communiquer avec un serveur système dans un autre processus. Le serveur système utilise Binder pour communiquer avec les HAL dans d'autres processus.

  • Une application dans un processus utilise Binder pour communiquer avec une autre application dans un autre processus.

  • Le daemon système responsable de l'installation, de la mise à jour et de la suppression des applications (installd) utilise Binder pour communiquer avec le daemon d'exécution Android ("artd") afin de compiler les applications.