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

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

אפשר להשתמש ב-AIDL בין כל תהליך ב-Android: בין רכיבי פלטפורמה או בין אפליקציות. עם זאת, הוא אף פעם לא ישמש כ-API לאפליקציות. אפשר להשתמש ב-AIDL כדי להטמיע ממשק API של SDK בפלטפורמה, לדוגמה, אבל ממשק ה-API של ה-SDK אף פעם לא מכיל ממשקי 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) כדי לבצע שיחות. כשמבצעים קריאה, מזהה השיטה וכל האובייקטים נארזים במאגר ומועברים לתהליך מרוחק, שבו חוט של מקשר מחכה לקרוא את הנתונים. אחרי ש-thread של binder מקבל נתונים של טרנזקציה, ה-thread מחפש אובייקט stub מקורי בתהליך המקומי, והמחלקה פורקת את הנתונים ומבצעת קריאה לאובייקט בממשק מקומי. אובייקט הממשק המקומי הוא האובייקט שתהליך שרת יוצר ורושם. כשקריאות מתבצעות באותו תהליך ובאותו קצה עורפי, לא קיימים אובייקטים של שרת proxy, ולכן הקריאות ישירות ללא אריזה או פירוק.

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

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

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