Android Interface Definition Language (AIDL) è uno strumento che consente agli utenti di eseguire l'astrazione dell'IPC. Data un'interfaccia (specificata in un file .aidl
), vari sistemi di compilazione utilizzano il file binario aidl
per creare associazioni C++ o Java in modo che questa interfaccia possa essere utilizzata in più processi, indipendentemente dal runtime o dalla dimensione in bit.
AIDL può essere utilizzato tra qualsiasi processo in Android: tra componenti della piattaforma o tra app. Tuttavia, non viene mai utilizzata come API per le app. Ad esempio, AIDL può essere utilizzato per implementare un'API SDK nella piattaforma, ma l'interfaccia API SDK non contiene mai direttamente API AIDL. Per la documentazione su come utilizzare AIDL direttamente tra le app, consulta la corrispondente documentazione per gli sviluppatori Android. Quando AIDL viene utilizzato tra componenti della piattaforma aggiornati separatamente, come APEX (a partire da Android 10) o HAL (a partire da Android 11), è necessario utilizzare il sistema di controllo delle versioni noto come Stable AIDL.
Esempio
Ecco un esempio di interfaccia AIDL:
package my.package;
import my.package.Baz; // defined elsewhere
interface IFoo {
void doFoo(Baz baz);
}
Un processo server registra un'interfaccia e gestisce le chiamate a essa, mentre un processo client fa chiamate a queste interfacce. In molti casi, un processo agisce sia come client sia come server, poiché potrebbe fare riferimento a più interfacce. Per maggiori dettagli sul linguaggio AIDL, consulta Lingua AIDL. Per ulteriori dettagli sui vari runtime disponibili per l'utilizzo di queste interfacce, consulta Backend AIDL. Queste dichiarazioni di tipo sono esattamente come una dichiarazione di classe in un determinato linguaggio, ma funzionano in più processi.
Come funziona
AIDL utilizza il driver del kernel Binder per effettuare chiamate. Quando effettui una chiamata, un identificativo metodo e tutti gli oggetti vengono impacchettati in un buffer e copiati in un processo remoto in cui un thread binder attende di leggere i dati. Una volta che un thread del binder riceve i dati per una transazione, il thread cerca un oggetto stub nativo nel processo locale e questa classe estrae i dati ed esegue una chiamata a un oggetto dell'interfaccia locale. Questo oggetto dell'interfaccia locale è quello creato e registrato da un processo del server. Quando le chiamate vengono effettuate nello stesso processo e nello stesso backend, non esistono oggetti proxy, pertanto le chiamate sono dirette senza imballaggio o sballaggio.
Interagire con i servizi sul dispositivo
Android è dotato di alcuni comandi per consentire l'interazione con i servizi sul dispositivo. Prova:
adb shell dumpsys --help # listing and dumping services
adb shell service --help # sending commands to services for testing