Visão geral de AIDL

A Linguagem de definição de interface do Android (AIDL) é uma ferramenta que permite aos usuários abstrair a IPC. Dada uma interface (especificada em um arquivo .aidl), vários sistemas de build usam o binário aidl para criar vinculações C++ ou Java para que essa interface possa ser usada em vários processos, independentemente do ambiente de execução ou do número de bits.

O AIDL pode ser usado entre qualquer processo no Android: entre componentes da plataforma ou entre apps. No entanto, ela nunca é usada como uma API para apps. O AIDL pode ser usado para implementar uma API SDK na plataforma, por exemplo, mas a superfície da API SDK nunca contém APIs AIDL diretamente. Para saber como usar a AIDL entre apps diretamente, consulte a documentação para desenvolvedores Android correspondente. Quando a AIDL é usada entre componentes da plataforma que são atualizados separadamente, como APEXes (a partir do Android 10) ou HALs (a partir do Android 11), o sistema de versionamento conhecido como AIDL estável precisa ser usado.

Exemplo

Confira um exemplo de interface AIDL:

    package my.package;

    import my.package.Baz; // defined elsewhere

    interface IFoo {
        void doFoo(Baz baz);
    }

Um processo de servidor registra uma interface e atende chamadas para ela. Um processo de cliente faz chamadas para essas interfaces. Em muitos casos, um processo atua como cliente e servidor, já que pode referenciar várias interfaces. Para mais detalhes sobre a linguagem AIDL, consulte Linguagem AIDL. Para mais detalhes sobre os vários ambientes de execução disponíveis para usar essas interfaces, consulte Serviços de back-end AIDL. Essas declarações são exatamente como uma declaração de classe em um determinado idioma, mas funcionam em vários processos.

Como funciona

O AIDL usa o driver do kernel do binder para fazer chamadas. Quando você faz uma chamada, um identificador de método e todos os objetos são empacotados em um buffer e copiados para um processo remoto em que uma linha de execução de vinculação aguarda para ler os dados. Quando uma linha de execução de vinculação recebe dados de uma transação, ela procura um objeto stub nativo no processo local. Essa classe descompacta os dados e faz uma chamada em um objeto de interface local. Esse objeto de interface local é o que um processo do servidor cria e registra. Quando as chamadas são feitas no mesmo processo e no mesmo back-end, nenhum objeto proxy existe. Portanto, as chamadas são diretas, sem empacotamento ou desempacotamento.

Interagir com serviços no dispositivo

O Android vem com alguns comandos para permitir a interação com os serviços no dispositivo. Tente:

    adb shell dumpsys --help # listing and dumping services
    adb shell service --help # sending commands to services for testing