ภาษา AIDL

ภาษา AIDL มีพื้นฐานมาจากภาษา Java อย่างหลวมๆ ไฟล์ระบุสัญญาอินเทอร์เฟซและประเภทข้อมูลต่างๆ และค่าคงที่ที่ใช้ในสัญญานี้

บรรจุุภัณฑ์

ไฟล์ AIDL ทุกไฟล์เริ่มต้นด้วยแพ็คเกจเสริมที่สอดคล้องกับชื่อแพ็คเกจในแบ็กเอนด์ต่างๆ การประกาศแพ็คเกจมีลักษณะดังนี้:

    package my.package;

เช่นเดียวกับ Java ไฟล์ AIDL จะต้องอยู่ในโครงสร้างโฟลเดอร์ที่ตรงกับแพ็คเกจ ไฟล์ที่มีแพ็คเกจ my.package ต้องอยู่ในโฟลเดอร์ my/package/

ประเภท

ในไฟล์ AIDL มีหลายที่ที่สามารถระบุประเภทได้ สำหรับรายการประเภทที่แน่นอนที่รองรับในภาษา AIDL โปรดดู ประเภทแบ็กเอนด์ AIDL

คำอธิบายประกอบ

ภาษา AIDL หลายส่วนรองรับคำอธิบายประกอบ สำหรับรายการคำอธิบายประกอบและตำแหน่งที่สามารถนำมาใช้ โปรดดู คำอธิบายประกอบ AIDL

นำเข้า

หากต้องการใช้ประเภทที่กำหนดไว้ในอินเทอร์เฟซอื่น คุณต้องเพิ่มการขึ้นต่อกันในระบบบิลด์ก่อน ในโมดูล cc_* และ java_* Soong โดยที่ไฟล์ .aidl ถูกใช้โดยตรงภายใต้ srcs ในแพลตฟอร์ม Android คุณสามารถเพิ่มไดเร็กทอรีโดยใช้ฟิลด์ aidl: { include_dirs: ... } สำหรับการนำเข้าโดยใช้ aidl_interface ดู ที่นี่

การนำเข้ามีลักษณะดังนี้:

    import some.package.Foo;  // explicit import

เมื่อนำเข้าประเภทในแพ็คเกจเดียวกัน คุณสามารถละเว้นแพ็คเกจได้ แม้ว่าการละเว้นแพ็คเกจอาจทำให้เกิดข้อผิดพลาดในการนำเข้าที่ไม่ชัดเจนเมื่อมีการระบุประเภทโดยไม่มีแพ็คเกจและใส่ในเนมสเปซส่วนกลาง (โดยทั่วไปทุกประเภทควรเป็นเนมสเปซ):

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

การกำหนดประเภท

โดยทั่วไปไฟล์ AIDL จะกำหนดประเภทที่ใช้เป็นอินเทอร์เฟซ

อินเทอร์เฟซ

นี่คือตัวอย่างอินเทอร์เฟซ AIDL:

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

อินเทอร์เฟซกำหนดวัตถุด้วยชุดของวิธีการ วิธีการอาจเป็น oneway ( oneway void doFoo() ) หรือแบบซิงโครนัส หากอินเทอร์เฟซถูกกำหนดให้เป็น oneway ( oneway interface ITeleport {...} ) ดังนั้นวิธีการทั้งหมดในนั้นจะเป็น oneway โดยปริยาย วิธี Oneway ถูกส่งแบบอะซิงโครนัสและไม่สามารถส่งคืนผลลัพธ์ได้ วิธีการแบบ Oneway จากเธรดเดียวกันไปยังเครื่องผูกเดียวกันนั้นรับประกันว่าจะดำเนินการแบบอนุกรมด้วย (แม้ว่าอาจอยู่ในเธรดที่ต่างกัน) สำหรับการอภิปรายเกี่ยวกับวิธีการตั้งค่าเธรด โปรดดูที่ AIDL แบ็กเอนด์การจัดการเธรด

วิธีการสามารถมีอาร์กิวเมนต์เป็นศูนย์หรือมากกว่านั้นได้ อาร์กิวเมนต์ของเมธอดอาจเป็น in , out หรือ inout สำหรับการอภิปรายว่าสิ่งนี้ส่งผลต่อประเภทอาร์กิวเมนต์อย่างไร โปรดดู AIDL แบ็กเอนด์ทิศทาง

พัสดุ

สำหรับคำอธิบายวิธีสร้างพัสดุแบบเฉพาะแบ็กเอนด์ AIDL แบ็กเอนด์แบบกำหนดเองแบบแบ่งพัสดุได้

Android 10 และสูงกว่ารองรับคำจำกัดความแบบแยกส่วนได้โดยตรงใน AIDL พัสดุประเภทนี้เรียกว่าพัสดุแบบมีโครงสร้าง สำหรับข้อมูลเพิ่มเติมเกี่ยวกับความสัมพันธ์ระหว่าง AIDL ที่มีโครงสร้างและความเสถียรในคอมไพเลอร์ AIDL และระบบการสร้างของเรา โปรดดูที่ AIDL ที่มีโครงสร้างและเสถียร

ตัวอย่างเช่น:

    package my.package;

    import my.package.Boo;

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

สหภาพแรงงาน

Android 12 และสูงกว่ารองรับการประกาศของสหภาพ ตัวอย่างเช่น:

    package my.package;

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

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

เอนัม

Android 11 และสูงกว่ารองรับการประกาศแจงนับ ตัวอย่างเช่น:

    package my.package;

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

การประกาศประเภทที่ซ้อนกัน

Android 13 และสูงกว่ารองรับการประกาศประเภทที่ซ้อนกัน ตัวอย่างเช่น:

    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
    }

ค่าคงที่

อินเทอร์เฟซ AIDL แบบกำหนดเอง การแบ่งส่วน และสหภาพสามารถมีค่าคงที่จำนวนเต็มและสตริงได้ เช่น:

    const @utf8InCpp String HAPPY = ":)";
    const String SAD = ":(";
    const byte BYTE_ME = 1;
    const int ANSWER = 6 * 7;

นิพจน์คงที่

ค่าคงที่ AIDL ขนาดอาร์เรย์ และตัวแจงนับสามารถระบุได้โดยใช้นิพจน์คงที่ นิพจน์สามารถใช้วงเล็บเพื่อซ้อนการดำเนินการได้ ค่านิพจน์คงที่สามารถใช้กับค่าอินทิกรัลหรือค่าทศนิยมได้

ตัวอักษร true และ false แสดงถึงค่าบูลีน ค่าที่มี . แต่ไม่มีส่วนต่อท้าย เช่น 3.8 จะถือเป็นค่าสองเท่า ค่าทศนิยมมีส่วนต่อท้าย f เช่น 2.4f ค่าปริพันธ์ที่มีส่วนต่อท้าย l หรือ L บ่งชี้ถึงค่ายาว 64 บิต มิฉะนั้น ค่าปริพันธ์จะได้รับประเภทเซ็นชื่อเพื่อรักษาค่าที่เล็กที่สุดระหว่าง 8 บิต (ไบต์), 32 บิต (int) และ 64 บิต (ยาว) ดังนั้น 256 จึงถือเป็น int แต่ 255 + 1 โอเวอร์โฟลว์เป็น byte 0 ค่าเลขฐานสิบหก เช่น 0x3 จะถูกตีความเป็นครั้งแรกว่าเป็นประเภทที่ไม่ได้ลงนามซึ่งรักษาค่าที่เล็กที่สุดระหว่าง 32 บิตถึง 64 บิต จากนั้นจึงตีความใหม่เป็นค่าที่ไม่ได้ลงนาม ดังนั้น 0xffffffff มีค่า int -1 เริ่มตั้งแต่ Android 13 เป็นต้นไป คุณสามารถเพิ่มส่วนต่อท้าย u8 ลงในค่าคงที่ เช่น 3u8 เพื่อแสดงค่า byte ส่วนต่อท้ายนี้มีความสำคัญเพื่อให้การคำนวณ เช่น 0xffu8 * 3 ถูกตีความว่าเป็น -3 ด้วยประเภท byte ในขณะที่ 0xff * 3 คือ 765 ด้วยประเภท int

ตัวดำเนินการที่รองรับมีซีแมนทิกส์ C++ และ Java เรียงลำดับจากลำดับความสำคัญต่ำสุดไปสูงสุด ตัวดำเนินการไบนารีคือ || && | ^ & == != < > <= >= << >> + - * / % ตัวดำเนินการ Unary คือ + - ! ~ .