ภาพรวมของ AIDL

Android Interface Definition Language (AIDL) เป็นเครื่องมือที่ช่วยให้ผู้ใช้สามารถแยก IPC ออกไปได้ ด้วยอินเทอร์เฟซ (ที่ระบุในไฟล์ .aidl ) ระบบบิลด์ต่างๆ จะใช้ไบนารีของ aidl เพื่อสร้างการโยง C++ หรือ Java เพื่อให้อินเทอร์เฟซนี้สามารถใช้ข้ามกระบวนการได้ โดยไม่คำนึงถึงรันไทม์หรือบิตเนสที่นั่น

สามารถใช้ AIDL ระหว่างกระบวนการใดๆ ใน Android: ระหว่างส่วนประกอบแพลตฟอร์มหรือระหว่างแอป อย่างไรก็ตาม ไม่เคยใช้เป็น API สำหรับแอป อาจใช้ AIDL เพื่อนำ SDK API ไปใช้ในแพลตฟอร์มได้ ตัวอย่างเช่น แต่พื้นผิว SDK API จะไม่มี AIDL API โดยตรง สำหรับเอกสารเกี่ยวกับวิธีการใช้ AIDL ระหว่างแอปโดยตรง โปรดดู เอกสารสำหรับนักพัฒนา Android ที่ เกี่ยวข้อง เมื่อใช้ AIDL ระหว่างส่วนประกอบแพลตฟอร์มที่อัปเดตแยกต่างหาก เช่น APEX (เริ่มใน Android 10) หรือ HAL (เริ่มใน Android 11) ต้องใช้ระบบการกำหนดเวอร์ชันที่เรียกว่า AIDL ที่เสถียร

ตัวอย่าง

นี่คือตัวอย่างอินเทอร์เฟซ 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 และสูงกว่ารองรับการประกาศแบบพัสดุได้ ตัวอย่างเช่น:

    package my.package;

    import my.package.Boo;

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

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

    package my.package;

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

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 T (รุ่นทดลอง AOSP) และรองรับการประกาศประเภทที่ซ้อนกันที่สูงกว่า ตัวอย่างเช่น:

    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 แบ็กเอนด์ การประกาศประเภทนี้เหมือนกับการประกาศคลาสในภาษาที่กำหนด แต่ทำงานข้ามกระบวนการ

มันทำงานอย่างไร

AIDL ใช้ไดรเวอร์เคอร์เนลของ Binder เพื่อโทรออก เมื่อคุณโทรออก ตัวระบุเมธอดและอ็อบเจ็กต์ทั้งหมดจะถูกบรรจุลงในบัฟเฟอร์และคัดลอกไปยังกระบวนการระยะไกลที่เธรดตัวผูกรออ่านข้อมูล เมื่อเธรด Binder ได้รับข้อมูลสำหรับธุรกรรม เธรดจะค้นหาอ็อบเจ็กต์ stub ดั้งเดิมในกระบวนการโลคัล และคลาสนี้จะคลายแพ็กข้อมูลและทำการเรียกบนอ็อบเจ็กต์อินเทอร์เฟซภายใน ออบเจ็กต์อินเทอร์เฟซภายในเครื่องนี้เป็นกระบวนการที่เซิร์ฟเวอร์สร้างและลงทะเบียน เมื่อมีการโทรในกระบวนการเดียวกันและแบ็กเอนด์เดียวกัน จะไม่มีอ็อบเจ็กต์พร็อกซี่อยู่ ดังนั้นการเรียกจึงโดยตรงโดยไม่ต้องแพ็กหรือแตกไฟล์

การโต้ตอบกับบริการบนอุปกรณ์

Android มาพร้อมกับคำสั่งสองสามคำสั่งเพื่อให้สามารถโต้ตอบกับบริการต่างๆ บนอุปกรณ์ได้ ลอง:

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