ภาษา AIDL

จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ

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

บรรจุุภัณฑ์

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

    package my.package;

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

ประเภท

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

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

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

นำเข้า

หากต้องการใช้ประเภทที่กำหนดไว้ในอินเทอร์เฟซอื่น คุณต้องเพิ่มการพึ่งพาในระบบบิลด์ก่อน ใน cc_* และ java_* Soong โดยที่ไฟล์ .aidl ถูกใช้โดยตรงภายใต้ srcs ในการสร้างแพลตฟอร์ม Android คุณสามารถเพิ่มไดเร็กทอรีโดยใช้ field 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 โดยปริยาย วิธีการเดียวถูกส่งแบบอะซิงโครนัสและไม่สามารถส่งคืนผลลัพธ์ได้ เมธอดทางเดียวจากเธรดเดียวกันไปยังตัวผูกเดียวกันยังรับประกันว่าจะรันแบบอนุกรม (แต่อาจใช้เธรดที่แตกต่างกัน) สำหรับการอภิปรายเกี่ยวกับวิธีการตั้งค่าเธรด โปรดดูที่ AIDL แบ็กเอนด์การจัดการเธรด

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

Parcelables

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

Android 10 และสูงกว่ารองรับการประกาศแบบพัสดุได้โดยตรงใน 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;
    }

Enums

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

    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 ในการเรียงลำดับจากลำดับความสำคัญต่ำสุดไปสูงสุด ตัวดำเนินการไบนารีคือ || && | ^ & == != < > <= >= << >> + - * / % . โอเปอเรเตอร์ยูนารีคือ + - ! ~ .