A Android Interface Definition Language (AIDL) é uma ferramenta que permite aos usuários abstrair o IPC. Dada uma interface (especificada em um arquivo .aidl
), vários sistemas de construção usam o binário aidl
para construir ligações C++ ou Java para que essa interface possa ser usada entre processos, independentemente do tempo de execução ou do número de bits existente.
AIDL pode ser usado entre qualquer processo no Android: entre componentes da plataforma ou entre aplicativos. No entanto, nunca é usado como API para aplicativos. 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 obter documentação sobre como usar AIDL diretamente entre aplicativos, consulte a documentação correspondente para desenvolvedores Android . Quando o AIDL é usado 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 Stable AIDL deve ser usado.
Exemplo
Aqui está um exemplo de interface AIDL:
package my.package;
import my.package.Baz; // defined elsewhere
interface IFoo {
void doFoo(Baz baz);
}
Um processo servidor registra uma interface e atende chamadas para ela, e um processo cliente faz chamadas para essas interfaces. Em muitos casos, um processo atua tanto como cliente quanto como servidor, pois pode fazer referência a múltiplas interfaces. Para mais detalhes sobre a linguagem AIDL, veja Linguagem AIDL . Para obter mais detalhes sobre os vários tempos de execução 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 entre processos.
Como funciona
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 compactados em um buffer e copiados para um processo remoto onde um encadeamento fichário espera para ler os dados. Depois que um encadeamento fichário recebe dados para uma transação, o encadeamento procura um objeto stub nativo no processo local e essa classe descompacta os dados e faz uma chamada em um objeto de interface local. Este objeto de interface local é aquele que um processo servidor cria e registra. Quando as chamadas são feitas no mesmo processo e no mesmo back-end, não existem objetos proxy e, portanto, as chamadas são diretas, sem qualquer empacotamento ou descompactação.
Interagindo com serviços no dispositivo
O Android vem com alguns comandos para permitir a interação com os serviços do dispositivo. Tentar:
adb shell dumpsys --help # listing and dumping services
adb shell service --help # sending commands to services for testing