A Linguagem de definição de interface do Android (AIDL) é uma ferramenta que permite que os usuários
abstraiam 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. O AIDL pode ser usado para implementar uma API de SDK na plataforma, por exemplo, mas a API do 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 um cliente e um servidor ao mesmo tempo, já que pode se referir 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 Serviços de back-end do 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
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 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 é 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 os 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