Binder es un sistema de comunicación entre procesos que permite que dos procesos en un dispositivo Android se comuniquen. Binder proporciona un medio para ejecutar llamadas a funciones en otro proceso que es completamente transparente para el llamador.
En términos de vinculación, el proceso de llamada se considera el cliente y su extremo se denomina proxy de vinculación o proxy. Por el contrario, el proceso al que se llama es el servidor y su extremo se denomina nodo de vinculador o nodo.
Cada nodo puede exponer e implementar su propia interfaz. Además, con un proxy, el cliente puede ejecutar métodos en una interfaz de nodo como si la invocación fuera una llamada a función local. En el siguiente ejemplo, se muestra un método que se invoca:
int result = someNodeInterface.foo(a, b); // someNodeInterface is a proxy object
Supón que el cliente que llama a foo()
se ejecuta en el proceso A y el servidor que implementa foo()
se ejecuta en el proceso B. En la figura 1, se muestra cómo se ejecuta esta llamada:
Figura 1: Es la ejecución de la llamada de Binder.
Para ejecutar un método en otro proceso, como se muestra en la figura 1, ocurre lo siguiente:
- El código del cliente en el proceso A invoca el código del proxy en el proceso A. El código de proxy en el proceso A crea una transacción que contiene los siguientes elementos:
- Es un identificador del nodo.
- Es un identificador para el método
foo()
en el nodo. - Un búfer que contiene una copia de los argumentos
a
yb
- La transacción se envía al controlador del kernel del vinculador.
- El controlador del kernel de Binder determina que el proceso B aloja el nodo.
- El kernel copia toda la transacción en el espacio de direcciones del proceso B.
- El kernel encuentra un subproceso en el proceso B para controlar la transacción y se la pasa.
- El subproceso desempaqueta la transacción, encuentra el nodo y envía la transacción al objeto del nodo.
- El objeto de nodo obtiene el identificador de la función de la transacción, desempaqueta
a
yb
del búfer de la transacción, y almacenaa
yb
en variables locales. - El objeto de nodo llama a
foo(a, b)
en el código del servidor en el proceso B. - El resultado de la llamada se devuelve en una transacción de respuesta, que se pasa al controlador del kernel y, luego, de vuelta al proxy de llamada en el proceso A.
- El proxy devuelve ese resultado a la persona que llamó en el proceso A.
Casos de uso de Binder
Binder se puede usar en una variedad de situaciones en las que debe ocurrir la comunicación entre software en diferentes procesos. Por ejemplo:
Una app de cámara usa Binder para comunicarse con el servidor de cámara en otro proceso. Luego, el servidor de la cámara usa Binder para comunicarse con el HAL de la cámara en otro proceso.
Una app usa el binder para comunicarse con un servidor del sistema en otro proceso. El servidor del sistema usa Binder para comunicarse con las HAL en otros procesos.
Una app en un proceso usa Binder para comunicarse con otra app en otro proceso.
El daemon del sistema responsable de instalar, actualizar y quitar apps (
installd
) usa Binder para comunicarse con el daemon del tiempo de ejecución de Android ("artd") para compilar apps.