Le langage de définition d'interface Android (AIDL, Android Interface Definition Language) est un outil qui permet aux utilisateurs d'abstraire l'IPC. Étant donné une interface (spécifiée dans un .aidl
fichier), différents systèmes de compilation utilisent le binaire aidl pour construire des liaisons C++ ou Java
afin que cette interface puisse être utilisée dans tous les processus, quels que soient l'environnement d'exécution
ou la largeur de bits.
AIDL peut être utilisé entre n'importe quel processus dans Android : entre des composants de plate-forme ou entre des applications. Toutefois, 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 d'API AIDL. Pour obtenir de la documentation sur l'utilisation directe d'AIDL entre des applications, consultez la documentation correspondante pour les développeurs Android documentation. Lorsque 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 traite les appels qui lui sont adressés, tandis qu'un processus client appelle ces interfaces. Dans de nombreux cas, un processus agit à la fois comme client et comme serveur, car il peut faire référence à plusieurs interfaces. Pour en savoir plus sur le langage AIDL, consultez la section Langage AIDL. Pour en savoir plus sur les différents environnements d'exécution disponibles pour utiliser ces interfaces, consultez la section Backends AIDL. Ces déclarations de type sont exactement comme une déclaration de classe dans un langage donné, mais elles fonctionnent dans tous les processus.
Fonctionnement
AIDL utilise le pilote de noyau Binder pour effectuer des appels. Lorsque vous effectuez un appel, un identifiant de méthode et tous les objets sont regroupés dans un tampon et copiés dans un processus distant où un thread Binder attend de lire les données. Une fois qu'un thread Binder reçoit des données pour une transaction, il recherche un objet stub natif dans le processus local. Cette classe décompresse les données et effectue un appel sur un objet d'interface local. Cet objet d'interface local est celui qu'un processus serveur crée et enregistre. Lorsque des appels sont effectués dans le même processus et le même backend, aucun objet proxy n'existe. Les appels sont donc directs, sans compression ni décompression. Pour en savoir plus, consultez la présentation de Binder.
Interagir avec les services sur l'appareil
Android est fourni avec quelques commandes permettant d'interagir avec les services sur l'appareil. Essayez les suggestions suivantes :
adb shell dumpsys --help # listing and dumping services
adb shell service --help # sending commands to services for testing