Tổng quan về Binder

Binder là một hệ thống giao tiếp giữa các quy trình, cho phép hai quy trình trên một thiết bị chạy Android giao tiếp với nhau. Binder cung cấp một phương tiện để thực thi các lệnh gọi hàm trong một quy trình khác hoàn toàn minh bạch đối với phương thức gọi.

Trong ngữ cảnh của binder, quy trình gọi được coi là máy khách và điểm cuối của quy trình này được gọi là binder proxy hay proxy. Ngược lại, quy trình đang được gọi sẽ là máy chủ và điểm cuối của quy trình này được gọi là binder node hoặc node.

Mỗi node có thể hiển thị và triển khai giao diện riêng. Thông qua một proxy, máy khách có thể thực thi các phương thức trên một giao diện node như thể lệnh gọi là một lệnh gọi hàm cục bộ. Ví dụ sau đây cho thấy một phương thức đang được gọi:

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

Giả sử máy khách gọi foo() đang chạy trong quy trình A và máy chủ triển khai foo() đang chạy trong quy trình B. Hình 1 cho thấy cách lệnh gọi này được thực hiện:

Thực thi lệnh gọi Binder.

Hình 1. Thực thi lệnh gọi Binder.

Để thực thi một phương thức trong một quy trình khác, như minh hoạ trong hình 1, những việc sau sẽ xảy ra:

  1. Mã máy khách trong quy trình A sẽ gọi mã proxy trong quy trình A. Mã proxy trong quy trình A sẽ tạo một giao dịch chứa các mục sau:
    • Giá trị nhận dạng của node
    • Giá trị nhận dạng cho phương thức foo() trên node
    • Một vùng đệm chứa bản sao của các đối số ab
  2. Giao dịch được gửi đến trình điều khiển hạt nhân binder.
  3. Trình điều khiển hạt nhân binder xác định rằng quy trình B lưu trữ node.
  4. Hạt nhân sao chép toàn bộ giao dịch vào không gian địa chỉ của quy trình B.
  5. Hạt nhân tìm thấy một luồng trong quy trình B để xử lý giao dịch và truyền giao dịch đó cho luồng này.
  6. Luồng này sẽ giải nén giao dịch, tìm node và gửi giao dịch đến đối tượng node.
  7. Đối tượng node lấy giá trị nhận dạng hàm từ giao dịch, giải nén ab từ vùng đệm giao dịch, đồng thời lưu trữ ab trong các biến cục bộ.
  8. Đối tượng node gọi foo(a, b) trên mã máy chủ trong quy trình B.
  9. Kết quả của lệnh gọi được trả về trong một giao dịch phản hồi, được truyền đến trình điều khiển hạt nhân rồi quay lại proxy gọi trong quy trình A.
  10. Proxy sẽ trả về kết quả đó cho phương thức gọi trong quy trình A.

Các trường hợp sử dụng Binder

Bạn có thể dùng Binder trong nhiều trường hợp mà hoạt động giao tiếp giữa phần mềm trong các quy trình khác nhau phải diễn ra. Ví dụ:

  • Ứng dụng camera sử dụng binder để giao tiếp với máy chủ camera trong một quy trình khác. Sau đó, máy chủ camera sẽ dùng binder để giao tiếp với HAL camera trong một quy trình khác.

  • Một ứng dụng sử dụng binder để giao tiếp với máy chủ hệ thống trong một quy trình khác. Máy chủ hệ thống sử dụng binder để giao tiếp với các HAL trong các quy trình khác.

  • Một ứng dụng trong một quy trình sử dụng binder để giao tiếp với một ứng dụng khác trong một quy trình khác.

  • Trình nền hệ thống chịu trách nhiệm cài đặt, cập nhật và xoá các ứng dụng (installd) sử dụng binder để giao tiếp với trình nền thời gian chạy Android ("artd") nhằm biên dịch các ứng dụng.

AIDL và binder

Sử dụng Ngôn ngữ thiết kế giao diện Android (AIDL) để xác định các giao diện lập trình sử dụng binder cho IPC. Để biết thêm thông tin, hãy xem bài viết Tổng quan về AIDL.