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 แสดงวิธี
ดำเนินการเรียกใช้
รูปที่ 1 การดำเนินการเรียกใช้ Binder
หากต้องการเรียกใช้เมธอดในกระบวนการอื่น ดังที่แสดงในรูปที่ 1 จะเกิดสิ่งต่อไปนี้
- โค้ดไคลเอ็นต์ในกระบวนการ A เรียกใช้โค้ดพร็อกซีในกระบวนการ A พร็อกซี
โค้ดในกระบวนการ A จะสร้างธุรกรรมที่มีรายการต่อไปนี้
- ตัวระบุสำหรับโหนด
- ตัวระบุสำหรับ
foo()
เมธอดในโหนด - บัฟเฟอร์ที่มีสำเนาของอาร์กิวเมนต์
a
และb
- ระบบจะส่งธุรกรรมไปยังไดรเวอร์เคอร์เนล Binder
- ไดรเวอร์เคอร์เนล Binder จะกำหนดว่ากระบวนการ B เป็นโฮสต์ของโหนด
- เคอร์เนลจะคัดลอกธุรกรรมทั้งหมดไปยังพื้นที่ที่อยู่ของกระบวนการ B
- เคอร์เนลจะค้นหาเธรดในกระบวนการ B เพื่อจัดการธุรกรรมและส่งต่อ ธุรกรรมไปยังเธรดนั้น
- เธรดจะแกะธุรกรรม ค้นหาโหนด และส่งธุรกรรมไปยังออบเจ็กต์โหนด
- ออบเจ็กต์โหนดจะรับตัวระบุฟังก์ชันจากธุรกรรม
คลายแพ็ก
a
และb
จากบัฟเฟอร์ธุรกรรม และจัดเก็บa
และb
ใน ตัวแปรภายใน - ออบเจ็กต์โหนดจะเรียก
foo(a, b)
ในโค้ดฝั่งเซิร์ฟเวอร์ในกระบวนการ B - ผลลัพธ์ของการเรียกจะแสดงในการทำธุรกรรมการตอบกลับ ซึ่งจะส่งไปยังไดรเวอร์เคอร์เนล แล้วส่งกลับไปยังพร็อกซีที่เรียกใช้ในกระบวนการ A
- พร็อกซีจะส่งผลลัพธ์นั้นกลับไปยังผู้เรียกใช้ในกระบวนการ A
กรณีการใช้งาน Binder
Binder สามารถใช้ได้ในสถานการณ์ต่างๆ ที่ต้องมีการสื่อสารระหว่างซอฟต์แวร์ในกระบวนการต่างๆ เช่น
แอปกล้องใช้ Binder เพื่อสื่อสารกับเซิร์ฟเวอร์กล้องในกระบวนการอื่น จากนั้นเซิร์ฟเวอร์กล้องจะใช้ Binder เพื่อสื่อสารกับ HAL ของกล้องในกระบวนการอื่น
แอปใช้ Binder เพื่อสื่อสารกับเซิร์ฟเวอร์ของระบบในกระบวนการอื่น เซิร์ฟเวอร์ระบบใช้ Binder เพื่อสื่อสารกับ HAL ในกระบวนการอื่นๆ
แอปในกระบวนการหนึ่งใช้ Binder เพื่อสื่อสารกับแอปอื่นใน อีกกระบวนการหนึ่ง
Daemon ของระบบที่มีหน้าที่ติดตั้ง อัปเดต และนำแอปออก (
installd
) จะใช้ Binder เพื่อสื่อสารกับ Daemon ของรันไทม์ Android ("artd") เพื่อคอมไพล์แอป