AIDL 语言

AIDL 语言松散地基于 Java 语言。文件指定了接口契约以及该契约中使用的各种数据类型和常量。

包裹

每个 AIDL 文件都以一个可选包开头,该包对应于各种后端中的包名称。包声明如下所示:

    package my.package;

与 Java 类似,AIDL 文件必须位于与其包匹配的文件夹结构中。带有包my.package的文件必须在文件夹my/package/中。

类型

在 AIDL 文件中,有很多地方可以指定类型。有关 AIDL 语言支持的类型的确切列表,请参阅AIDL 后端类型

注释

AIDL 语言的几个部分支持注释。有关注释列表以及可以应用它们的位置,请参阅AIDL 注释

进口

要使用其他接口中定义的类型,您必须首先在构建系统中添加依赖项。在cc_*java_* Soong 模块中, .aidl文件在 Android 平台构建中直接在srcs下使用,您可以使用字段aidl: { include_dirs: ... } 。对于使用aidl_interface的导入,请参见此处

导入看起来像这样:

    import some.package.Foo;  // explicit import

当在同一个包中导入一个类型时,包可以省略。但是,如果在没有包的情况下指定类型并将其放入全局命名空间(通常所有类型都应命名空间)时,省略包可能会导致不明确的导入错误:

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

定义类型

AIDL 文件通常定义用作接口的类型。

接口

这是一个示例 AIDL 接口:

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

接口定义了一个具有一系列方法的对象。方法可以是oneway的( oneway void doFoo() )或同步的。如果一个接口被定义为oneway ( oneway interface ITeleport {...} ),那么其中的所有方法都是隐式oneway 。单向方法是异步调度的,不能返回结果。从同一个线程到同一个绑定器的单向方法也保证串行执行(尽管可能在不同的线程上)。有关如何设置线程的讨论,请参阅AIDL 后端线程管理

方法可以有零个或多个参数。方法的参数可以是inoutinout 。有关这如何影响参数类型的讨论,请参阅AIDL 后端方向性

Parcelables

有关如何创建特定于后端的 parcelables 的描述, AIDL backends custom parcelables

Android 10 及更高版本直接在 AIDL 中支持 parcelable 声明。例如:

    package my.package;

    import my.package.Boo;

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

工会

Android 12 及更高版本支持联合声明。例如:

    package my.package;

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

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

枚举

Android 11 及更高版本支持枚举声明。例如:

    package my.package;

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

嵌套类型声明

Android T(AOSP 实验性)及更高版本支持嵌套类型声明。例如:

    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
    }

常数

自定义 AIDL 接口、parcelable 和联合也可以包含整数和字符串常量,例如:

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

常量表达式

AIDL 常量、数组大小和枚举器可以使用常量表达式来指定。表达式可以使用括号来嵌套操作。常量表达式值可以与整数或浮点值一起使用。

truefalse文字表示布尔值。带有 的值.但没有后缀,例如3.8 ,被认为是双精度值。浮点值具有f后缀,例如2.4f 。带有lL后缀的整数值表示 64 位长值。否则,整数值将获得介于 8 位(字节)、32 位(整数)和 64 位(长整数)之间的最小保值有符号类型。所以256被认为是一个int ,但255 + 1溢出成为byte 0 。十六进制值,例如0x3 ,首先被解释为 32 位和 64 位之间的最小值保留无符号类型,然后重新解释为无符号值。因此, 0xffffffff具有int-1 。从 Android T(AOSP 实验性)开始,后缀u8可以添加到常量中,例如3u8 ,以表示一个byte值。这个后缀很重要,因此计算,例如0xffu8 * 3 ,被解释为-3类型为byte0xff * 3765类型为int

支持的运算符具有 C++ 和 Java 语义。按优先级从低到高的顺序,二元运算符是|| && | ^ & == != < > <= >= << >> + - * / % 。一元运算符是+ - ! ~