Ngôn ngữ AIDL

Ngôn ngữ AIDL dựa trên ngôn ngữ Java một cách lỏng lẻo. Các tệp chỉ định một hợp đồng giao diện cũng như các loại dữ liệu và hằng số khác nhau được sử dụng trong hợp đồng này.

Bưu kiện

Mọi tệp AIDL đều bắt đầu bằng một gói tùy chọn tương ứng với tên gói trong các phần phụ trợ khác nhau. Một khai báo gói trông như thế này:

    package my.package;

Tương tự như Java, các tệp AIDL phải có cấu trúc thư mục phù hợp với gói của chúng. Các tệp có gói my.package phải nằm trong thư mục my/package/ .

Các loại

Trong các tệp AIDL, có nhiều nơi có thể chỉ định loại. Để biết danh sách chính xác các loại được hỗ trợ trong ngôn ngữ AIDL, hãy xem các loại phụ trợ AIDL .

Chú thích

Một số phần của chú thích hỗ trợ ngôn ngữ AIDL. Để biết danh sách các chú thích và nơi chúng có thể được áp dụng, hãy xem chú thích AIDL .

Nhập khẩu

Để 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 vào hệ thống xây dựng. Trong các mô-đun cc_*java_* Soong, trong đó các tệp .aidl được sử dụng trực tiếp dưới srcs trong các bản dựng nền tảng Android, bạn có thể thêm các 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 , hãy xem tại đây .

Quá trình nhập trông như thế này:

    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 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à được đặt trong không gian tên chung (nói chung tất cả các loại phải được đặt tên):

    import Foo;  // same as my.package.Foo

Xác định loại

Các tệp AIDL thường xác định các loại được sử dụng làm giao diện.

Giao diện

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

    interface ITeleport {
        void teleport(Location baz, float speed);
        String getName();
    }

Một giao diện định nghĩa một đối tượng với một loạt các phương thức. Các phương thức có thể là 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ả các phương thức trong đó đều ngầm định là oneway . Các phương thức một chiều được gửi đi không đồng bộ và không thể trả về 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 chất kết dính cũng được đảm bảo thực thi tuần tự (mặc dù có khả năng trên các luồng khác nhau). Để thảo luận về cách thiết lập các luồng, hãy xem phần quản lý luồng phụ trợ AIDL .

Các phương thức có thể có 0 hoặc nhiều đối số. Các đối số của các phương thức có thể là in , out hoặc inout . Để thảo luận về cách điều này ảnh hưởng đến các loại đối số, hãy xem tính định hướng của chương trình phụ trợ AIDL .

bưu kiện

Để biết mô tả về cách tạo các gói có thể gửi dành riêng cho phần phụ trợ, AIDL sẽ hỗ trợ các gói có thể tùy chỉnh .

Android 10 trở lên hỗ trợ các định nghĩa có thể phân chia trực tiếp trong AIDL. Loại bưu kiện này được gọi là bưu kiện 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 AIDL có cấu trúc và ổn định .

Ví dụ:

    package my.package;

    import my.package.Boo;

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

Công đoàn

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

    package my.package;

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

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

Enum

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 nhau

Android 13 trở lên hỗ trợ khai báo kiểu lồng nhau. 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ố

Các giao diện AIDL tùy chỉnh, phân phối và kết hợp cũng có thể chứa các hằng số nguyên và 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ác hằng số AIDL, kích thước mảng và bộ liệt kê có thể được chỉ định bằng cách sử dụng các biểu thức hằng số. Biểu thức có thể sử dụng dấu ngoặc đơn để thực hiện các thao tác lồng nhau. Các giá trị biểu thức không đổi có thể được sử dụng với các giá trị tích phân hoặc float.

chữ truefalse đại diện cho các giá trị boolean. Các giá trị với a . nhưng không có hậu tố, chẳng hạn như 3.8 , được coi là giá trị kép. Các giá trị float có hậu tố f , chẳng hạn như 2.4f . Giá trị tích phân có hậu tố l hoặc L biểu thị giá trị dài 64 bit. Mặt khác, các giá trị tích phân sẽ có loại có chữ ký 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 . Các giá trị hex, chẳng hạn như 0x3 , trước tiên được hiểu là loại không dấu bảo toàn giá trị nhỏ nhất giữa 32 bit và 64 bit, sau đó được diễn giải lại dưới dạng giá trị không dấu. Vì vậy, 0xffffffff có giá trị int -1 . Bắt đầu từ Android 13, hậu tố u8 có thể được thêm vào các hằng số, chẳng hạn như 3u8 để biểu thị giá trị byte . Hậu tố này rất quan trọng để một phép tính, chẳng hạn như 0xffu8 * 3 , được hiểu là -3 với loại byte trong khi 0xff * 3765 với loại int .

Các toán tử được hỗ trợ có ngữ nghĩa C++ và Java. Theo thứ tự ưu tiên từ thấp nhất đến cao nhất, các toán tử nhị phân là || && | ^ & == != < > <= >= << >> + - * / % . Toán tử một ngôi là + - ! ~ .