Descripción general de AIDL

El lenguaje de definición de la interfaz de Android (AIDL) es una herramienta que permite a los usuarios abstraer IPC. En una interfaz (especificada en un archivo .aidl), varios sistemas de compilación usan el objeto binario aidl para construir vinculaciones de C++ o Java, de modo que esta interfaz se pueda usar en todos los procesos, independientemente del tiempo de ejecución o la tasa de bits.

El AIDL se puede usar entre cualquier proceso en Android: entre componentes de plataforma o entre apps. Sin embargo, nunca se usa como una API para apps. El AIDL se puede usar para implementar una API del SDK en la plataforma, por ejemplo, pero la plataforma de la API del SDK nunca contiene APIs de AIDL de forma directa. Si quieres obtener documentación para usar el AIDL entre apps directamente, consulta la documentación correspondiente para desarrolladores de Android. Cuando se usa el AIDL entre componentes de plataforma que se actualizan por separado, como APEX (a partir de Android 10) o HAL (a partir de Android 11), se debe usar el sistema de control de versiones conocido como AIDL estable.

Ejemplo

Este es un ejemplo de interfaz de AIDL:

    package my.package;

    import my.package.Baz; // defined elsewhere

    interface IFoo {
        void doFoo(Baz baz);
    }

Un proceso de servidor registra una interfaz y entrega llamadas a ella, y un proceso de cliente realiza llamadas a esas interfaces. En muchos casos, un proceso actúa como un cliente y un servidor, ya que puede hacer referencia a varias interfaces. Para obtener más detalles sobre el lenguaje del AIDL, consulta Lenguaje del AIDL. Si quieres obtener más información sobre los diversos entornos de ejecución disponibles para usar estas interfaces, consulta Backends de AIDL. Estas declaraciones de tipo son exactamente como una declaración de clase en un lenguaje determinado, pero funcionan en todos los procesos.

Cómo funciona

El AIDL usa el controlador del kernel de Binder para realizar llamadas. Cuando realizas una llamada, un identificador de método y todos los objetos se empaquetan en un búfer y se copian en un proceso remoto en el que un subproceso de Binder espera para leer los datos. Una vez que un subproceso de Binder recibe datos de una transacción, el subproceso busca un objeto stub nativo en el proceso local, y esta clase descomprime los datos y realiza una llamada a un objeto de interfaz local. Este objeto de interfaz local es el que crea y registra un proceso del servidor. Cuando las llamadas se realizan en el mismo proceso y el mismo backend, no existen objetos proxy, por lo que las llamadas son directas sin ningún tipo de empaquetado ni desempaquetado.

Cómo interactuar con los servicios en el dispositivo

Android incluye algunos comandos que permiten la interacción con los servicios en el dispositivo. Prueba lo siguiente:

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