Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Descripción general de AIDL

El lenguaje de definición de interfaz de Android (AIDL) es una herramienta que permite a los usuarios abstraer el IPC. Dada una interfaz (especificado en un .aidl archivo), varios sistemas de creación utilizan la aidl binaria para construir enlaces de C ++ o Java para que esta interfaz se puede utilizar en los procesos, sin importar el tiempo de ejecución o no valor de bits.

AIDL se puede utilizar entre cualquier proceso en Android: entre componentes de plataforma o entre aplicaciones. Sin embargo, nunca se utiliza como API para aplicaciones. AIDL se puede utilizar para implementar una API de SDK en la plataforma, por ejemplo, pero la superficie de la API de SDK nunca contiene API de AIDL directamente. Para obtener documentación acerca de cómo usar AIDL entre aplicaciones directamente, véase el correspondiente Android documentación de los desarrolladores . Cuando AIDL se utiliza entre componentes de la plataforma que se actualizan por separado, tales como vértices (a partir de Android 10) o HAL (a partir de Android 11), el sistema de versiones conocido como AIDL Stable debe ser utilizado.

Ejemplo

Aquí hay un ejemplo de interfaz AIDL:

    package my.package;

    import my.package.Baz; // defined elsewhere

    interface IFoo {
        void doFoo(Baz baz); // synchronous method
        oneway void doFoo(int a); // async method
    }

Android 10 y versiones posteriores admiten declaraciones parcelables. Por ejemplo:

    package my.package;

    import my.package.Boo;

    parcelable Baz {
        @utf8InCpp String name = "baz";
        Boo boo;
    }

Declaraciones de enumeración de compatibilidad con Android 11 y versiones posteriores. Por ejemplo:

    package my.package;

    enum Boo {
        A = 1 * 4,
        B = 3,
    }

Android 12 y versiones posteriores admiten declaraciones sindicales. Por ejemplo:

    package my.package;

    import my.package.FooSettings;
    import my.package.BarSettings;

    union Settings {
        FooSettings fooSettings;
        BarSettings barSettings;
        @utf8InCpp String str;
        int number;
    }

Android T (AOSP experimental) y versiones superiores admiten declaraciones de tipo anidado. Por ejemplo:

    package my.package;

    import my.package.Baz;

    interface IFoo {
        void doFoo(Baz.Nested nested);  // defined my/package/Baz.aidl
        void doBar(Bar bar);            // defined below

        parcelable Bar { ... }          // union/enum types can be nested, while
                                        // an interface can't.
    }

Un proceso de servidor registra una interfaz y sirve llamadas a la misma, y un proceso de cliente realiza llamadas a esas interfaces. En muchos casos, un proceso actúa como cliente y como servidor, ya que puede hacer referencia a múltiples interfaces. Para más detalles sobre los diferentes tiempos de ejecución disponibles para utilizar estas interfaces, consulte backends AIDL . Estas declaraciones de tipo son exactamente como una declaración de clase en un lenguaje dado, pero funcionan en todos los procesos.

Cómo funciona

AIDL utiliza el controlador del kernel del vinculador 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 descomprime 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 existe ningún objeto proxy, por lo que las llamadas son directas sin ningún tipo de empaquetado o desempaquetado.

Interactuar con los servicios del dispositivo

Android viene con algunos comandos para permitir interactuar con los servicios en el dispositivo. Tratar:

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