AIDL言語

AIDL言語は、大まかにJava言語に基づいています。ファイルは、インターフェイスコントラクトと、このコントラクトで使用されるさまざまなデータ型および定数を指定します。

パッケージ

すべてのAIDLファイルは、さまざまなバックエンドのパッケージ名に対応するオプションのパッケージで始まります。パッケージ宣言は次のようになります。

    package my.package;

Javaと同様に、AIDLファイルはパッケージと一致するフォルダー構造内にある必要があります。パッケージmy.packageを含むファイルは、 my/package/フォルダーにある必要があります。

種類

AIDLファイルには、タイプを指定できる場所がたくさんあります。 AIDL言語でサポートされているタイプの正確なリストについては、 AIDLバックエンドタイプを参照してください。

注釈

AIDL言語のいくつかの部分は、注釈をサポートしています。注釈のリストとそれらを適用できる場所については、 AIDL注釈を参照してください。

輸入

他のインターフェースで定義されたタイプを使用するには、最初にビルドシステムに依存関係を追加する必要があります。 cc_*およびjava_* Soongモジュールでは、 .aidlファイルがAndroidプラットフォームビルドのsrcの直下で使用され、フィールド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 void doFoo() onewayまたは同期のいずれかです。インターフェイスが一方向(一方向インターフェイスoneway oneway interface ITeleport {...} )として定義されている場合、その中のすべてのメソッドは暗黙的にonewayです。一方向メソッドは非同期でディスパッチされ、結果を返すことはできません。同じスレッドから同じバインダーへの一方向のメソッドも、シリアルに実行されることが保証されています(ただし、異なるスレッドで実行される可能性があります)。スレッドの設定方法については、 AIDLバックエンドのスレッド管理を参照してください。

メソッドは0個以上の引数を持つことができます。メソッドの引数は、 inout 、またはinoutにすることができます。これが引数の型にどのように影響するかについては、 AIDLバックエンドの方向性を参照してください。

パーセラブル

バックエンド固有のパーセラブルを作成する方法の説明については、AIDLバックエンドのカスタムパーセラブルを参照してください。

Android 10以降は、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 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インターフェイス、パーセラブル、およびユニオンには、次のような整数定数と文字列定数を含めることもできます。

    const @utf8InCpp String HAPPY = ":)";
    const String SAD = ":(";
    const byte BYTE_ME = 1;
    const int ANSWER = 6 * 7;

定数式

AIDL定数、配列サイズ、および列挙子は、定数式を使用して指定できます。式では、括弧を使用して操作をネストできます。定数式の値は、整数値または浮動小数点値で使用できます。

trueおよびfalseリテラルは、ブール値を表します。の値.ただし、 3.8などの接尾辞がない場合は、double値と見なされます。フロート値には、 2.4fなどのfサフィックスが付いています。 lまたはL接尾辞が付いた整数値は、64ビット長の値を示します。それ以外の場合、整数値は、8ビット(バイト)、32ビット(int)、および64ビット(long)の間で最小の値を保持する符号付き型を取得します。したがって、 256intと見なされますが、 255 + 1がオーバーフローしてbyte 0になります。 0x3などの16進値は、最初に32ビットから64ビットまでの最小値を保持する符号なし型として解釈され、次に符号なし値として再解釈されます。したがって、 0xffffffffint値は-1です。 Android T(AOSP実験的)以降、接尾辞u83u8などの定数に追加して、 byte値を表すことができます。この接尾辞は、 0xffu8 * 3などの計算がbyte型の-3として解釈されるのに対し、 0xff * 3int型の765であるために重要です。

サポートされている演算子には、C++およびJavaのセマンティクスがあります。優先順位の低いものから高いものの順に、二項演算子は|| && | ^ & == != < > <= >= << >> + - * / %です。 || && | ^ & == != < > <= >= << >> + - * / % 。単項演算子は+ - ! ~