סקירת AIDL

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

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

דוגמא

להלן דוגמא לממשק AIDL:

    package my.package;

    import my.package.Baz; // defined elsewhere

    interface IFoo {
        void doFoo(Baz baz); // synchronous method
        oneway void doFoo(int a); // async method
    }

Android 10 ומעלה תומכים בהצהרות ניתנות לחבילה. לדוגמה:

    package my.package;

    import my.package.Boo;

    parcelable Baz {
        @utf8InCpp String name = "baz";
        Boo boo;
    }

הצהרות enum תומכות ב- Android 11 ומעלה. לדוגמה:

    package my.package;

    enum Boo {
        A = 1 * 4,
        B = 3,
    }

Android 12 ומעלה תומכים בהצהרות איגוד. לדוגמה:

    package my.package;

    import my.package.FooSettings;
    import my.package.BarSettings;

    union Settings {
        FooSettings fooSettings;
        BarSettings barSettings;
        @utf8InCpp String str;
        int number;
    }

Android T (ניסיוני AOSP) ותמיכה בהצהרות מסוג מקוננות גבוהות יותר. לדוגמה:

    package my.package;

    import my.package.Baz;

    interface IFoo {
        void doFoo(Baz.Nested nested);  // defined my/package/Baz.aidl
        void doBar(Bar bar);            // defined below

        parcelable Bar { ... }          // union/enum types can be nested, while
                                        // an interface can't.
    }

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

איך זה עובד

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

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

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

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