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 后端线程管理。
方法可以有零个或多个参数。方法的参数可以是in
、 out
或inout
。有关这如何影响参数类型的讨论,请参阅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 常量、数组大小和枚举器可以使用常量表达式来指定。表达式可以使用括号来嵌套操作。常量表达式值可以与整数或浮点值一起使用。
true
和false
文字表示布尔值。带有 的值.
但没有后缀,例如3.8
,被认为是双精度值。浮点值具有f
后缀,例如2.4f
。带有l
或L
后缀的整数值表示 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
类型为byte
而0xff * 3
是765
类型为int
。
支持的运算符具有 C++ 和 Java 语义。按优先级从低到高的顺序,二元运算符是|| && | ^ & == != < > <= >= << >> + - * / %
。一元运算符是+ - ! ~
。