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

'שפת ההגדרה של ממשק Android' (AIDL) היא כלי שמאפשר למשתמשים להפשט את IPC. בהתאם לממשק (מצוין בקובץ .aidl), מערכות build שונות משתמשות בקובץ הבינארי aidl כדי ליצור קישורי C++ או Java, כדי שניתן יהיה להשתמש בממשק הזה בתהליכים שונים, ללא קשר לזמן הריצה או לקצב הביט שבו.

אפשר להשתמש ב-AIDL בין כל תהליך ב-Android: בין רכיבי פלטפורמה או בין אפליקציות. עם זאת, הוא אף פעם לא ישמש כ-API לאפליקציות. לדוגמה, אפשר להשתמש ב-AIDL כדי להטמיע SDK API בפלטפורמה, אבל פלטפורמת ה-API של ה-SDK אף פעם לא מכילה ממשקי API של AIDL באופן ישיר. כדי להבין איך משתמשים ישירות ב-AIDL בין אפליקציות, ראו מסמכי העזרה למפתחי Android. כשמשתמשים ב-AIDL בין רכיבי פלטפורמה שמתעדכנים בנפרד, כמו APEX (שמתחיל ב-Android 10) או HAL (שמתחיל ב-Android 11), צריך להשתמש במערכת ניהול הגרסאות שנקראת Stable AIDL.

דוגמה:

לפניכם דוגמה לממשק AIDL:

    package my.package;

    import my.package.Baz; // defined elsewhere

    interface IFoo {
        void doFoo(Baz baz);
    }

תהליך של שרת רושם את הממשק ומציג קריאות אליו, ותהליך של לקוח מבצע קריאות לממשקים האלה. במקרים רבים, תהליך משמש גם כלקוח וגם כשרת, כי הוא עשוי להתייחס למספר ממשקים. למידע נוסף על שפת AIDL, ראו שפת AIDL. למידע נוסף על זמני הריצה השונים שזמינים לשימוש בממשקים האלה, ראו קצוות עורפיים של AIDL. ההצהרות האלה דומות בדיוק להצהרה לגבי כיתה בשפה נתונה, אבל הן פועלות לאורך תהליכים שונים.

איך זה עובד

AIDL משתמש במנהל התקן הליבה של הקישור (kernel) כדי לבצע שיחות. כשמבצעים קריאה, מזהה ה-method וכל האובייקטים נדחסים למאגר נתונים זמני ומועתקים לתהליך מרוחק שבו ה-thread של קלסר ממתין לקריאת הנתונים. אחרי ש-thread של binder מקבל נתונים של טרנזקציה, ה-thread מחפש אובייקט stub מקורי בתהליך המקומי, והמחלקה פורקת את הנתונים ומבצעת קריאה לאובייקט בממשק המקומי. אובייקט הממשק המקומי הוא האובייקט שתהליך שרת יוצר ורושם. כשקריאות מתבצעות באותו תהליך ובאותו קצה עורפי, לא קיימים אובייקטים של שרת proxy, ולכן הקריאות ישירות ללא אריזה או פירוק.

אינטראקציה עם שירותים במכשיר

ב-Android יש כמה פקודות שמאפשרות אינטראקציה עם שירותים במכשיר. כדאי לבצע את הפעולות הבאות:

    adb shell dumpsys --help # listing and dumping services
    adb shell service --help # sending commands to services for testing