שפת AIDL

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

Package

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

    package my.package;

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

סוגים

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

הערות

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

ייבוא

כדי להשתמש בסוגים שהוגדרו בממשקים אחרים, צריך קודם להוסיף יחסי תלות של מערכת ה-build. במודולים של cc_* ו-java_*, שבהם נעשה שימוש ב-.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();
    }

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

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

מגרשים

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

ב-Android מגרסה 10 ואילך יש תמיכה בהגדרות של מגרשים ישירות ב-AIDL. הסוג הזה של מגרש החבילה נקרא 'חבילה מובנית'. אפשר לקבל מידע נוסף על הקשר בין AIDL מובנה ויציב מהדר (compiler) 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 חורג ל-0 byte. המערכת מפרשת ערכים הקסדצימליים, כמו 0x3, תחילה הוא הסוג הקטן ביותר שאינו חתום, בין 32 סיביות ל-64 סיביות ואז מפרשים אותה מחדש כערכים לא חתומים. לכן, 0xffffffff יש את הערך int -1. החל מ-Android 13, הסיומת u8 יכולה להיות מוסיפים קבועים, כמו 3u8, כדי לייצג ערך byte. הסיומת הזו היא כדי שחישוב, כמו 0xffu8 * 3, יתפרש כ--3 מסוג byte ואילו 0xff * 3 הוא 765 מסוג int.

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