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 loại bỏ 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, nhờ đó, bạn có thể sử dụng giao diện này trong các quy trình, bất kể thời gian chạy hay bit trong đó.

Bạn có thể sử dụng AIDL giữa bất kỳ quy trình nào trong Android: giữa các thành phần của nền tảng hoặc giữa các ứng dụng. Tuy nhiên, API này không bao giờ được dùng làm API cho ứng dụng. Ví dụ: bạn có thể sử dụng AIDL để triển khai API SDK trong nền tảng, nhưng giao diện API SDK không bao giờ trực tiếp chứa 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 sử dụng AIDL giữa các thành phần của 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 (kể từ Android 11), bạn phải sử dụng hệ thống tạo phiên bản có tên là AIDL ổn định.

Ví dụ

Dưới đâ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ủ sẽ đăng ký một giao diện và thực hiện lệnh gọi đến giao diện đó, còn quy trình ứng dụng sẽ thực hiện lệnh gọi đến các giao diện đó. Trong nhiều trường hợp, một quy trình đóng vai trò là cả máy khách và 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 môi trường thời gian chạy có thể sử dụng các giao diện này, hãy xem phần Phần phụ trợ AIDL. Các nội dung khai báo kiểu này hoàn toàn giống với nội dung khai báo lớp trong một ngôn ngữ nhất định, nhưng hoạt động được 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 lệnh gọi. Khi bạn thực hiện 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, trong đó luồng liên kết sẽ chờ đọc dữ liệu. Sau khi luồng liên kết nhận được dữ liệu cho một giao dịch, luồng này sẽ tra cứu một đối tượng mô phỏ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 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à 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 phần phụ trợ, không có đối tượng proxy nào tồn tại, do đó, các lệnh gọi sẽ diễn ra trực tiếp mà không cần đóng gói hoặc giải nén.

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