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のセマンティクスがあります。優先順位の低いものから高いものの順に、二項演算子は|| && | ^ & == != < > <= >= << >> + - * / %です。 || && | ^ & == != < > <= >= << >> + - * / % 。単項演算子は+ - ! ~ 。