ภาพรวมของ Binder

Binder เป็นระบบสำหรับการสื่อสารระหว่างกระบวนการ (IPC) ที่ช่วยให้ 2 กระบวนการในอุปกรณ์ที่ใช้พลังงานจาก Android สื่อสารกันได้ Binder มีวิธีในการเรียกใช้ฟังก์ชันในกระบวนการอื่นที่ผู้เรียกใช้มองเห็นได้อย่างสมบูรณ์

ในแง่ของ Binder กระบวนการที่เรียกใช้จะถือเป็น ไคลเอ็นต์ และปลายทางของกระบวนการนี้เรียกว่า พร็อกซีของ Binder หรือ พร็อกซี ในทางกลับกัน กระบวนการที่ถูกเรียกใช้คือ เซิร์ฟเวอร์ และปลายทางของกระบวนการนี้เรียกว่า โหนดของ Binder หรือ โหนด

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

int result = someNodeInterface.foo(a, b); // someNodeInterface is a proxy object

สมมติว่าไคลเอ็นต์ที่เรียกใช้ foo() ทำงานในกระบวนการ A และเซิร์ฟเวอร์ที่ใช้ foo() ทำงานในกระบวนการ B รูปที่ 1 แสดงวิธีเรียกใช้

การดำเนินการเรียกใช้ Binder

รูปที่ 1 การเรียกใช้ Binder

หากต้องการเรียกใช้เมธอดในกระบวนการอื่น ดังที่แสดงในรูปที่ 1 สิ่งต่อไปนี้จะเกิดขึ้น

  1. โค้ดไคลเอ็นต์ในกระบวนการ A จะเรียกใช้โค้ดพร็อกซีในกระบวนการ A โค้ดพร็อกซีในกระบวนการ A จะสร้างธุรกรรมที่มีรายการต่อไปนี้
    • ตัวระบุสำหรับโหนด
    • ตัวระบุสำหรับเมธอด foo() ในโหนด
    • บัฟเฟอร์ที่มีสำเนาของอาร์กิวเมนต์ a และ b
  2. ระบบจะส่งธุรกรรมไปยังไดรเวอร์เคอร์เนลของ Binder
  3. ไดรเวอร์เคอร์เนลของ Binder จะกำหนดว่ากระบวนการ B เป็นโฮสต์ของโหนด
  4. เคอร์เนลจะคัดลอกธุรกรรมทั้งหมดลงในพื้นที่ที่อยู่ของกระบวนการ B
  5. เคอร์เนลจะค้นหาเธรดในกระบวนการ B เพื่อจัดการธุรกรรมและส่งธุรกรรมไปยังเธรดนั้น
  6. เธรดจะคลายแพ็กธุรกรรม ค้นหาโหนด และส่งธุรกรรมไปยังออบเจ็กต์โหนด
  7. ออบเจ็กต์โหนดจะรับตัวระบุฟังก์ชันจากธุรกรรม คลายแพ็ก a และ b จากบัฟเฟอร์ธุรกรรม และจัดเก็บ a และ b ใน ตัวแปรภายใน
  8. ออบเจ็กต์โหนดจะเรียกใช้ foo(a, b) ในโค้ดเซิร์ฟเวอร์ในกระบวนการ B
  9. ระบบจะส่งคืนผลลัพธ์ของการเรียกใช้ในธุรกรรมการตอบกลับ ซึ่งจะส่งไปยังไดรเวอร์เคอร์เนล แล้วส่งกลับไปยังพร็อกซีที่เรียกใช้ในกระบวนการ A
  10. พร็อกซีจะส่งคืนผลลัพธ์ดังกล่าวไปยังผู้เรียกใช้ในกระบวนการ A

กรณีการใช้งานของ Binder

Binder สามารถใช้ได้ในสถานการณ์ต่างๆ ที่ต้องมีการสื่อสารระหว่างซอฟต์แวร์ในกระบวนการต่างๆ เช่น

  • แอปกล้องใช้ Binder เพื่อสื่อสารกับเซิร์ฟเวอร์กล้องในกระบวนการอื่น จากนั้นเซิร์ฟเวอร์กล้องจะใช้ Binder เพื่อสื่อสารกับ HAL ของกล้องในกระบวนการอื่น

  • แอปใช้ Binder เพื่อสื่อสารกับเซิร์ฟเวอร์ระบบในกระบวนการอื่น เซิร์ฟเวอร์ระบบใช้ Binder เพื่อสื่อสารกับ HAL ในกระบวนการอื่นๆ

  • แอปในกระบวนการหนึ่งใช้ Binder เพื่อสื่อสารกับแอปอื่นในกระบวนการอื่น

  • Daemon ของระบบที่รับผิดชอบในการติดตั้ง อัปเดต และนำแอปออก (installd) ใช้ Binder เพื่อสื่อสารกับ Daemon ของรันไทม์ Android ('artd') เพื่อคอมไพล์แอป

AIDL และ Binder

ใช้ภาษาที่ใช้สื่อสารข้อมูลระหว่างคอมโพเนนต์ของ Android (AIDL) เพื่อกำหนดอินเทอร์เฟซการเขียนโปรแกรมที่ใช้ Binder สำหรับ IPC ดูข้อมูลเพิ่มเติมได้ที่ ภาพรวมของ AIDL