A Linguagem de definição de interface do Android (AIDL, na sigla em inglês) é uma ferramenta que permite aos usuários abstrair a IPC. Com uma interface (especificada em um .aidl
arquivo), vários sistemas de build usam o aidl binário para construir vinculações em C++ ou Java
para que essa interface possa ser usada em processos, independentemente do
ambiente de execução ou da largura 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 documentação sobre como usar a AIDL entre apps diretamente, consulte a documentação correspondente para desenvolvedores Android. Quando a AIDL é usada entre componentes da plataforma que são atualizados separadamente, como APEXs (a partir do Android 10) ou HALs (a partir do Android 11), o sistema de controle de versões 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, 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 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 processos.
Como funciona
A AIDL usa o driver de kernel do 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 do 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, e essa classe descompacta os dados e faz uma chamada em um objeto de 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 há objetos proxy, e as chamadas são diretas, sem compactação ou descompactação. 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