Panoramica di AIDL

Android Interface Definition Language (AIDL) è uno strumento che consente agli utenti di astrarre l'IPC. Data un'interfaccia (specificata in un file .aidl), vari sistemi di compilazione utilizzano il binario aidl per costruire binding C++ o Java in modo che questa interfaccia possa essere utilizzata in tutti i processi, indipendentemente dal runtime o dalla bitness.

AIDL può essere utilizzato tra qualsiasi processo in Android: tra i componenti della piattaforma o tra le app. Tuttavia, non viene mai utilizzata come API per le app. AIDL può essere utilizzato per implementare un'API SDK nella piattaforma, ad esempio, ma la superficie dell'API SDK non contiene mai direttamente API AIDL. Per la documentazione su come utilizzare AIDL direttamente tra le app, consulta la documentazione per gli sviluppatori Android. Quando AIDL viene utilizzato tra componenti della piattaforma aggiornati separatamente, ad esempio APEX (a partire da Android 10) o HAL (a partire da Android 11), deve essere utilizzato il sistema di controllo delle versioni noto come AIDL stabile.

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, mentre un processo client effettua chiamate a queste interfacce. In molti casi, un processo funge sia da client che da server, in quanto può fare riferimento a più interfacce. Per ulteriori dettagli sul linguaggio AIDL, consulta Linguaggio AIDL. Per ulteriori dettagli sui vari runtime disponibili per utilizzare queste interfacce, consulta Backend AIDL. Queste dichiarazioni di tipo sono esattamente come una dichiarazione di classe in una determinata lingua, ma funzionano tra i processi.

Come funziona

AIDL utilizza il driver del kernel binder per effettuare chiamate. Quando effettui una chiamata, un identificatore del metodo e tutti gli oggetti vengono inseriti in un buffer e copiati in un processo remoto in cui un thread binder attende di leggere i dati. Quando un thread binder riceve i dati per una transazione, il thread cerca un oggetto stub nativo nel processo locale e questa classe decomprime i dati ed effettua una chiamata a un oggetto interfaccia locale. Questo oggetto di interfaccia locale è quello che un processo server crea e registra. Quando le chiamate vengono effettuate nello stesso processo e nello stesso backend, non esistono oggetti proxy, quindi le chiamate sono dirette senza alcun packing o unpacking. Per ulteriori informazioni, consulta la panoramica del raccoglitore.

Interagire con i servizi sul dispositivo

Android include alcuni comandi che consentono di interagire con i servizi sul dispositivo. Prova:

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