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. Considerando uma interface (especificada em um arquivo .aidl), vários sistemas de build usam o binário aidl para construir vinculações em C++ ou Java. Assim, essa interface pode ser usada em vários processos, independentemente do tempo de execução ou da arquitetura.

A AIDL pode ser usada entre qualquer processo no Android: entre componentes da plataforma ou entre apps. No entanto, ele nunca é usado como uma API para apps. O AIDL pode ser usado para implementar uma API do SDK na plataforma, por exemplo, mas a superfície da API do SDK nunca contém APIs AIDL diretamente. Para documentação sobre como usar a AIDL diretamente entre apps, consulte a documentação para desenvolvedores Android. Quando a AIDL é usada entre componentes da plataforma atualizados separadamente, como APEXs (a partir do Android 10) ou HALs (a partir do Android 11), é necessário usar o sistema de controle de versões conhecido como AIDL estável.

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 às chamadas dela, e um processo de cliente faz chamadas para essas interfaces. Em muitos casos, um processo atua como cliente e servidor, já que pode estar referenciando várias interfaces. Para mais detalhes sobre a linguagem AIDL, consulte Linguagem AIDL. Para mais detalhes sobre os vários runtimes disponíveis para usar essas interfaces, consulte Backends AIDL. Essas declarações de tipo são exatamente como uma declaração de classe em uma determinada linguagem, mas funcionam em todos os processos.

Como funciona

A AIDL usa o driver do kernel binder para fazer chamadas. Quando você faz uma chamada, um identificador de método e todos os objetos são compactados em um buffer e copiados para um processo remoto em que uma linha de execução de binder aguarda para ler os dados. Quando uma linha de execução do binder recebe dados para 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 é criado e registrado por um processo de servidor. Quando as chamadas são feitas no mesmo processo e no mesmo backend, não há objetos proxy. Portanto, as chamadas são diretas, sem qualquer empacotamento ou desempacotamento. Para mais informações, consulte a visão geral do Binder.

Interagir com serviços no dispositivo

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

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