زبان AIDL، زبان AIDL

زبان AIDL بر پایه زبان جاوا استوار است. فایل ها یک قرارداد واسط و انواع داده ها و ثابت های مورد استفاده در این قرارداد را مشخص می کنند.

بسته

هر فایل AIDL با یک بسته اختیاری شروع می شود که با نام بسته ها در backend های مختلف مطابقت دارد. یک اعلامیه بسته به شکل زیر است:

    package my.package;

مانند جاوا، فایل های AIDL باید در ساختار پوشه ای مطابق با بسته خود باشند. فایل های دارای بسته my.package باید در پوشه my/package/ باشند.

انواع

در فایل های AIDL مکان های زیادی وجود دارد که می توان انواع آن را مشخص کرد. برای فهرست دقیق انواعی که در زبان AIDL پشتیبانی می‌شوند، به انواع پشتیبان‌های AIDL مراجعه کنید.

حاشیه نویسی ها

چندین بخش از زبان AIDL از حاشیه نویسی پشتیبانی می کند. برای فهرستی از حاشیه نویسی ها و جایی که می توان آنها را اعمال کرد، به حاشیه نویسی AIDL مراجعه کنید.

واردات

برای استفاده از انواع تعریف شده در رابط های دیگر، ابتدا باید وابستگی هایی را در سیستم ساخت اضافه کنید. در ماژول‌های cc_* و java_* Soong، جایی که فایل‌های .aidl مستقیماً در زیر srcs در ساخت‌های پلتفرم اندروید استفاده می‌شوند، می‌توانید با استفاده از فیلد 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 هستند. روش های Oneway به صورت ناهمزمان ارسال می شوند و نمی توانند نتیجه ای را برگردانند. متدهای یک طرفه از یک رشته به یک بایندر نیز تضمین شده است که به صورت سریال اجرا می شوند (اگرچه به طور بالقوه در رشته های مختلف). برای بحث در مورد نحوه راه‌اندازی رشته‌ها، به مدیریت رشته پشتیبان AIDL مراجعه کنید.

متدها می توانند صفر یا بیشتر آرگومان داشته باشند. آرگومان های متدها می توانند in ، out یا inout باشند. برای بحث در مورد اینکه چگونه این روی انواع آرگومان‌ها تأثیر می‌گذارد، به جهت‌دهی backends AIDL مراجعه کنید.

بسته بندی ها

برای توضیح نحوه ایجاد بسته‌های باطنی خاص، AIDL بسته‌بندی‌های سفارشی را پشتیبانی می‌کند .

اندروید 10 و بالاتر از تعاریف قابل حمل مستقیماً در AIDL پشتیبانی می کند. به این نوع از parcelable، parcelable ساختاریافته گفته می شود. برای اطلاعات بیشتر در مورد اینکه چگونه 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;
    }

Enums

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، parcelable‌ها و اتحادیه‌ها همچنین می‌توانند شامل ثابت‌های عدد صحیح و رشته باشند، مانند:

    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 با نوع int 765 است.

اپراتورهای پشتیبانی شده دارای C++ و معنای جاوا هستند. به ترتیب از کمترین به بالاترین اولویت، عملگرهای باینری || && | ^ & == != < > <= >= << >> + - * / % هستند || && | ^ & == != < > <= >= << >> + - * / % . عملگرهای Unary + - ! ~