Bahasa AIDL secara longgar didasarkan pada bahasa Java. File menentukan kontrak antarmuka dan berbagai tipe data dan 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 persis tipe yang didukung dalam bahasa AIDL, lihat tipe backend AIDL .
Anotasi
Beberapa bagian dari anotasi dukungan bahasa AIDL. Untuk daftar anotasi dan tempat penerapannya, lihat anotasi AIDL .
Impor
Untuk menggunakan tipe yang ditentukan di antarmuka lain, Anda harus terlebih dahulu menambahkan dependensi dalam sistem pembangunan. Dalam cc_*
dan java_*
Soong, di mana file .aidl
digunakan langsung di bawah srcs
dalam pembuatan platform Android, Anda dapat menambahkan direktori menggunakan bidang aidl: { include_dirs: ... }
. Untuk impor menggunakan aidl_interface
, lihat di sini .
Impor terlihat seperti ini:
import some.package.Foo; // explicit import
Saat mengimpor jenis dalam paket yang sama, paket tersebut dapat dihilangkan. Padahal, 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 menentukan jenis 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 satu arah ( oneway
oneway void doFoo()
) atau sinkron. Jika sebuah antarmuka didefinisikan sebagai satu arah ( oneway
oneway interface ITeleport {...}
), maka semua metode di dalamnya secara implisit oneway
. Metode satu arah dikirim secara asinkron dan tidak dapat mengembalikan hasil. Metode satu arah dari utas yang sama ke pengikat yang sama juga dijamin untuk dieksekusi secara serial (meskipun berpotensi pada utas yang berbeda). Untuk diskusi tentang cara mengatur utas, lihat manajemen utas backend AIDL .
Metode dapat memiliki nol atau lebih argumen. Argumen untuk metode bisa in
, out
, atau inout
. Untuk diskusi tentang bagaimana hal ini memengaruhi tipe argumen, lihat AIDL backends directionality .
Parcelable
Untuk deskripsi tentang cara membuat parcelable khusus backend, AIDL membuat parsel khusus backend .
Android 10 dan yang lebih tinggi mendukung deklarasi parcelable langsung di AIDL. Sebagai contoh:
package my.package;
import my.package.Boo;
parcelable Baz {
@utf8InCpp String name = "baz";
Boo boo;
}
serikat pekerja
Android 12 dan deklarasi serikat dukungan yang lebih tinggi. Sebagai 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. Sebagai contoh:
package my.package;
enum Boo {
A = 1 * 4,
B = 3,
}
Deklarasi Tipe Bersarang
Android T (AOSP eksperimental) dan deklarasi tipe bersarang yang lebih tinggi mendukung. Sebagai 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 integer 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 konstan. Ekspresi dapat menggunakan tanda kurung untuk operasi sarang. Nilai ekspresi konstan 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 panjang 64-bit. Jika tidak, nilai integral mendapatkan tipe bertanda yang mempertahankan 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 ditafsirkan sebagai tipe tidak bertanda yang mempertahankan nilai terkecil antara 32-bit dan 64-bit dan kemudian ditafsirkan kembali sebagai nilai tidak bertanda. Jadi, 0xffffffff
memiliki nilai int
-1
. Mulai Android T (AOSP eksperimental), sufiks u8
dapat ditambahkan ke konstanta, seperti 3u8
, untuk mewakili nilai byte
. Sufiks 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 ke tertinggi, operator biner adalah || && | ^ & == != < > <= >= << >> + - * / %
. Operator unary adalah + - ! ~
.