Ngôn ngữ định nghĩa giao diện Android (AIDL) là một công cụ cho phép người dùng trừu tượng hoá IPC. Với một giao diện (được chỉ định trong tệp .aidl
), nhiều hệ thống xây dựng sử dụng tệp nhị phân aidl
để tạo các liên kết C++ hoặc Java để giao diện này có thể được dùng trên các quy trình, bất kể thời gian chạy hoặc độ rộng bit ở đó.
Bạn có thể dùng AIDL giữa mọi quy trình trong Android: giữa các thành phần nền tảng hoặc giữa các ứng dụng. Tuy nhiên, nó không bao giờ được dùng làm API cho các ứng dụng. Bạn có thể dùng AIDL để triển khai một API SDK trong nền tảng, chẳng hạn như vậy, nhưng giao diện API SDK không bao giờ chứa trực tiếp các API AIDL. Để biết tài liệu về cách sử dụng AIDL trực tiếp giữa các ứng dụng, hãy xem tài liệu dành cho nhà phát triển Android tương ứng. Khi AIDL được dùng giữa các thành phần nền tảng được cập nhật riêng biệt, chẳng hạn như APEX (kể từ Android 10) hoặc HAL (kể từ Android 11), bạn phải dùng hệ thống kiểm soát phiên bản có tên là AIDL ổn định.
Ví dụ
Sau đây là ví dụ về giao diện AIDL:
package my.package;
import my.package.Baz; // defined elsewhere
interface IFoo {
void doFoo(Baz baz);
}
Một quy trình máy chủ đăng ký một giao diện và xử lý các lệnh gọi đến giao diện đó, còn một quy trình máy khách thực hiện các lệnh gọi đến những giao diện đó. Trong nhiều trường hợp, một quy trình đóng vai trò vừa là máy khách vừa là máy chủ vì quy trình đó có thể tham chiếu nhiều giao diện. Để biết thêm thông tin về ngôn ngữ AIDL, hãy xem phần Ngôn ngữ AIDL. Để biết thêm thông tin về nhiều thời gian chạy có thể dùng các giao diện này, hãy xem phần Các chương trình phụ trợ AIDL. Các khai báo kiểu này giống hệt như khai báo lớp trong một ngôn ngữ nhất định, nhưng chúng hoạt động trên nhiều quy trình.
Cách hoạt động
AIDL sử dụng trình điều khiển nhân liên kết để thực hiện các lệnh gọi. Khi bạn thực hiện một lệnh gọi, một giá trị nhận dạng phương thức và tất cả các đối tượng sẽ được đóng gói vào một vùng đệm và sao chép vào một quy trình từ xa, nơi một luồng liên kết chờ đọc dữ liệu. Sau khi một luồng liên kết nhận được dữ liệu cho một giao dịch, luồng đó sẽ tra cứu một đối tượng gốc trong quy trình cục bộ và lớp này sẽ giải nén dữ liệu và thực hiện một lệnh gọi trên một đối tượng giao diện cục bộ. Đối tượng giao diện cục bộ này là đối tượng mà một quy trình máy chủ tạo và đăng ký. Khi các lệnh gọi được thực hiện trong cùng một quy trình và cùng một chương trình phụ trợ, sẽ không có đối tượng proxy nào tồn tại, do đó, các lệnh gọi sẽ trực tiếp mà không cần đóng gói hoặc giải nén. Để biết thêm thông tin, hãy xem bài viết Tổng quan về Binder.
Tương tác với các dịch vụ trên thiết bị
Android có một số lệnh cho phép tương tác với các dịch vụ trên thiết bị. Hãy thử:
adb shell dumpsys --help # listing and dumping services
adb shell service --help # sending commands to services for testing