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 binario aidl
para construir vinculaciones de C++ o Java, de modo que esta interfaz se pueda usar en todos los procesos, independientemente del entorno de ejecución o el tamaño de bits.
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. Por ejemplo, se puede usar AIDL para implementar una API de SDK en la plataforma, pero la plataforma de la API del SDK nunca contiene APIs de AIDL directamente. Si quieres obtener documentación sobre cómo usar AIDL entre apps directamente, consulta 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 AIDL estable.
Ejemplo
Este es 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 le envía llamadas, y un proceso de cliente hace 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 AIDL, consulta Lenguaje 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 se realizan llamadas en el mismo proceso y el mismo backend, no existen objetos de proxy, por lo que las llamadas son directas sin empaquetar ni desempaquetar.
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