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

Binder היא מערכת לתקשורת בין תהליכים שמאפשרת לשני תהליכים במכשיר עם Android לתקשר. ‫Binder מספק אמצעי להפעלת קריאות לפונקציות בתהליך אחר, באופן שקוף לחלוטין למתקשר.

במונחים של Binder, תהליך הקריאה נחשב ללקוח, ונקודת הקצה שלו נקראת binder proxy או proxy. לעומת זאת, התהליך שאליו מתבצעת הקריאה הוא השרת, ונקודת הקצה שלו נקראת צומת המקשר או צומת.

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

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

נניח שאפליקציית הלקוח שקוראת ל-foo() פועלת בתהליך A, ואפליקציית השרת שמטמיעה את foo() פועלת בתהליך B. איור 1 מציג את אופן הביצוע של הקריאה הזו:

הפעלה של Binder call.

איור 1. הפעלה של Binder call.

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

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

תרחישים לדוגמה לשימוש ב-Binder

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

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

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

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

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