ภาพรวมของ AIDL

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

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

ตัวอย่าง

ตัวอย่างอินเทอร์เฟซ AIDL มีดังนี้

    package my.package;

    import my.package.Baz; // defined elsewhere

    interface IFoo {
        void doFoo(Baz baz);
    }

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

วิธีการทำงาน

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

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

Android มาพร้อมกับคำสั่งบางอย่างที่อนุญาตให้โต้ตอบกับบริการใน อุปกรณ์ โดยคุณสามารถลองทำสิ่งต่อไปนี้

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