Panoramica 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 build 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 dal livello di bit.

AIDL può essere usato in qualsiasi processo in Android, tra componenti della piattaforma o tra app. Tuttavia, non viene mai utilizzata come API per le app. Ad esempio, è possibile utilizzare AIDL per implementare un'API SDK nella piattaforma, ma la piattaforma API SDK non contiene mai direttamente API AIDL. Per la documentazione su come utilizzare direttamente AIDL tra le app, consulta la documentazione per sviluppatori Android corrispondente. Se l'AIDL viene utilizzata tra i componenti della piattaforma che vengono aggiornati separatamente, ad esempio 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, mentre un processo client effettua chiamate a queste interfacce. In molti casi, un processo agisce sia come client sia come server, in quanto può fare riferimento a più interfacce. Per ulteriori dettagli sul linguaggio AIDL, vedi 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 una determinata lingua, ma funzionano in più processi.

Come funziona

AIDL utilizza il driver kernel binder per effettuare chiamate. Quando si effettua una chiamata, un identificatore del metodo e tutti gli oggetti vengono compressi in un buffer e copiati in un processo remoto in cui un thread di binder attende di leggere i dati. Quando un thread di 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 su un oggetto dell'interfaccia locale. L'oggetto dell'interfaccia locale è quello creato e registrato da un processo server. Quando le chiamate vengono effettuate nello stesso processo e nello stesso backend, non esistono oggetti proxy, quindi le chiamate sono dirette senza alcuna pacchettizzazione o decompressione.

Interagire con i servizi sul dispositivo

Android è dotato di 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