שפת AIDL

שפת ה-AIDL מבוססת על שפת Java באופן חלש. הקבצים מציינים חוזה ממשק וסוגי נתונים וקבועים שונים שבהם משתמשים בחוזה הזה.

Package

כל קובצי AIDL מתחילים בחבילה אופציונלית שתואמת לשמות החבילות בקצוות העורפיים שונים. הצהרה על חבילה נראית כך:

    package my.package;

בדומה ל-Java, קובצי AIDL חייבים להיות במבנה של תיקיות שתואם לחבילה שלהם. קבצים עם חבילה my.package חייבים להיות בתיקייה my/package/.

סוגים

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

הערות

כמה חלקים מהשפה של AIDL תומכים בהערות. במאמר הערות AIDL תוכלו למצוא רשימה של הערות ואיפה אפשר להחיל אותן.

ייבוא

כדי להשתמש בסוגים שמוגדרים בממשקים אחרים, קודם צריך להוסיף יחסי תלות במערכת ה-build. במודולים cc_* ו-java_* Sog, שבהם נעשה שימוש בקובצי .aidl ישירות במסגרת srcs בגרסאות build של פלטפורמת Android, אפשר להוסיף ספריות באמצעות השדה aidl: { include_dirs: ... }. מידע על ייבוא באמצעות aidl_interface מופיע כאן.

ייבוא נראה כך:

    import some.package.Foo;  // explicit import

כשמייבאים סוג באותה חבילה, אפשר להשמיט את החבילה. עם זאת, השמטת החבילה עלולה לגרום לשגיאות לא חד-משמעיות בייבוא כשמציינים סוגים ללא חבילה ומועברים במרחב השמות הגלובלי (בדרך כלל כל הסוגים צריכים להיות במרחב שמות):

    import Foo;  // same as my.package.Foo

הגדרת סוגים

קובצי AIDL בדרך כלל מגדירים סוגים שמשמשים כממשק.

ממשקים

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

    interface ITeleport {
        void teleport(Location baz, float speed);
        String getName();
    }

ממשק מגדיר אובייקט באמצעות סדרה של שיטות. ה-methods יכולות להיות oneway (oneway void doFoo()) או סינכרוניות. אם הממשק מוגדר כ-oneway (oneway interface ITeleport {...}), כל ה-methods בו הן oneway באופן מרומז. שיטות חד-כיווניות נשלחות באופן אסינכרוני ולא יכולות להחזיר תוצאה. גם שיטות חד-כיווניות מאותו שרשור לאותו קישור מבוצעות באופן טורי (אבל יכול להיות שבשרשורים שונים). למידע נוסף על הגדרת שרשורים, ראו ניהול שרשורים בקצוות עורפיים של AIDL.

לשיטות יכולים להיות אפס ארגומנטים או יותר. הארגומנטים ל-methods יכולים להיות in, out או inout. למידע על ההשפעה של השינוי הזה על סוגי ארגומנטים, ראו כיווניות של קצוות עורפיים של AIDL.

מגרשים

תוכלו לקרוא איך יוצרים חבילות עורפיים ספציפיות לקצה העורפי. תוכלו לקרוא את המאמר שימוש בקצוות עורפיים של AIDL במגרשים מותאמים אישית.

Android בגרסה 10 ואילך תומך בהגדרות של חלוקה ישירות ב-AIDL. הסוג הזה של מגרש החבילה נקרא 'חבילה מובנית'. למידע נוסף על הקשר בין AIDL המובנה והיציב בין המהדר של AIDL לבין מערכת ה-build שלנו, תוכלו לקרוא את המאמר מידע מובנה לעומת AIDL יציב.

לדוגמה:

    package my.package;

    import my.package.Boo;

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

איגודים

הצהרות איחוד תמיכה ב-Android מגרסה 12 ואילך. לדוגמה:

    package my.package;

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

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

טיפוסים בני מנייה (enum)

ב-Android מגרסה 11 ואילך יש תמיכה בהצהרות enum. לדוגמה:

    package my.package;

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

הצהרות מסוג בתוך רכיב

ב-Android מגרסה 13 ואילך יש תמיכה בהצהרות מסוג מקונן. לדוגמה:

    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 בהתאמה אישית, מגרשים ואיחודים, יכולים להכיל קבועים של מחרוזות ומספרים שלמים, כמו:

    const @utf8InCpp String HAPPY = ":)";
    const String SAD = ":(";
    const byte BYTE_ME = 1;
    const int ANSWER = 6 * 7;

ביטויים קבועים

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

המילולים true ו-false מייצגים ערכים בוליאניים. ערכים עם . אבל בלי סיומת, כמו 3.8, נחשבים לערכים כפולים. לערכים צפים יש סיומת f, למשל 2.4f. ערך אינטגרלי עם הסיומת l או L מציין ערך באורך של 64 ביט. אחרת, ערכי אינטגרלים מקבלים את הסוג החתום הקטן ביותר לשמירה על ערך: 8 ביט (בייט), 32 ביט (int) ו-64 ביט (אורך). לכן, 256 נחשב כ-int, אבל הערך של 255 + 1 חורג מ-byte 0. ערכים הקסדצימליים, כמו 0x3, מפורשים תחילה כסוג הקטן ביותר שאינו חתום, בין 32 ביט ל-64 ביט, ולאחר מכן מתפרשים מחדש כערכים לא חתומים. לכן, 0xffffffff יש את הערך int -1. החל מ-Android 13, אפשר להוסיף את הסיומת u8 לקבועים, כמו 3u8, כדי לייצג ערך byte. הסיומת הזו חשובה כדי שחישוב, כמו 0xffu8 * 3, יתפרש כ--3 מסוג byte ואילו 0xff * 3 הוא 765 מסוג int.

לאופרטורים נתמכים יש סמנטיקה של C++ ו-Java. האופרטורים הבינאריים הם || && | ^ & == != < > <= >= << >> + - * / %, מהנמוכה לגבוהה. האופרטורים הלא-מקוריים הם + - ! ~.