AIDL-Sprache

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 + - ! ~.