Bahasa AIDL

Bahasa AIDL secara longgar didasarkan pada bahasa Java. File menentukan kontrak antarmuka dan berbagai tipe data serta konstanta yang digunakan dalam kontrak ini.

Kemasan

Setiap file AIDL dimulai dengan paket opsional yang sesuai dengan nama paket di berbagai backend. Deklarasi paket terlihat seperti ini:

    package my.package;

Mirip dengan Java, file AIDL harus berada dalam struktur folder yang cocok dengan paketnya. File dengan paket my.package harus ada di folder my/package/ .

Jenis

Dalam file AIDL, ada banyak tempat di mana tipe dapat ditentukan. Untuk daftar jenis yang didukung dalam bahasa AIDL, lihat Jenis backend AIDL .

Anotasi

Beberapa bagian dari bahasa AIDL mendukung anotasi. Untuk daftar anotasi dan tempat penerapannya, lihat Anotasi AIDL .

Impor

Untuk menggunakan tipe yang ditentukan di antarmuka lain, Anda harus menambahkan dependensi di sistem build terlebih dahulu. Dalam modul cc_* dan java_* Soong, di mana file .aidl digunakan langsung di bawah srcs pada build platform Android, Anda dapat menambahkan direktori menggunakan kolom aidl: { include_dirs: ... } . Untuk impor menggunakan aidl_interface , lihat di sini .

Impor terlihat seperti ini:

    import some.package.Foo;  // explicit import

Saat mengimpor tipe dalam paket yang sama, paket tersebut dapat dihilangkan. Meskipun demikian, menghilangkan paket dapat menyebabkan kesalahan impor yang ambigu ketika tipe ditentukan tanpa paket dan dimasukkan ke dalam namespace global (umumnya semua tipe harus diberi namespace):

    import Foo;  // same as my.package.Foo

Mendefinisikan Jenis

File AIDL umumnya mendefinisikan tipe yang digunakan sebagai antarmuka.

Antarmuka

Berikut adalah contoh antarmuka AIDL:

    interface ITeleport {
        void teleport(Location baz, float speed);
        String getName();
    }

Antarmuka mendefinisikan objek dengan serangkaian metode. Metode dapat berupa oneway ( oneway void doFoo() ) atau sinkron. Jika suatu antarmuka didefinisikan sebagai oneway ( oneway interface ITeleport {...} ), maka semua metode di dalamnya secara implisit bersifat oneway . Metode satu arah dikirim secara asinkron dan tidak dapat memberikan hasil. Metode satu arah dari thread yang sama ke binder yang sama juga dijamin akan dieksekusi secara serial (walaupun berpotensi pada thread yang berbeda). Untuk diskusi tentang cara menyiapkan thread, lihat manajemen thread backend AIDL .

Metode dapat mempunyai nol atau lebih argumen. Argumen terhadap metode bisa in , out , atau inout . Untuk diskusi tentang bagaimana hal ini memengaruhi tipe argumen, lihat arah backend AIDL .

Parcelable

Untuk penjelasan tentang cara membuat parsel khusus backend, AIDL membuat parsel khusus backend .

Android 10 dan lebih tinggi mendukung definisi yang dapat dibagi secara langsung di AIDL. Jenis parsel seperti ini disebut parsel terstruktur. Untuk informasi lebih lanjut tentang bagaimana AIDL terstruktur dan stabil terkait dalam kompiler AIDL dan sistem pembangunan kami, lihat AIDL terstruktur versus stabil .

Misalnya:

    package my.package;

    import my.package.Boo;

    parcelable Baz {
        @utf8InCpp String name = "baz";
        Boo boo;
    }

Serikat pekerja

Android 12 dan yang lebih tinggi mendukung deklarasi serikat pekerja. Misalnya:

    package my.package;

    import my.package.FooSettings;
    import my.package.BarSettings;

    union Settings {
        FooSettings fooSettings;
        BarSettings barSettings;
        @utf8InCpp String str;
        int number;
    }

Enum

Deklarasi enum dukungan Android 11 dan lebih tinggi. Misalnya:

    package my.package;

    enum Boo {
        A = 1 * 4,
        B = 3,
    }

Deklarasi Tipe Bersarang

Android 13 dan yang lebih tinggi mendukung deklarasi tipe bertingkat. Misalnya:

    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
    }

Konstanta

Antarmuka AIDL khusus, paket, dan gabungan juga dapat berisi konstanta bilangan bulat dan string, seperti:

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

Ekspresi Konstan

Konstanta AIDL, ukuran array, dan enumerator dapat ditentukan menggunakan ekspresi konstanta. Ekspresi dapat menggunakan tanda kurung untuk menyarangkan operasi. Nilai ekspresi konstan dapat digunakan dengan nilai integral atau float.

literal true dan false mewakili nilai boolean. Nilai dengan . tapi tanpa akhiran, seperti 3.8 , dianggap nilai ganda. Nilai float memiliki akhiran f , misalnya 2.4f . Nilai integral dengan akhiran l atau L menunjukkan nilai sepanjang 64-bit. Jika tidak, nilai integral mendapatkan tipe bertanda pelestarian nilai terkecil antara 8-bit (byte), 32-bit (int), dan 64-bit (panjang). Jadi 256 dianggap sebagai int , tetapi 255 + 1 meluap menjadi byte 0 . Nilai hex, seperti 0x3 , pertama-tama diinterpretasikan sebagai tipe unsigned yang mempertahankan nilai terkecil antara 32-bit dan 64-bit, lalu diinterpretasikan ulang sebagai nilai-nilai unsigned. Jadi, 0xffffffff memiliki nilai int -1 . Mulai Android 13, akhiran u8 dapat ditambahkan ke konstanta, seperti 3u8 , untuk mewakili nilai byte . Akhiran ini penting agar perhitungan, seperti 0xffu8 * 3 , diinterpretasikan sebagai -3 dengan tipe byte sedangkan 0xff * 3 adalah 765 dengan tipe int .

Operator yang didukung memiliki semantik C++ dan Java. Diurutkan dari prioritas terendah hingga tertinggi, operator biner adalah || && | ^ & == != < > <= >= << >> + - * / % . Operator unary adalah + - ! ~ .