Panoramica del raccoglitore

Binder è un sistema di comunicazione tra processi che consente a due processi su un dispositivo Android di comunicare. Binder fornisce un mezzo per eseguire chiamate di funzioni in un altro processo completamente trasparente al chiamante.

Nei termini del binder, la procedura di chiamata è considerata il client e il relativo endpoint è chiamato proxy del binder o proxy. Al contrario, il processo chiamato è il server e il suo endpoint è chiamato nodo binder o nodo.

Ogni nodo può esporre e implementare la propria interfaccia. Utilizzando un proxy, il client può eseguire metodi su un'interfaccia del nodo come se l'invocazione fosse una chiamata di funzione locale. L'esempio seguente mostra l'invocazione di un metodo:

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

Supponi che il client che chiama foo() sia in esecuzione nel processo A e che il server che implementa foo() sia in esecuzione nel processo B. La Figura 1 mostra come viene eseguita questa chiamata:

Esecuzione della chiamata a Binder.

Figura 1. Esecuzione della chiamata a Binder.

Per eseguire un metodo in un altro processo, come mostrato nella Figura 1, si verifica quanto segue:

  1. Il codice client nel processo A richiama il codice proxy nel processo A. Il codice proxy nel processo A crea una transazione contenente i seguenti elementi:
    • Un identificatore per il nodo
    • Un identificatore per il metodo foo() sul nodo
    • Un buffer contenente una copia degli argomenti a e b
  2. La transazione viene inviata al driver del kernel binder.
  3. Il driver del kernel Binder determina che il processo B ospita il nodo.
  4. Il kernel copia l'intera transazione nello spazio degli indirizzi del processo B.
  5. Il kernel trova un thread nel processo B per gestire la transazione e gliela passa.
  6. Il thread decomprime la transazione, trova il nodo e invia la transazione all'oggetto nodo.
  7. L'oggetto nodo ottiene l'identificatore della funzione dalla transazione, decomprime a e b dal buffer della transazione e memorizza a e b in variabili locali.
  8. L'oggetto nodo chiama foo(a, b) sul codice server nel processo B.
  9. Il risultato della chiamata viene restituito in una transazione di risposta, che viene passata al driver del kernel e poi di nuovo al proxy chiamante nel processo A.
  10. Il proxy restituisce il risultato al chiamante nella procedura A.

Casi d'uso di Binder

Binder può essere utilizzato in una serie di scenari in cui deve avvenire la comunicazione tra software in processi diversi. Ad esempio:

  • Un'app fotocamera utilizza Binder per comunicare con il server della fotocamera in un altro processo. Il server della videocamera utilizza quindi Binder per comunicare con l'HAL della videocamera in un altro processo.

  • Un'app utilizza Binder per comunicare con un server di sistema in un altro processo. Il server di sistema utilizza Binder per comunicare con gli HAL in altri processi.

  • Un'app in un processo utilizza Binder per comunicare con un'altra app in un altro processo.

  • Il daemon di sistema responsabile dell'installazione, dell'aggiornamento e della rimozione delle app (installd) utilizza Binder per comunicare con il daemon di runtime Android ("artd") per compilare le app.