סקירה כללית של הכריכה

Binder היא מערכת שמאפשרת תקשורת בין תהליכים (IPC) שפועלים במכשירי Android אפשר להשתמש בה כדי לשלוח בקשה להפעלת פונקציה מתהליך אחר שתהיה שקופה לגמרי לפונקציית הקריאה החוזרת (caller).

הגדרות ב-Binder: התהליך ששולח את הקריאה הוא הלקוח ונקודת הקצה שלו נקראת Binder proxy או Proxy. התהליך שאליו נשלחת הקריאה הוא השרת ונקודת הקצה שלו נקראת צומת Binder או צומת.

כל צומת יכול לחשוף ולהטמיע ממשק משלו, ואז הלקוח יכול להשתמש ב-Proxy כדי להריץ מתודות על הממשק של הצומת כאילו זו שליחה מקומית של בקשה להפעלת פונקציה. דוגמה להפעלה של מתודה:

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

נניח שהלקוח ששולח קריאה ל-foo() פועל בתהליך א', והשרת שמטמיע את foo() פועל בתהליך ב'. באיור 1 רואים איך הקריאה נשלחת:

שליחת קריאה ב-Binder

איור 1. שליחת קריאה ב-Binder

זה מה שקורה כשמריצים מתודה בתהליך אחר, כמו שמוצג באיור 1:

  1. קוד הלקוח בתהליך א' מפעיל את קוד ה-Proxy בתהליך א'. קוד ה-Proxy בתהליך א' יוצר טרנזקציה עם הפריטים הבאים:
    • מזהה של הצומת
    • מזהה של מתודת foo() בצומת
    • מאגר נתונים זמני שיש בו עותק של הארגומנטים a ו-b
  2. הטרנזקציה נשלחת לדרייבר של ליבת Binder.
  3. הדרייבר קובע שהצומת יתארח בתהליך ב'.
  4. הליבה מעתיקה את כל העסקה למרחב הכתובות של תהליך ב'.
  5. הליבה מאתרת בתהליך ב' Thread שבו אפשר לטפל בטרנזקציה ומעבירה את הטרנזקציה לשם.
  6. ה-Thread מפרק את הטרנזקציה, מוצא את הצומת ושולח את הטרנזקציה לאובייקט הצומת.
  7. אובייקט הצומת שולף את מזהה הפונקציה מהטרנזקציה, מפרק את a ואת b ממאגר הנתונים הזמני של הטרנזקציה ושומר את a ואת b במשתנים מקומיים.
  8. אובייקט הצומת שולח קריאה ל-foo(a, b) בקוד השרת בתהליך ב'.
  9. התוצאה של הקריאה מוחזרת בטרנזקציית תגובה, שמועברת לדרייבר של הליבה ואז בחזרה ל-Proxy ששלח את הקריאה מתהליך א'.
  10. ה-Proxy מחזיר את התוצאה הזו לפונקציית הקריאה החוזרת (caller) בתהליך א'.

תרחישי שימוש ב-Binder

אפשר להשתמש ב-Binder במגוון תרחישים שבהם נדרשת תקשורת בין תוכנות בתהליכים שונים. לדוגמה:

  • אפליקציית מצלמה משתמשת ב-Binder כדי לתקשר עם שרת המצלמה בתהליך אחר, ואז שרת המצלמה משתמש ב-Binder כדי לתקשר עם רכיב HAL של המצלמה בתהליך אחר.

  • אפליקציה משתמשת ב-Binder כדי לתקשר עם שרת מערכת בתהליך אחר, ואז שרת המערכת משתמש ב-Binder כדי לתקשר עם רכיב HAL בתהליכים אחרים.

  • אפליקציה בתהליך אחד משתמשת ב-Binder כדי לתקשר עם אפליקציה אחרת בתהליך אחר.

  • הדימון (daemon) של המערכת שאחראי על התקנה, עדכון והסרה של אפליקציות (installd) משתמש ב-Binder כדי לתקשר עם הדימון (daemon) של סביבת זמן הריצה ב-Android ‏(artd) כדי לקמפל אפליקציות.

‫AIDL ו-binder

אתם יכולים להשתמש בשפה לעיצוב ממשקים ב-Android‏ (AIDL) כדי להגדיר אילו ממשקי תכנות ישתמשו ב-Binder לצורכי IPC. מידע נוסף מפורט בסקירה הכללית בנושא AIDL.