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