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 語義。按優先級從低到高的順序,二元運算符是|| && | ^ & == != < > <= >= << >> + - * / %
。一元運算符是+ - ! ~
。