Binder è un sistema di comunicazione tra processi che consente a due processi su un dispositivo con Android di comunicare. Binder fornisce un mezzo per eseguire chiamate di funzioni in un altro processo completamente trasparente al chiamante.
In termini di binder, il processo chiamante è considerato il client e il suo endpoint è chiamato proxy 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 di nodo come se la chiamata fosse una chiamata di funzione locale. L'esempio seguente mostra un metodo chiamato:
int result = someNodeInterface.foo(a, b); // someNodeInterface is a proxy object
Supponiamo 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:
Figura 1. Esecuzione della chiamata a Binder.
Per eseguire un metodo in un altro processo, come mostrato nella Figura 1, si verifica quanto segue:
- 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
aeb
- La transazione viene inviata al driver del kernel binder.
- Il driver del kernel binder determina che il processo B ospita il nodo.
- Il kernel copia l'intera transazione nello spazio degli indirizzi del processo B.
- Il kernel trova un thread nel processo B per gestire la transazione e la passa a questo thread.
- Il thread decomprime la transazione, trova il nodo e invia la transazione all'oggetto nodo.
- L'oggetto nodo ottiene l'identificatore della funzione dalla transazione,
decomprime
aebdal buffer della transazione e li memorizza in variabili locali.ab - L'oggetto nodo chiama
foo(a, b)sul codice server nel processo B. - 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.
- Il proxy restituisce il risultato al chiamante nel processo A.
Casi d'uso di Binder
Binder può essere utilizzato in una serie di scenari in cui deve verificarsi 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 fotocamera utilizza quindi binder per comunicare con la HAL della fotocamera 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 le 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.
AIDL e Binder
Utilizza Android Interface Definition Language (AIDL) per definire le interfacce di programmazione che utilizzano binder per IPC. Per ulteriori informazioni, consulta la panoramica di AIDL.