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
。 Oneway 方法是非同步調度的,無法傳回結果。從同一線程到同一綁定器的單向方法也保證串行執行(儘管可能在不同的線程上)。有關如何設定線程的討論,請參閱AIDL 後端線程管理。
方法可以有零個或多個參數。方法的參數可以是in
、 out
或inout
。有關這如何影響參數類型的討論,請參閱AIDL 後端方向性。
包裹
有關如何建立特定於後端的 Parcelables 的說明,請參閱 AIDL backends custom Parcelables 。
Android 10 及更高版本直接在 AIDL 中支援 Parcelable 定義。這種類型的 Parcelable 稱為結構化 Parcelable。有關結構化 AIDL 和穩定 AIDL 在 AIDL 編譯器和我們的構建系統中如何關聯的更多信息,請參閱結構化 AIDL 與穩定 AIDL 。
例如:
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 13 及更高版本支援巢狀類型聲明。例如:
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 介面、parcelables 和 union 還可以包含整數和字串常數,例如:
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 位元(int)和 64 位元(長)之間最小的保留值的有符號類型。因此256
被認為是int
,但255 + 1
溢位成為byte
0
。十六進位值(例如0x3
)首先被解釋為 32 位元和 64 位元之間保留最小值的無符號類型,然後重新解釋為無符號值。因此, 0xffffffff
int
值是-1
。從 Android 13 開始,後綴u8
可以加到常數(例如3u8
)以表示byte
組值。此後綴很重要,因此計算(例如0xffu8 * 3
)在類型為byte
被解釋為-3
,而0xff * 3
在類型為int
時被解釋為765
。
支援的運算子具有 C++ 和 Java 語義。依照優先權從最低到最高的順序,二元運算子是|| && | ^ & == != < > <= >= << >> + - * / %
。一元運算子是+ - ! ~
。