Bahasa AIDL secara longgar didasarkan pada bahasa Java. File menentukan kontrak antarmuka dan beragam tipe data serta konstanta yang digunakan dalam kontrak ini.
Paket
Setiap file AIDL dimulai dengan paket opsional yang sesuai dengan paket tersebut nama di berbagai backend. Deklarasi paket terlihat seperti ini:
package my.package;
Serupa dengan Java, file AIDL harus berada dalam struktur folder yang sesuai dengan
paket. 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 anotasi dukungan bahasa AIDL. Untuk daftar dan di mana anotasi tersebut dapat diterapkan, lihat Anotasi AIDL.
Import
Untuk menggunakan tipe yang didefinisikan dalam antarmuka lain, Anda harus menambahkan dependensi di
sistem build. Di modul Soong cc_*
dan java_*
, tempat file .aidl
digunakan
langsung di bawah srcs
di 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. Meskipun begitu, menghilangkan paket dapat menyebabkan error impor yang ambigu ketika 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 {
void teleport(Location baz, float speed);
String getName();
}
Antarmuka menentukan objek dengan serangkaian metode. Metode dapat berupa
oneway
(oneway void doFoo()
) atau sinkron. Jika antarmuka didefinisikan sebagai
oneway
(oneway interface ITeleport {...}
), lalu semua metode di dalamnya
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
mengeksekusi secara serial (meskipun berpotensi pada thread berbeda). Untuk
diskusi tentang cara menyiapkan thread, lihat thread backend AIDL
Google Workspace.
Metode dapat memiliki nol atau beberapa argumen. Argumen ke metode dapat
in
, out
, atau inout
. Untuk pembahasan tentang bagaimana
hal ini memengaruhi jenis argumen,
lihat
Petunjuk arah backend AIDL.
Parcelable
Untuk deskripsi cara membuat parcelable khusus backend, Backend AIDL kustom parcelable.
Android 10 dan yang lebih tinggi mendukung definisi parcelable langsung di AIDL. Jenis parcelable ini disebut parcelable terstruktur. Untuk informasi selengkapnya tentang keterkaitan antara AIDL terstruktur dan stabil dalam Compiler AIDL dan sistem build kami, lihat Terstruktur versus stabil Generative AIDL.
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. Contoh:
package my.package;
import my.package.FooSettings;
import my.package.BarSettings;
union Settings {
FooSettings fooSettings;
BarSettings barSettings;
@utf8InCpp String str;
int number;
}
Enum
Android 11 dan yang lebih tinggi 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 bilangan bulat dan konstanta 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 konstanta ekspresi. Ekspresi dapat menggunakan tanda kurung untuk menyusun bertingkat operasi. Konstanta nilai ekspresi dapat digunakan dengan nilai integral atau {i>float<i}.
Literal true
dan false
mewakili nilai boolean. Nilai dengan .
tetapi
tanpa akhiran, seperti 3.8
, dianggap sebagai nilai ganda. {i>Float<i}
memiliki akhiran f
, seperti 2.4f
. Nilai integral dengan l
atau
Akhiran L
menunjukkan nilai sepanjang 64-bit. Jika tidak, nilai integral mendapatkan
tipe 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
tambahan menjadi byte
0
. Nilai heksa, seperti 0x3
, akan ditafsirkan terlebih dahulu
sebagai jenis tanpa label dengan perlindungan nilai terkecil antara 32-bit dan 64-bit
dan kemudian ditafsirkan kembali
sebagai nilai yang tidak ditandatangani. Jadi, 0xffffffff
memiliki nilai int
-1
. Mulai Android 13, akhiran u8
dapat menjadi
ditambahkan ke konstanta, seperti 3u8
, untuk mewakili nilai byte
. Akhiran ini adalah
penting sehingga 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. Diurutkan dari yang terendah ke
dengan prioritas tertinggi, operator biner adalah
|| && | ^ & == != < > <= >= << >> + - * / %
. Operator unary adalah + - ! ~
.