ภาษา AIDL

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

แพ็กเกจ

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

    package my.package;

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

ประเภท

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

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

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

การนำเข้า

หากต้องการใช้ประเภทที่กำหนดในอินเทอร์เฟซอื่น คุณต้องเพิ่มทรัพยากร Dependency ในอินเทอร์เฟซ ระบบบิลด์ ในโมดูล 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 ระบบจะจัดส่งเมธอดทางเดียวแบบไม่พร้อมกัน และไม่สามารถ แสดงผลการค้นหา เมธอดทางเดียวจากชุดข้อความเดียวกันไปยังแฟ้มเดียวกันด้วย ดำเนินการแบบต่อเนื่อง (แต่อาจเป็นไปได้ในเทรดที่ต่างกัน) สำหรับ ดูชุดข้อความแบ็กเอนด์ 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;
    }

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