Visão geral do Binder

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 .

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:

Execução de chamada de vinculação.

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:

  1. 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 e b.
  2. A transação é enviada ao driver do kernel binder.
  3. O driver do kernel binder determina que o processo B hospeda o nó.
  4. O kernel copia toda a transação para o espaço de endereço do processo B.
  5. O kernel encontra uma linha de execução no processo B para processar a transação e a transmite a ela.
  6. A linha executa o desempacotamento da transação, encontra o nó e envia a transação para o objeto do nó.
  7. O objeto de nó recebe o identificador da função da transação, descompacta a e b do buffer de transação e armazena a e b em variáveis locais.
  8. O objeto de nó chama foo(a, b) no código do servidor no processo B.
  9. 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.
  10. 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.