Ngôn ngữ AIDL dựa trên ngôn ngữ Java. Các tệp chỉ định một hợp đồng giao diện và nhiều kiểu dữ liệu cũng như hằng số được dùng trong hợp đồng này.
Gói
Mọi tệp AIDL đều bắt đầu bằng một gói không bắt buộc tương ứng với tên gói trong nhiều phần phụ trợ. Khai báo gói có dạng như sau:
package my.package;
Tương tự như Java, các tệp AIDL phải nằm trong một cấu trúc thư mục khớp với gói của chúng. Tệp có gói my.package phải nằm trong thư mục my/package/.
Loại
Trong các tệp AIDL, có nhiều vị trí mà bạn có thể chỉ định các loại. Để biết danh sách chính xác các loại được hỗ trợ trong ngôn ngữ AIDL, hãy xem Các loại phụ trợ AIDL.
Chú thích
Một số phần của ngôn ngữ AIDL hỗ trợ chú thích. Để biết danh sách các chú thích và nơi có thể áp dụng các chú thích đó, hãy xem phần Chú thích AIDL.
Nhập
Để sử dụng các loại được xác định trong các giao diện khác, trước tiên, bạn phải thêm các phần phụ thuộc trong hệ thống bản dựng. Trong các mô-đun cc_* và java_* Soong, nơi các tệp .aidl được dùng trực tiếp trong srcs trong các bản dựng nền tảng Android, bạn có thể thêm các thư mục bằng cách sử dụng trường aidl: { include_dirs: ... }. Đối với các lệnh nhập bằng aidl_interface, hãy xem tại đây.
Một lệnh nhập sẽ có dạng như sau:
import some.package.Foo; // explicit import
Khi nhập một loại trong cùng một gói, bạn có thể bỏ qua gói. Mặc dù vậy, việc bỏ qua gói có thể dẫn đến lỗi nhập mơ hồ khi các loại được chỉ định mà không có gói và được đưa vào không gian tên chung (thường thì tất cả các loại đều phải được đặt tên theo không gian tên):
import Foo; // same as my.package.Foo
Xác định các loại
Các tệp AIDL thường xác định các loại được dùng làm giao diện.
Giao diện
Sau đây là ví dụ về giao diện 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();
}
Giao diện xác định một đối tượng bằng một loạt phương thức. Các phương thức có thể là oneway (oneway void doFoo()) hoặc đồng bộ. Nếu một giao diện được xác định là oneway (oneway interface ITeleport {...}), thì tất cả các phương thức trong giao diện đó đều là oneway một cách ngầm định. Các phương thức một chiều được gửi đi không đồng bộ và không thể trả về kết quả. Các phương thức một chiều từ cùng một luồng đến cùng một liên kết cũng thực thi tuần tự (mặc dù có thể trên các luồng khác nhau). Để biết thông tin thảo luận về cách thiết lập các luồng, hãy xem phần Quản lý luồng phụ trợ AIDL.
Trình liên kết cho phép chia sẻ nhiều giao diện và đối tượng trình liên kết thông qua các giao diện trình liên kết. Các giao diện AIDL thường sử dụng lệnh gọi lại trong các lệnh gọi phương thức, chẳng hạn như với ITeleportCallback trong ví dụ trước. Bạn có thể dùng lại các đối tượng lệnh gọi lại giữa các lệnh gọi đến cùng một phương thức hoặc các lệnh gọi đến các phương thức khác nhau. Một cách sử dụng phổ biến khác của các loại giao diện là để các giao diện phụ hoặc đối tượng phiên được trả về từ các phương thức, chẳng hạn như với ITeleportSession trong ví dụ trước. Việc lồng ghép này cho phép đóng gói các API khác nhau tại API hoặc dựa trên trạng thái thời gian chạy. Ví dụ: một phiên có thể đại diện cho quyền sở hữu một tài nguyên cụ thể. Khi các giao diện được truyền nhiều lần hoặc trả về cho ứng dụng hoặc máy chủ mà chúng đến, các giao diện này luôn giữ nguyên tính đồng nhất của con trỏ đối tượng liên kết cơ bản.
Các phương thức có thể có 0 hoặc nhiều đối số. Đối số cho các phương thức có thể là in, out hoặc inout. Để biết thông tin thảo luận về mức độ ảnh hưởng của vấn đề này đến các loại đối số, hãy xem phần Tính định hướng của các chương trình phụ trợ AIDL.
Parcelable
Để biết nội dung mô tả về cách tạo các đối tượng có thể chuyển đổi dành riêng cho phần phụ trợ, hãy xem các đối tượng có thể chuyển đổi tuỳ chỉnh của phần phụ trợ AIDL.
Android 10 trở lên hỗ trợ các định nghĩa có thể đóng gói trực tiếp trong AIDL. Loại đối tượng có thể chuyển đổi này được gọi là đối tượng có thể chuyển đổi có cấu trúc. Để biết thêm thông tin về mối quan hệ giữa AIDL có cấu trúc và AIDL ổn định trong trình biên dịch AIDL và hệ thống xây dựng của chúng tôi, hãy xem bài viết AIDL có cấu trúc so với AIDL ổn định.
Ví dụ:
package my.package;
import my.package.Boo;
parcelable Baz {
@utf8InCpp String name = "baz";
Boo boo;
}
Liên minh
Android 12 trở lên hỗ trợ các khai báo hợp nhất được gắn thẻ. Ví dụ:
package my.package;
import my.package.FooSettings;
import my.package.BarSettings;
union Settings {
FooSettings fooSettings;
BarSettings barSettings;
@utf8InCpp String str;
int number;
}
Hãy xem AIDL Backends Unions (Các liên kết phụ trợ AIDL) để biết thông tin chi tiết cụ thể về phần phụ trợ.
Liệt kê
Android 11 trở lên hỗ trợ khai báo enum. Ví dụ:
package my.package;
enum Boo {
A = 1 * 4,
B = 3,
}
Khai báo kiểu lồng nhau
Android 13 trở lên hỗ trợ khai báo kiểu lồng nhau. Ví dụ:
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
}
Hằng số
Các giao diện, parcelable và union AIDL tuỳ chỉnh cũng có thể chứa các hằng số số nguyên và chuỗi, chẳng hạn như:
const @utf8InCpp String HAPPY = ":)";
const String SAD = ":(";
const byte BYTE_ME = 1;
const int ANSWER = 6 * 7;
Biểu thức hằng
Bạn có thể chỉ định hằng số, kích thước mảng và bộ liệt kê AIDL bằng cách sử dụng các biểu thức hằng số. Biểu thức có thể dùng dấu ngoặc đơn để lồng các phép toán. Bạn có thể sử dụng các giá trị biểu thức hằng số với các giá trị số nguyên hoặc số thực.
Các giá trị cố định true và false biểu thị giá trị boolean. Các giá trị có . nhưng không có hậu tố, chẳng hạn như 3.8, được coi là giá trị kép. Các giá trị Float có hậu tố f, chẳng hạn như 2.4f. Giá trị nguyên có hậu tố l hoặc L cho biết giá trị dài 64 bit. Nếu không, các giá trị số nguyên sẽ nhận được loại có dấu bảo toàn giá trị nhỏ nhất trong khoảng từ 8 bit (byte), 32 bit (int) và 64 bit (long). Vì vậy, 256 được coi là một int, nhưng 255 + 1 tràn sang byte 0. Các giá trị thập lục phân, chẳng hạn như 0x3, trước tiên được diễn giải là loại chưa ký nhỏ nhất giữ nguyên giá trị trong khoảng từ 32 bit đến 64 bit, sau đó được diễn giải lại là các giá trị chưa ký. Vì vậy, 0xffffffff có giá trị int-1. Kể từ Android 13, bạn có thể thêm hậu tố u8 vào các hằng số, chẳng hạn như 3u8, để biểu thị giá trị byte. Hậu tố này rất quan trọng để một phép tính, chẳng hạn như 0xffu8 * 3, được hiểu là -3 có loại byte trong khi 0xff * 3 là 765 có loại int.
Các toán tử được hỗ trợ có ngữ nghĩa C++ và Java. Theo thứ tự từ mức độ ưu tiên thấp nhất đến cao nhất, các toán tử nhị phân là || && | ^ & == != < > <= >= << >> + - * / %. Toán tử một ngôi là + - ! ~.