Présentation d'AIDL

Android Interface Definition Language (AIDL) est un outil qui permet aux utilisateurs d'extraire l'IPC. À partir d'une interface (spécifiée dans un fichier .aidl), différents systèmes de compilation utilisent le binaire aidl pour construire des liaisons C++ ou Java. Cette interface peut ainsi être utilisée dans tous les processus, quels que soient l'environnement d'exécution ou le nombre de bits présents.

AIDL peut être utilisé entre n'importe quel processus Android: entre des composants de plate-forme ou entre des applications. Cependant, il n'est jamais utilisé comme API pour les applications. AIDL peut être utilisé pour implémenter une API SDK dans la plate-forme, par exemple, mais la surface d'API du SDK ne contient jamais d'API AIDL directement. Pour en savoir plus sur l'utilisation directe d'AIDL entre les applications, consultez la documentation correspondante pour les développeurs Android. Lorsqu'AIDL est utilisé entre des composants de plate-forme mis à jour séparément, tels que les APEX (à partir d'Android 10) ou les HAL (à partir d'Android 11), le système de gestion des versions appelé Stable AIDL doit être utilisé.

Exemple

Voici un exemple d'interface AIDL:

    package my.package;

    import my.package.Baz; // defined elsewhere

    interface IFoo {
        void doFoo(Baz baz);
    }

Un processus serveur enregistre une interface et diffuse des appels vers celle-ci, tandis qu'un processus client appelle ces interfaces. Dans de nombreux cas, un processus agit à la fois en tant que client et serveur, car il peut faire référence à plusieurs interfaces. Pour en savoir plus sur le langage AIDL, consultez la page Langage AIDL. Pour en savoir plus sur les différents environnements d'exécution disponibles pour utiliser ces interfaces, consultez la page Backends AIDL. Ces déclarations de type sont exactement comme une déclaration de classe dans un langage donné, mais elles fonctionnent sur plusieurs processus.

Fonctionnement

AIDL utilise le pilote du noyau de liaison pour effectuer les appels. Lorsque vous effectuez un appel, un identifiant de méthode et tous les objets sont empaquetés dans un tampon et copiés dans un processus à distance dans lequel un thread de liaison attend de lire les données. Une fois qu'un thread de liaison reçoit des données pour une transaction, il recherche un objet bouchon natif dans le processus local, et cette classe décompresse les données et effectue un appel sur un objet d'interface local. Cet objet d'interface locale est celui qu'un processus de serveur crée et enregistre. Lorsque les appels sont effectués dans le même processus et sur le même backend, aucun objet proxy n'existe. Les appels sont donc directs, sans aucun empaquetage ni décompression.

Interagir avec les services sur l'appareil

Android est fourni avec quelques commandes permettant d'interagir avec les services sur l'appareil. Conseil :

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