O Binder é um sistema de comunicação entre processos que permite que dois processos em um dispositivo Android se comuniquem. O Binder oferece uma maneira de executar chamadas de função em outro processo que é completamente transparente para o autor da chamada.
Em termos de binder, o processo de chamada é considerado o cliente, e o endpoint é chamado de proxy do binder ou proxy. Por outro lado, o processo que está sendo chamado é o servidor, e o endpoint dele é chamado de nó de vinculação ou nó.
Cada nó pode expor e implementar a própria interface. E, usando um proxy, o cliente pode executar métodos em uma interface de nó como se a invocação fosse uma chamada de função local. O exemplo a seguir mostra um método sendo invocado:
int result = someNodeInterface.foo(a, b); // someNodeInterface is a proxy object
Suponha que o cliente que chama foo()
esteja sendo executado no processo A e o servidor que implementa foo()
esteja sendo executado no processo B. A Figura 1 mostra como essa chamada é
executada:
Figura 1. Execução de chamada de vinculação.
Para executar um método em outro processo, conforme mostrado na Figura 1, ocorre o seguinte:
- O código do cliente no processo A invoca o código do proxy no processo A. O código
de proxy no processo A cria uma transação que contém os seguintes itens:
- Um identificador do nó
- Um identificador do método
foo()
no nó. - Um buffer que contém uma cópia dos argumentos
a
eb
.
- A transação é enviada ao driver do kernel binder.
- O driver do kernel binder determina que o processo B hospeda o nó.
- O kernel copia toda a transação para o espaço de endereço do processo B.
- O kernel encontra uma linha de execução no processo B para processar a transação e a transmite a ela.
- A linha executa o desempacotamento da transação, encontra o nó e envia a transação para o objeto do nó.
- O objeto de nó recebe o identificador da função da transação,
descompacta
a
eb
do buffer de transação e armazenaa
eb
em variáveis locais. - O objeto de nó chama
foo(a, b)
no código do servidor no processo B. - O resultado da chamada é retornado em uma transação de resposta, que é transmitida ao driver do kernel e, em seguida, de volta ao proxy de chamada no processo A.
- O proxy retorna esse resultado para o autor da chamada no processo A.
Casos de uso do Binder
O Binder pode ser usado em vários cenários em que a comunicação entre softwares em processos diferentes precisa ocorrer. Exemplo:
Um app de câmera usa o binder para se comunicar com o servidor de câmera em outro processo. Em seguida, o servidor de câmera usa o binder para se comunicar com a HAL da câmera em outro processo.
Um app usa o binder para se comunicar com um servidor do sistema em outro processo. O servidor do sistema usa o binder para se comunicar com HALs em outros processos.
Um app em um processo usa o binder para se comunicar com um app diferente em outro processo.
O daemon do sistema responsável por instalar, atualizar e remover apps (
installd
) usa o binder para se comunicar com o daemon de tempo de execução do Android ("artd") e compilar apps.