ภาพรวม AIDL

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

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

ตัวอย่าง

นี่คือตัวอย่างอินเทอร์เฟซ 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 my/package/Baz.aidl
        void doBar(Bar bar);            // defined below

        parcelable Bar { ... }          // union/enum types can be nested, while
                                        // an interface can't.
    }

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

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

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

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

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

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