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;
Mirip dengan Java, file AIDL harus berada dalam struktur folder yang cocok dengan
paketnya. File dengan paket my.package harus berada di folder my/package/.
Jenis
Dalam file AIDL, ada banyak tempat yang dapat digunakan untuk menentukan jenis. Untuk mengetahui 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 di bawah 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, menghilangkan paket dapat menyebabkan error impor yang ambigu saat jenis ditentukan tanpa paket dan dimasukkan ke namespace global (umumnya semua jenis harus memiliki 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 akan
secara implisit oneway. Metode satu arah dikirim secara asinkron dan tidak dapat
menampilkan hasil. Metode satu arah dari thread yang sama ke binder yang sama juga dieksekusi secara serial (meskipun berpotensi di thread yang berbeda). Untuk
pembahasan tentang 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 yang berbeda. Penggunaan umum jenis antarmuka lainnya adalah untuk sub-antarmuka atau objek sesi yang ditampilkan dari metode seperti dengan ITeleportSession dalam contoh sebelumnya. Penyusunan bertingkat ini memungkinkan berbagai API dienkapsulasi di
API atau berdasarkan status runtime. Misalnya, sesi dapat mewakili
kepemilikan resource tertentu. Saat antarmuka diteruskan beberapa kali atau dikembalikan ke klien atau server asalnya, antarmuka tersebut selalu mempertahankan kesamaan pointer dari objek binder yang mendasarinya.
Metode dapat memiliki nol atau lebih argumen. Argumen untuk metode dapat berupa
in, out, atau inout. Untuk mengetahui pembahasan tentang pengaruhnya terhadap jenis argumen, lihat
Arah backend AIDL.
Parcelable
Untuk mengetahui deskripsi cara membuat parcelable khusus backend, lihat Parcelable kustom backend AIDL.
Android 10 dan yang lebih baru mendukung definisi parcelable langsung di AIDL. Jenis parcelable ini disebut parcelable terstruktur. Untuk mengetahui informasi lebih lanjut tentang hubungan antara AIDL terstruktur dan stabil di kompiler 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;
}
Gabungan
Android 12 dan yang lebih tinggi mendukung deklarasi gabungan 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 Gabungan Backend AIDL 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,
}
Pernyataan Jenis Bertingkat
Android 13 dan yang lebih baru 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, parcelable, dan gabungan kustom 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 enumerator dapat ditentukan menggunakan ekspresi konstanta. Ekspresi dapat menggunakan tanda kurung untuk menyusun operasi. Nilai ekspresi konstan dapat digunakan dengan nilai integral atau float.
Literal true dan false merepresentasikan 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 panjang 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 (long). Jadi, 256 dianggap sebagai int, tetapi 255 + 1
meluap menjadi byte 0. Nilai hex, seperti 0x3, pertama-tama ditafsirkan
sebagai jenis tidak bertanda tangan yang mempertahankan nilai terkecil antara 32-bit dan 64-bit
lalu ditafsirkan ulang sebagai nilai tidak bertanda tangan. Jadi, 0xffffffff memiliki nilai int
-1. Mulai Android 13, akhiran u8 dapat
ditambahkan ke konstanta, seperti 3u8, untuk merepresentasikan nilai byte. Sufiks ini penting agar perhitungan, 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 ke tertinggi, operator biner adalah || && | ^ & == != < > <= >= << >> + - * / %. Operator unary adalah + - ! ~.