Binder เป็นระบบสำหรับการสื่อสารระหว่างกระบวนการ (IPC) ที่ช่วยให้ 2 กระบวนการในอุปกรณ์ที่ใช้พลังงานจาก Android สื่อสารกันได้ Binder มีวิธีในการเรียกใช้ฟังก์ชันในกระบวนการอื่นที่ผู้เรียกใช้มองเห็นได้อย่างสมบูรณ์
ในแง่ของ Binder กระบวนการที่เรียกใช้จะถือเป็น ไคลเอ็นต์ และปลายทางของกระบวนการนี้เรียกว่า พร็อกซีของ Binder หรือ พร็อกซี ในทางกลับกัน กระบวนการที่ถูกเรียกใช้คือ เซิร์ฟเวอร์ และปลายทางของกระบวนการนี้เรียกว่า โหนดของ 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') เพื่อคอมไพล์แอป
AIDL และ Binder
ใช้ภาษาที่ใช้สื่อสารข้อมูลระหว่างคอมโพเนนต์ของ Android (AIDL) เพื่อกำหนดอินเทอร์เฟซการเขียนโปรแกรมที่ใช้ Binder สำหรับ IPC ดูข้อมูลเพิ่มเติมได้ที่ ภาพรวมของ AIDL