ภาพรวมของ Binder

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

ในแง่ของ Binder กระบวนการเรียกใช้ถือเป็น Client และ Endpoint ของกระบวนการเรียกใช้เรียกว่า Binder Proxy หรือ Proxy ในทางกลับกัน กระบวนการที่เรียกใช้คือเซิร์ฟเวอร์ และปลายทางของกระบวนการนี้เรียกว่าโหนด 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") เพื่อคอมไพล์แอป