Présentation de l'AIDL

Le langage de définition d'interface Android (AIDL) est un outil qui permet aux utilisateurs de faire abstraction de l'IPC. Compte tenu d' une interface (spécifiée dans un .aidl fichier), divers systèmes de construction utilisent la aidl binaire pour construire des liaisons C ++ ou Java pour que cette interface peut être utilisée dans tous les processus, quel que soit le moteur d' exécution ou bitness là.

AIDL peut être utilisé entre n'importe quel processus dans Android : entre les composants de la plate-forme ou entre les 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 de l'API SDK ne contient jamais directement les API AIDL. Pour la documentation sur l'utilisation de AIDL entre les applications directement, consultez correspondant documentation pour les développeurs Android . Lorsque AIDL est utilisé entre des composants de plates - formes qui sont mis à jour séparément, tels que les sommets ( à partir de 10 applications) ou HAL ( à partir de 11 applications), le système connu sous le nom de version AIDL Stable 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); // synchronous method
        oneway void doFoo(int a); // async method
    }

Android 10 et versions ultérieures prennent en charge les déclarations parcellaires. Par exemple:

    package my.package;

    import my.package.Boo;

    parcelable Baz {
        @utf8InCpp String name = "baz";
        Boo boo;
    }

Android 11 et versions ultérieures prennent en charge les déclarations d'énumération. Par exemple:

    package my.package;

    enum Boo {
        A = 1 * 4,
        B = 3,
    }

Android 12 et versions ultérieures prennent en charge les déclarations syndicales. Par exemple:

    package my.package;

    import my.package.FooSettings;
    import my.package.BarSettings;

    union Settings {
        FooSettings fooSettings;
        BarSettings barSettings;
        @utf8InCpp String str;
        int number;
    }

Android T (AOSP expérimental) et supérieur prennent en charge les déclarations de type imbriquées. Par exemple:

    package my.package;

    import my.package.Baz;

    interface IFoo {
        void doFoo(Baz.Nested nested);  // defined my/package/Baz.aidl
        void doBar(Bar bar);            // defined below

        parcelable Bar { ... }          // union/enum types can be nested, while
                                        // an interface can't.
    }

Un processus serveur enregistre une interface et sert à des appels, et un processus client effectue des appels à ces interfaces. Dans de nombreux cas, un processus agit à la fois comme client et comme serveur puisqu'il peut faire référence à plusieurs interfaces. Pour plus de détails sur les différents runtimes disponibles pour utiliser ces interfaces, voir backends AIDL . Ces déclarations de type sont exactement comme une déclaration de classe dans un langage donné, mais elles fonctionnent à travers les processus.

Comment ça fonctionne

AIDL utilise le pilote du noyau du classeur pour effectuer des appels. Lorsque vous effectuez un appel, un identificateur de méthode et tous les objets sont placés dans un tampon et copiés dans un processus distant où un thread de classeur attend de lire les données. Une fois qu'un thread de classeur reçoit des données pour une transaction, le thread recherche un objet stub natif dans le processus local, et cette classe décompresse les données et appelle un objet d'interface local. Cet objet d'interface locale est celui qu'un processus serveur crée et enregistre. Lorsque les appels sont effectués dans le même processus et le même backend, aucun objet proxy n'existe et les appels sont donc directs sans aucun emballage ou déballage.

Interaction avec les services sur l'appareil

Android est livré avec quelques commandes pour permettre l'interaction avec les services sur l'appareil. Essayer:

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