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. 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 la 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 le envía llamadas, y un proceso de cliente hace 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. Para obtener más detalles sobre los diferentes tiempos 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

AIDL usa el controlador de kernel de Binder para realizar llamadas. Cuando haces una llamada, un identificador de método y todos los objetos se empaquetan en un búfer y se copian en un proceso remoto, donde un subproceso de Binder espera para leer los datos. Una vez que un subproceso de Binder recibe datos para una transacción, busca un objeto de 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.

Interactuar con los servicios del dispositivo

Android incluye algunos comandos para permitir la interacción 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