ภาษาที่ใช้สื่อสารข้อมูลระหว่างคอมโพเนนต์ของ Android (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);
}
กระบวนการของเซิร์ฟเวอร์จะลงทะเบียนอินเทอร์เฟซและให้บริการเรียกใช้อินเทอร์เฟซนั้น และกระบวนการของไคลเอ็นต์จะเรียกใช้อินเทอร์เฟซเหล่านั้น ในหลายกรณี กระบวนการจะทําหน้าที่เป็นทั้งไคลเอ็นต์และเซิร์ฟเวอร์ เนื่องจากอาจอ้างอิงอินเทอร์เฟซหลายรายการ ดูรายละเอียดเพิ่มเติมเกี่ยวกับภาษา AIDL ได้ที่ภาษา AIDL ดูรายละเอียดเพิ่มเติมเกี่ยวกับรันไทม์ต่างๆ ที่พร้อมให้ใช้อินเทอร์เฟซเหล่านี้ได้ที่แบ็กเอนด์ AIDL การประกาศประเภทเหล่านี้เหมือนกับการประกาศคลาสในภาษาหนึ่งๆ แต่ใช้ได้กับทุกกระบวนการ
วิธีการทำงาน
AIDL ใช้ไดรเวอร์เคอร์เนล Binder เพื่อโทรออก เมื่อคุณทำการเรียกใช้ ระบบจะแพ็กตัวระบุเมธอดและออบเจ็กต์ทั้งหมดลงในบัฟเฟอร์และคัดลอกไปยังกระบวนการระยะไกลที่เธรด Binder รออ่านข้อมูล เมื่อเธรด Binder ได้รับข้อมูลสําหรับธุรกรรม เธรดจะค้นหาออบเจ็กต์สแต็บเนทีฟในกระบวนการภายใน และคลาสนี้จะแตกไฟล์ข้อมูลและเรียกใช้ออบเจ็กต์อินเทอร์เฟซภายใน ออบเจ็กต์อินเทอร์เฟซในเครื่องนี้เป็นออบเจ็กต์ที่กระบวนการของเซิร์ฟเวอร์สร้างขึ้นและลงทะเบียน เมื่อมีการเรียกใช้ในกระบวนการเดียวกันและแบ็กเอนด์เดียวกัน จะไม่มีออบเจ็กต์พร็อกซีอยู่ ดังนั้นการเรียกใช้จึงเป็นแบบโดยตรงโดยไม่ต้องมีการจัดแพ็กหรือแกะแพ็ก
โต้ตอบกับบริการในอุปกรณ์
Android มีคำสั่งบางอย่างที่อนุญาตให้โต้ตอบกับบริการในอุปกรณ์ โดยคุณสามารถลองทำสิ่งต่อไปนี้
adb shell dumpsys --help # listing and dumping services
adb shell service --help # sending commands to services for testing