Die Sprache AIDL basiert grob auf der Sprache Java. Dateien enthalten eine Schnittstellenvertrag und verschiedene Datentypen und Konstanten, die in diesem Vertrag verwendet werden.
Aufmachung
Jede AIDL-Datei beginnt mit einem optionalen Paket, das dem Paket entspricht in verschiedenen Back-Ends. Eine Paketdeklaration sieht so aus:
package my.package;
Ähnlich wie bei Java müssen AIDL-Dateien in einer Ordnerstruktur vorliegen,
Paket. Dateien mit dem Paket „my.package
“ müssen sich im Ordner „my/package/
“ befinden.
Typen
In AIDL-Dateien können an vielen Stellen Typen angegeben werden. Eine genaue Liste der Typen, die in der AIDL-Sprache unterstützt werden, finden Sie unter AIDL-Back-End-Typen.
Anmerkungen
Mehrere Teile der AIDL-Sprachunterstützung Annotationen. Eine Liste mit und wo sie angewendet werden können, AIDL-Annotationen
Importe
Wenn Sie Typen verwenden möchten, die in anderen Schnittstellen definiert sind, müssen Sie zuerst Abhängigkeiten in der
zu erstellen. In cc_*
- und java_*
Song-Modulen, in denen .aidl
-Dateien verwendet werden
direkt unter srcs
in Android-Plattform-Builds kannst du Verzeichnisse hinzufügen,
mithilfe des Felds aidl: { include_dirs: ... }
. Für Importe mit
aidl_interface
, siehe
finden Sie hier.
Ein Import sieht so aus:
import some.package.Foo; // explicit import
Beim Importieren eines Typs im selben Paket kann das Paket weggelassen werden. Trotzdem kann das Weglassen des Pakets zu mehrdeutigen Importfehlern führen, wenn Typen ohne Paket angegeben und in den globalen Namespace eingefügt (im Allgemeinen alle Typen sollte mit einem Namespace versehen werden):
import Foo; // same as my.package.Foo
Typen definieren
AIDL-Dateien definieren in der Regel Typen, die als Schnittstelle verwendet werden.
Schnittstellen
Hier ist ein Beispiel für eine AIDL-Schnittstelle:
interface ITeleport {
void teleport(Location baz, float speed);
String getName();
}
Eine Schnittstelle definiert ein Objekt mit einer Reihe von Methoden. Methoden können entweder
oneway
(oneway void doFoo()
) oder synchron. Wenn eine Schnittstelle als
oneway
(oneway interface ITeleport {...}
), dann sind alle darin enthaltenen Methoden
implizit oneway
. Einwegmethoden werden asynchron weitergeleitet und können
ein Ergebnis zurückgeben. Einwegmethoden vom gleichen Thread in denselben Binder
(aber möglicherweise in verschiedenen Threads)
ausgeführt werden. Für eine
Diskussionen zum Einrichten von Threads finden Sie unter AIDL-Back-End-Threads
Verwaltung von Google-Produkten.
Methoden können null oder mehr Argumente haben. Argumente für Methoden können sein:
in
, out
oder inout
. Wie sich dies auf Argumenttypen auswirkt,
Siehe
Richtung von AIDL-Back-Ends.
Parcelables
Eine Beschreibung zum Erstellen der Backend-spezifischen Parcelables Benutzerdefinierte AIDL-Back-Ends parcelables.
Android 10 und höher unterstützen Paketdefinitionen direkt in AIDL. Diese Art von Parcelable wird als strukturiertes Paket bezeichnet. Weitere Informationen dazu, wie strukturierte und stabile AIDL zusammenhängen, finden Sie in der AIDL-Compiler und unser Build-System finden Sie unter Strukturiert im Vergleich zu stabil AIDL
Beispiel:
package my.package;
import my.package.Boo;
parcelable Baz {
@utf8InCpp String name = "baz";
Boo boo;
}
Gewerkschaften
Android 12 und höher unterstützen Union-Deklarationen. Beispiel:
package my.package;
import my.package.FooSettings;
import my.package.BarSettings;
union Settings {
FooSettings fooSettings;
BarSettings barSettings;
@utf8InCpp String str;
int number;
}
Aufzählungen
Android 11 und höher unterstützen enum-Deklarationen. Beispiel:
package my.package;
enum Boo {
A = 1 * 4,
B = 3,
}
Verschachtelte Typdeklarationen
Android 13 und höher unterstützen verschachtelte Typdeklarationen. Beispiel:
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
}
Konstanten
Benutzerdefinierte AIDL-Schnittstellen, Parcelables und Unions können auch Ganzzahlen enthalten und Zeichenfolgenkonstanten, z. B.:
const @utf8InCpp String HAPPY = ":)";
const String SAD = ":(";
const byte BYTE_ME = 1;
const int ANSWER = 6 * 7;
Konstantenausdrücke
AIDL-Konstanten, Arraygrößen und Enumeratoren können mithilfe von Konstanten Ausdrücke. In Ausdrücken können Klammern verwendet werden, um Operationen zu verschachteln. Konstante Ausdruckswerte können mit ganzzahligen oder Gleitkommawerten verwendet werden.
Die Literale true
und false
stellen boolesche Werte dar. Werte mit .
, aber
ohne Suffix wie 3.8
werden als Werte vom Typ „Double“ betrachtet. Gleitkommazahl
Werte haben das Suffix f
, z. B. 2.4f
. Ein ganzzahliger Wert mit der l
- oder
Das Suffix L
gibt einen 64-Bit-Wert an. Andernfalls erhalten Integralewerte die
kleinster werterhaltender Vorzeichentyp zwischen 8 Bit (Byte), 32 Bit (int),
und 64-Bit (lang). Daher gilt 256
als int
, aber 255 + 1
überläuft die byte
0
. Hex-Werte wie 0x3
werden zuerst interpretiert
als kleinster werterhaltender nicht signierter Typ zwischen 32-Bit und 64-Bit
und dann als vorzeichenlose Werte neu interpretiert. 0xffffffff
hat also den Wert int
.
-1
Ab Android 13 kann das Suffix u8
zu Konstanten wie 3u8
hinzugefügt, um einen byte
-Wert darzustellen. Dieses Suffix ist
wichtig, damit eine Berechnung wie 0xffu8 * 3
als -3
interpretiert wird
mit dem Typ byte
, während 0xff * 3
765
vom Typ int
ist.
Unterstützte Operatoren bieten C++- und Java-Semantik. Um vom niedrigsten bis zum
die höchste Priorität haben, sind binäre Operatoren
|| && | ^ & == != < > <= >= << >> + - * / %
Unäre Operatoren sind + - ! ~
.