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

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

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

דוגמא

הנה ממשק 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
    }

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

    package my.package;

    import my.package.Boo;

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

אנדרואיד 11 ומעלה תומכת בהצהרות ה-Enum. לדוגמה:

    package my.package;

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

אנדרואיד 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 in my/package/Baz.aidl
        void doBar(Bar bar);            // defined below

        parcelable Bar { ... }          // nested type definition
    }

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

איך זה עובד

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

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

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

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