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

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

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

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

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

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