Bahasa AIDL

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

Paket

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

    package my.package;

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

Jenis

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

Anotasi

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

Import

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

Impor akan terlihat seperti ini:

    import some.package.Foo;  // explicit import

Saat mengimpor jenis dalam paket yang sama, paket dapat dihilangkan. Namun, penghapusan paket dapat menyebabkan error impor yang ambigu saat jenis ditentukan tanpa paket dan dimasukkan ke dalam namespace global (umumnya semua jenis harus diberi namespace):

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

Menentukan jenis

File AIDL umumnya menentukan jenis yang digunakan sebagai antarmuka.

Antarmuka

Berikut adalah contoh antarmuka AIDL:

    interface ITeleport {
        // Location defined elsewhere
        void teleport(Location baz, float speed);
        String getName();

        // ITeleportCallback defined elsewhere
        void methodWithCallback(ITeleportCallback callback);

        // ITeleportSession defined elsewhere
        ITeleportSession getASubInterface();
    }

Antarmuka menentukan objek dengan serangkaian metode. Metode dapat berupa oneway (oneway void doFoo()) atau sinkron. Jika antarmuka ditentukan sebagai oneway (oneway interface ITeleport {...}), semua metode di dalamnya secara implisit adalah oneway. Metode oneway dikirim secara asinkron dan tidak dapat menampilkan hasil. Metode satu arah dari thread yang sama ke binder yang sama juga dijalankan secara serial (meskipun berpotensi di thread yang berbeda). Untuk pembahasan cara menyiapkan thread, lihat Pengelolaan thread backend AIDL.

Binder memungkinkan banyak antarmuka dan objek binder dibagikan melalui antarmuka binder. Antarmuka AIDL sering menggunakan callback sebagai bagian dari panggilan metode, seperti dengan ITeleportCallback dalam contoh sebelumnya. Anda dapat menggunakan kembali objek callback di antara panggilan ke metode yang sama atau panggilan ke metode berbeda. Penggunaan jenis antarmuka lainnya yang umum adalah untuk sub-antarmuka atau objek sesi yang akan ditampilkan dari metode, seperti ITeleportSession dalam contoh sebelumnya. Dengan bertingkat, API yang berbeda dapat dienkapsulasi di API atau berdasarkan status runtime. Misalnya, sesi dapat mewakili kepemilikan resource tertentu. Saat antarmuka diteruskan beberapa kali atau ditampilkan ke klien atau server tempat asalnya, antarmuka tersebut selalu mempertahankan kesetaraan pointer objek binder yang mendasarinya.

Metode dapat memiliki nol atau beberapa argumen. Argumen untuk metode dapat berupa in, out, atau inout. Untuk mengetahui diskusi tentang pengaruhnya terhadap jenis argumen, lihat arah backend AIDL.

Parcelable

Untuk deskripsi cara membuat parcelable khusus backend, parcelable kustom backend AIDL.

Android 10 dan yang lebih baru mendukung definisi parcelable langsung di AIDL. Jenis parcelable ini disebut parcelable terstruktur. Untuk informasi lebih lanjut tentang hubungan AIDL terstruktur dan stabil dalam compiler AIDL dan sistem build kami, lihat AIDL terstruktur versus stabil.

Contoh:

    package my.package;

    import my.package.Boo;

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

Serikat

Android 12 dan yang lebih tinggi mendukung deklarasi union yang diberi tag. Contoh:

    package my.package;

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

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

Lihat AIDL Backends Unions untuk mengetahui detail khusus backend.

Enum

Android 11 dan yang lebih baru mendukung deklarasi enum. Contoh:

    package my.package;

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

Deklarasi Jenis Bertingkat

Android 13 dan yang lebih tinggi mendukung deklarasi jenis bertingkat. Contoh:

    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 kustom, parcelable, dan union 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 konstanta

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

Literal true dan false mewakili nilai boolean. Nilai dengan . tetapi tanpa akhiran, seperti 3.8, dianggap sebagai nilai ganda. Nilai float memiliki akhiran f, seperti 2.4f. Nilai integral dengan akhiran l atau L menunjukkan nilai sepanjang 64-bit. Jika tidak, nilai integral akan mendapatkan jenis bertanda tangan yang mempertahankan nilai terkecil antara 8-bit (byte), 32-bit (int), dan 64-bit (panjang). Jadi, 256 dianggap sebagai int, tetapi 255 + 1 melebihi batas menjadi byte 0. Nilai hex, seperti 0x3, pertama-tama ditafsirkan sebagai jenis tanpa label dengan nilai yang mempertahankan nilai terkecil antara 32-bit dan 64-bit, lalu diinterpretasikan ulang sebagai nilai yang tidak ditandatangani. 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 penghitungan, seperti 0xffu8 * 3, ditafsirkan sebagai -3 dengan jenis byte, sedangkan 0xff * 3 adalah 765 dengan jenis int.

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