Visão geral de AIDL

A Linguagem de definição de interface do Android (AIDL) é uma ferramenta que permite que os usuários abstraem a IPC. Com uma interface especificada em um arquivo .aidl, vários sistemas de build usam o binário aidl para criar vinculações C++ ou Java. Assim, essa interface pode ser usada em vários processos, seja qual for o ambiente de execução ou a quantidade de bits.

A AIDL pode ser usada entre qualquer processo no Android: entre componentes da plataforma ou entre apps. No entanto, ela nunca é usada como uma API para apps. A AIDL pode ser usada 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 conferir a documentação sobre como usar a AIDL diretamente entre apps, consulte a documentação correspondente 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 a chamadas para ela, e um processo de cliente faz chamadas para essas interfaces. Em muitos casos, um processo atua como cliente e como servidor, já que pode fazer referência a 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 Back-ends da AIDL. Essas declarações de tipo são exatamente como uma declaração de classe em um determinado idioma, mas funcionam em vários processos.

Como funciona

A AIDL usa o driver do kernel de vinculação 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 vinculação aguarda a leitura dos dados. Quando uma linha de execução de vinculação recebe dados de uma transação, ela procura um objeto de stub nativo no processo local. Essa classe descompacta os dados e faz uma chamada em um objeto da interface local. Esse objeto de interface local é aquele que um processo de servidor cria e registra. Quando as chamadas são feitas no mesmo processo e no mesmo back-end, não existem objetos de proxy e, portanto, as chamadas são diretas sem empacotamento ou descompactação.

Interagir com os serviços no dispositivo

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

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