Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

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 tóm tắt IPC. Đưa ra một giao diện (được chỉ định trong tệp .aidl ), các hệ thống xây dựng khác nhau sử dụng nhị phân aidl để tạo liên kết C ++ hoặc Java để giao diện này có thể được sử dụng trên các quy trình, bất kể thời gian chạy hoặc bit ở đó.

AIDL có thể được sử dụng giữa bất kỳ quy trình nào 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 sử dụng làm API cho các ứng dụng. Ví dụ: AIDL có thể được sử dụng để triển khai API SDK trong nền tảng, 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 sử dụng trực tiếp AIDL 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 sử 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), hệ thống lập phiên bản được gọi là AIDL ổn định phải được sử dụng.

Thí dụ

Đây là một ví dụ về giao diện AIDL:

    package my.package;

    import my.package.Baz; // defined elsewhere

    interface IFoo {
        void doFoo(Baz baz); // synchronous method
        oneway void doFoo(int a); // async method
    }

Android 10 trở lên hỗ trợ các khai báo có giá trị. Ví dụ:

    package my.package;

    import my.package.Boo;

    parcelable Baz {
        @utf8InCpp String name = "baz";
        Boo boo;
    }

Android 11 trở lên hỗ trợ khai báo enum. Ví dụ:

    package my.package;

    enum Boo {
        A = 1 * 4,
        B = 3,
    }

Các khai báo liên minh hỗ trợ Android 12 trở lên. Ví dụ:

    package my.package;

    import my.package.FooSettings;
    import my.package.BarSettings;

    union Settings {
        FooSettings fooSettings;
        BarSettings barSettings;
        @utf8InCpp String str;
        int number;
    }

Android T (thử nghiệm AOSP) và các khai báo kiểu lồng nhau hỗ trợ cao hơn. 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
    }

Một quy trình máy chủ đăng ký một giao diện và phục vụ các cuộc gọi đến nó, và một quy trình khách thực hiện các cuộc gọi đến các giao diện đó. Trong nhiều trường hợp, một quy trình hoạt động như một máy khách và một máy chủ vì nó có thể tham chiếu đến nhiều giao diện. Để biết thêm chi tiết về các thời gian chạy khác nhau có sẵn để sử dụng các giao diện này, hãy xem phần phụ trợ AIDL . Các khai báo kiểu này chính xác giống như một 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.

Làm thế nào nó hoạt động

AIDL sử dụng trình điều khiển hạt nhân chất kết dính để thực hiện cuộc gọi. Khi bạn thực hiện một cuộc gọi, một mã định danh phương thức và tất cả các đối tượng được đóng gói vào một bộ đệm và được sao chép vào một quy trình từ xa nơi một chuỗi liên kết đợi để đọc dữ liệu. Khi một luồng liên kết nhận dữ liệu cho một giao dịch, luồng sẽ tìm kiếm một đối tượng gốc gốc trong quy trình cục bộ và lớp này giải nén dữ liệu và thực hiện một cuộc 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 tiến trình máy chủ tạo và đăng ký. Khi các cuộc 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ợ, không có đối tượng proxy nào tồn tại và do đó, các cuộc gọi là 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ị. Cố gắng:

    adb shell dumpsys --help # listing and dumping services
    adb shell service --help # sending commands to services for testing