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個以上の引数を持つことができます。メソッドの引数は、 in
、 out
、または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)の間で最小の値を保持する符号付き型を取得します。したがって、 256
はint
と見なされますが、 255 + 1
がオーバーフローしてbyte
0
になります。 0x3
などの16進値は、最初に32ビットから64ビットまでの最小値を保持する符号なし型として解釈され、次に符号なし値として再解釈されます。したがって、 0xffffffff
のint
値は-1
です。 Android T(AOSP実験的)以降、接尾辞u8
を3u8
などの定数に追加して、 byte
値を表すことができます。この接尾辞は、 0xffu8 * 3
などの計算がbyte
型の-3
として解釈されるのに対し、 0xff * 3
はint
型の765
であるために重要です。
サポートされている演算子には、C++およびJavaのセマンティクスがあります。優先順位の低いものから高いものの順に、二項演算子は|| && | ^ & == != < > <= >= << >> + - * / %
です。 || && | ^ & == != < > <= >= << >> + - * / %
。単項演算子は+ - ! ~
。