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