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 utilizan el binario aidl
para construir enlaces C++ o Java de modo que esta interfaz pueda usarse en todos los procesos, independientemente del tiempo de ejecución o el bitness allí.
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 del SDK nunca contiene 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 utiliza 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 utilizar el sistema 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 le atiende llamadas, 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 múltiples interfaces. Para obtener más detalles sobre el lenguaje AIDL, consulte Lenguaje AIDL . Para obtener más detalles sobre los distintos tiempos de ejecución disponibles para usar estas interfaces, consulte Backends 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 kernel de carpeta 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 carpeta espera para leer los datos. Una vez que un subproceso de enlace recibe datos para una transacción, el subproceso busca un objeto 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 de servidor. Cuando las llamadas se realizan en el mismo proceso y en el mismo backend, no existen objetos proxy y, por lo tanto, las llamadas son directas sin ningún empaquetado ni descomprimido.
Interactuar con servicios en el dispositivo
Android viene con algunos comandos para permitir interactuar con los servicios del dispositivo. Intentar:
adb shell dumpsys --help # listing and dumping services
adb shell service --help # sending commands to services for testing