Tổng quan về AIDL

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 một .aidl tệp), các hệ thống xây dựng khác nhau sẽ 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 độ dài 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, AIDL 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 API SDK trong nền tảng, chẳng hạn như vậy, nhưng bề mặt 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 dùng AIDL trực tiếp giữa các ứng dụng, hãy xem tài liệu tương ứng dành cho nhà phát triển Android documentation. 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 (bắt đầu từ Android 10) hoặc HAL (bắt đầu 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);
    }

Quy trình máy chủ đăng ký một giao diện và phục vụ các lệnh gọi đến giao diện đó, còn quy trình máy khách sẽ gọi đến các giao diện đó. Trong nhiều trường hợp, một quy trình hoạt động vừa là máy khách vừa là máy chủ vì quy trình đó có thể tham chiếu đến nhiều giao diện. Để biết thêm thông tin chi tiết về ngôn ngữ AIDL, hãy xem bài viết Ngôn ngữ AIDL. Để biết thêm thông tin chi tiết về các thời gian chạy khác nhau có sẵn để dùng các giao diện này, hãy xem bài viết Phần phụ trợ AIDL. Các khai báo loại 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 các quy trình.

Cách hoạt động

AIDL sử dụng trình điều khiển hạt nhân binder để thực hiện các lệnh gọi. Khi bạn thực hiện lệnh gọi, một mã nhận dạng phương thức và tất cả các đối tượng sẽ được đóng gói vào bộ đệm và sao chép vào một quy trình từ xa, trong đó một luồng binder chờ đọc dữ liệu. Sau khi luồng binder nhận được dữ liệu cho một giao dịch, luồng này sẽ tra cứu đối tượng mã giả lập gốc trong quy trình cục bộ. Lớp này sẽ giải nén dữ liệu và thực hiện lệnh gọi trên đố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à 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 phần phụ trợ, sẽ không có đối tượng proxy nào tồn tại. Vì vậy, 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 đi kèm với 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