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 la IPC. Dada una interfaz (especificada en un archivo .aidl), varios sistemas de compilación usan el archivo 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 cantidad de bits que haya allí.

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

Ejemplo

A continuación, se muestra 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 atiende las llamadas a ella, y un proceso de cliente realiza llamadas a esas interfaces. En muchos casos, un proceso actúa como cliente y servidor, ya que puede hacer referencia a varias interfaces. Para obtener más detalles sobre el lenguaje de AIDL, consulta Lenguaje de AIDL. Para obtener más detalles sobre los diferentes tiempos de ejecución disponibles para usar estas interfaces, consulta Back-ends 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

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 para una transacción, el subproceso busca un objeto stub nativo en el proceso local, y esta clase desempaqueta los datos y realiza una llamada en un objeto de interfaz local. Este objeto de interfaz local es el que crea y registra un proceso del servidor. Cuando se realizan llamadas en el mismo proceso y el mismo backend, no existen objetos proxy, por lo que las llamadas son directas sin ningún empaquetado o desempaquetado. Para obtener más información, consulta la descripción general de Binder.

Interactuar con los servicios en el dispositivo

Android incluye algunos comandos que permiten interactuar con los servicios del dispositivo. Prueba lo siguiente:

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