Descripción general de AIDL

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

AIDL se puede usar entre cualquier proceso en Android: entre componentes de plataforma o entre aplicaciones. Sin embargo, nunca se usa como API para aplicaciones. AIDL se puede usar para implementar una API de SDK en la plataforma, por ejemplo, pero la superficie de la API de SDK nunca contiene las API de AIDL directamente. Para obtener documentación sobre cómo usar AIDL entre aplicaciones directamente, consulte la documentación correspondiente para desarrolladores de Android . Cuando se usa 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 Stable AIDL .

Ejemplo

Aquí hay un ejemplo de interfaz 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 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 estar haciendo referencia a varias interfaces. Para obtener más detalles sobre el lenguaje AIDL, consulte Lenguaje AIDL . Para obtener más detalles sobre los diversos tiempos de ejecución disponibles para usar estas interfaces, consulte Backends de AIDL . Estas declaraciones de tipo son exactamente como una declaración de clase en un idioma determinado, pero funcionan en todos los procesos.

Cómo funciona

AIDL utiliza el controlador del núcleo del aglutinante para realizar llamadas. Cuando realiza 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 enlace espera para leer los datos. Una vez que un subproceso de enlace recibe datos para una transacción, el subproceso busca un objeto de código auxiliar 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 de 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 empaquetar ni desempaquetar.

Interactuar con servicios en el dispositivo

Android viene con algunos comandos para permitir la interacción con los servicios en el dispositivo. Probar:

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