שפת AIDL

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

חֲבִילָה

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

    package my.package;

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

סוגים

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

הערות

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

יבוא

כדי להשתמש בסוגים המוגדרים בממשקים אחרים, עליך להוסיף תחילה תלות במערכת הבנייה. במודולים cc_* ו- java_* Soong, שבהם נעשה שימוש בקבצי .aidl ישירות תחת srcs בבניית פלטפורמת אנדרואיד, אתה יכול להוסיף ספריות באמצעות field 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 .

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

חפצים

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

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

לדוגמה:

    package my.package;

    import my.package.Boo;

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

איגודים

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

    package my.package;

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

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

תקצירים

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

    package my.package;

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

הצהרות מסוג מקוננות

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

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