نمای کلی کلاسور

بایندر سیستمی برای ارتباط بین فرآیندی است که به دو فرآیند در یک دستگاه مبتنی بر اندروید اجازه می‌دهد با هم ارتباط برقرار کنند. بایندر ابزاری برای اجرای فراخوانی‌های تابع در فرآیند دیگری فراهم می‌کند که کاملاً برای فراخوانی‌کننده شفاف است.

از نظر binder، فرآیند فراخوانی، کلاینت در نظر گرفته می‌شود و نقطه پایانی آن ، binder proxy یا پروکسی نامیده می‌شود. برعکس، فرآیندی که فراخوانی می‌شود، سرور است و نقطه پایانی آن، binder node یا گره نامیده می‌شود.

هر گره می‌تواند رابط کاربری خود را در معرض نمایش قرار داده و پیاده‌سازی کند. و با استفاده از یک پروکسی، کلاینت می‌تواند متدها را روی رابط کاربری گره اجرا کند، گویی فراخوانی یک تابع محلی است. مثال زیر فراخوانی یک متد را نشان می‌دهد:

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

فرض کنید کلاینتی که foo() را فراخوانی می‌کند، در فرآیند A و سروری که foo() را پیاده‌سازی می‌کند، در فرآیند B در حال اجرا هستند. شکل 1 نحوه اجرای این فراخوانی را نشان می‌دهد:

اجرای فراخوانی بایندر.

شکل ۱. اجرای فراخوانی بایندر.

برای اجرای یک متد در یک فرآیند دیگر، همانطور که در شکل 1 نشان داده شده است، موارد زیر اتفاق می‌افتد:

  1. کد کلاینت در فرآیند A، کد پروکسی در فرآیند A را فراخوانی می‌کند. کد پروکسی در فرآیند A تراکنشی شامل موارد زیر ایجاد می‌کند:
    • یک شناسه برای گره
    • یک شناسه برای متد foo() روی گره
    • یک بافر حاوی یک کپی از آرگومان‌های a و b
  2. تراکنش به درایور هسته binder ارسال می‌شود.
  3. درایور هسته‌ی اتصال‌دهنده تعیین می‌کند که فرآیند B میزبان گره است.
  4. هسته کل تراکنش را در فضای آدرس فرآیند B کپی می‌کند.
  5. هسته، نخی را در فرآیند B برای مدیریت تراکنش پیدا می‌کند و تراکنش را به آن ارسال می‌کند.
  6. نخ، تراکنش را از حالت فشرده خارج می‌کند، گره را پیدا می‌کند و تراکنش را به شیء گره ارسال می‌کند.
  7. شیء گره، شناسه تابع را از تراکنش دریافت می‌کند، a و b را از بافر تراکنش باز می‌کند و a و b را در متغیرهای محلی ذخیره می‌کند.
  8. شیء گره، تابع foo(a, b) را روی کد سرور در فرآیند B فراخوانی می‌کند.
  9. نتیجه فراخوانی در یک تراکنش پاسخ برگردانده می‌شود که به درایور هسته ارسال شده و سپس به پروکسی فراخوانی کننده در فرآیند A بازمی‌گردد.
  10. پروکسی آن نتیجه را به فراخواننده در فرآیند A برمی‌گرداند.

موارد استفاده از بایندر

Binder می‌تواند در سناریوهای متنوعی که در آن‌ها ارتباط بین نرم‌افزارها در فرآیندهای مختلف باید رخ دهد، مورد استفاده قرار گیرد. به عنوان مثال:

  • یک برنامه دوربین از binder برای ارتباط با سرور دوربین در یک فرآیند دیگر استفاده می‌کند. سپس سرور دوربین از binder برای ارتباط با HAL دوربین در یک فرآیند دیگر استفاده می‌کند.

  • یک برنامه از binder برای ارتباط با سرور سیستم در فرآیند دیگر استفاده می‌کند. سرور سیستم از binder برای ارتباط با HALها در فرآیندهای دیگر استفاده می‌کند.

  • یک برنامه در یک فرآیند از binder برای ارتباط با یک برنامه متفاوت در فرآیند دیگر استفاده می‌کند.

  • دیمن سیستم که مسئول نصب، به‌روزرسانی و حذف برنامه‌ها ( installd ) است، از binder برای ارتباط با دیمن زمان اجرای اندروید ('artd') جهت کامپایل برنامه‌ها استفاده می‌کند.

AIDL و چسب

از زبان طراحی رابط اندروید (AIDL) برای تعریف رابط‌های برنامه‌نویسی که از binder برای IPC استفاده می‌کنند، استفاده کنید. برای اطلاعات بیشتر، به مرور کلی AIDL مراجعه کنید.