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();
    }

介面定義了具有一系列方法的物件。方法可以是onewayoneway void doFoo() )或同步的。如果一個介面被定義為oneway ( oneway interface ITeleport {...} ),那麼其中的所有方法都隱含是oneway 。 Oneway 方法是非同步調度的,無法傳回結果。從同一線程到同一綁定器的單向方法也保證串行執行(儘管可能在不同的線程上)。有關如何設定線程的討論,請參閱AIDL 後端線程管理

方法可以有零個或多個參數。方法的參數可以是inoutinout 。有關這如何影響參數類型的討論,請參閱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 常數、陣列大小和枚舉數可以使用常數表達式指定。表達式可以使用括號來嵌套運算。常數表達式值可以與整數或浮點值一起使用。

truefalse文字代表布林值。值帶有.但如果沒有後綴,例如3.8 ,則被視為雙精確度值。浮點數值具有f後綴,例如2.4f 。帶lL後綴的整數值表示 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 語義。依照優先權從最低到最高的順序,二元運算子是|| && | ^ & == != < > <= >= << >> + - * / % 。一元運算子是+ - ! ~