Idioma del AIDL

El lenguaje AIDL se basa en líneas generales en el lenguaje Java. Los archivos especifican un de interfaz de usuario y varios tipos de datos y constantes que se usan en este contrato.

Paquete

Cada archivo AIDL comienza con un paquete opcional que se corresponde con el y nombres en varios backends. Una declaración de paquete se ve de la siguiente manera:

    package my.package;

Al igual que Java, los archivos AIDL deben estar en una estructura de carpetas que coincida con su . Los archivos con el paquete my.package deben estar en la carpeta my/package/.

Tipos

En los archivos AIDL, hay muchos lugares en los que se pueden especificar tipos. Para obtener una lista exacta de los tipos admitidos en el lenguaje del AIDL, consulta Tipos de backends de AIDL.

Anotaciones

Varias partes del lenguaje de AIDL admiten anotaciones. Para obtener una lista de anotaciones y dónde se pueden aplicar, consulta Anotaciones de AIDL

Importaciones

Para usar tipos definidos en otras interfaces, primero debes agregar dependencias en el de compilación. En los módulos cc_* y java_* de Soong, donde se usan archivos .aidl directamente en srcs en compilaciones de la plataforma de Android, puedes agregar directorios con el campo aidl: { include_dirs: ... }. Para las importaciones aidl_interface, consulta aquí.

Una importación se ve de la siguiente manera:

    import some.package.Foo;  // explicit import

Cuando importas un tipo en el mismo paquete, se puede omitir el paquete. Sin embargo, omitir el paquete puede generar errores de importación ambiguos cuando los tipos se especifica sin un paquete y se coloca en el espacio de nombres global (generalmente, todos los tipos debe tener espacios de nombres):

    import Foo;  // same as my.package.Foo

Definir tipos

Por lo general, los archivos AIDL definen tipos que se usan como interfaz.

Interfaces

Este es un ejemplo de interfaz de AIDL:

    interface ITeleport {
        void teleport(Location baz, float speed);
        String getName();
    }

Una interfaz define un objeto con una serie de métodos. Los métodos pueden ser oneway (oneway void doFoo()) o síncrono. Si una interfaz se define como oneway (oneway interface ITeleport {...}) y, luego, todos los métodos que contiene oneway de forma implícita. Los métodos unidireccionales se despachan de forma asíncrona y no pueden devolver un resultado. Los métodos unidireccionales del mismo subproceso al mismo Binder también ejecutar en serie (aunque posiblemente en subprocesos diferentes). Para un debate sobre cómo configurar subprocesos, consulta Subproceso de backends de AIDL de la administración.

Los métodos pueden tener cero o más argumentos. Los argumentos de los métodos pueden ser in, out o inout. Para analizar cómo esto afecta los tipos de argumentos, ver Orientación de backends de AIDL.

Objetos parcelables

Para ver una descripción de cómo crear objetos parcelables específicos del backend, consulta Backends de AIDL personalizados objetos parcelables.

Android 10 y las versiones posteriores admiten definiciones parcelables directamente en el AIDL. Este tipo de objeto parcelable se denomina elemento parcelable estructurado. Para obtener más información sobre cómo se relacionan el AIDL estructurado y estable en el Compilador de AIDL y nuestro sistema de compilación, consulta Estructurados versus estables AIDL

Por ejemplo:

    package my.package;

    import my.package.Boo;

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

Uniones

Android 12 y las versiones posteriores admiten declaraciones de unión. Por ejemplo:

    package my.package;

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

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

Enums

Android 11 y las versiones posteriores admiten declaraciones de enumeración. Por ejemplo:

    package my.package;

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

Declaraciones de tipos anidados

Android 13 y las versiones posteriores admiten declaraciones de tipos anidados. Por ejemplo:

    package my.package;

    import my.package.Baz;

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

        parcelable Bar { ... }          // nested type definition
    }

Constantes

Las interfaces, los objetos parcelables y las uniones personalizados del AIDL también pueden contener valores y constantes de cadena, como

    const @utf8InCpp String HAPPY = ":)";
    const String SAD = ":(";
    const byte BYTE_ME = 1;
    const int ANSWER = 6 * 7;

Expresiones constantes

Las constantes del AIDL, los tamaños de los arrays y los enumeradores se pueden especificar usando la constante con expresiones regulares. Las expresiones pueden usar paréntesis para anidar operaciones. Constante los valores de expresión se pueden usar con valores integrales o flotantes.

Los literales true y false representan valores booleanos. Valores con ., pero sin un sufijo, como 3.8, se consideran valores dobles. Número de punto flotante los valores tienen el sufijo f, como 2.4f. Un valor integral con l o El sufijo L indica un valor largo de 64 bits. De lo contrario, las integrales obtienen la el tipo de firma más pequeño que preserva el valor entre 8 bits (byte), 32 bits (int), y 64 bits (largo). Por lo tanto, 256 se considera un int, pero 255 + 1. se desborda para ser el 0 de byte. Los valores hexadecimales, como 0x3, primero se interpretan. como el tipo sin firma más pequeño que preserva el valor entre 32 y 64 bits y luego se reinterpretan como valores sin firma. Por lo tanto, 0xffffffff tiene el valor int. -1 A partir de Android 13, el sufijo u8 se puede Se agregan a las constantes, como 3u8, para representar un valor byte. Este sufijo es importante para que un cálculo, como 0xffu8 * 3, se interprete como -3 con el tipo byte, mientras que 0xff * 3 es 765 con el tipo int.

Los operadores compatibles tienen semántica de C++ y Java. En orden de menor a los operadores binarios de mayor precedencia, || && | ^ & == != < > <= >= << >> + - * / % Los operadores unarios son + - ! ~.