زبان ایدل

زبان 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 {
        // Location defined elsewhere
        void teleport(Location baz, float speed);
        String getName();

        // ITeleportCallback defined elsewhere
        void methodWithCallback(ITeleportCallback callback);

        // ITeleportSession defined elsewhere
        ITeleportSession getASubInterface();
    }

یک رابط یک شی را با یک سری روش تعریف می کند. متدها می توانند oneway ( oneway void doFoo() ) یا همزمان باشند. اگر یک رابط به عنوان oneway تعریف شود ( oneway interface ITeleport {...} )، آنگاه همه روش های موجود در آن به طور ضمنی oneway هستند. روش های Oneway به صورت ناهمزمان ارسال می شوند و نمی توانند نتیجه ای را برگردانند. روش های یک طرفه از یک رشته به یک بایندر نیز به صورت سریالی اجرا می شوند (البته به طور بالقوه در رشته های مختلف). برای بحث در مورد نحوه راه‌اندازی رشته‌ها، به مدیریت رشته پشتیبان AIDL مراجعه کنید.

Binder اجازه می دهد تا بسیاری از اینترفیس ها و اشیاء بایندر از طریق رابط های بایندر به اشتراک گذاشته شوند. واسط های AIDL اغلب از فراخوانی به عنوان بخشی از فراخوانی روش استفاده می کنند، مانند ITeleportCallback در مثال قبلی. می‌توانید از اشیای بازگشت به تماس بین تماس‌های یک روش یا تماس‌هایی با روش‌های مختلف دوباره استفاده کنید. یکی دیگر از استفاده های رایج از انواع رابط، برای واسط های فرعی یا اشیاء جلسه است که از روش هایی مانند ITeleportSession در مثال قبلی بازگردانده می شوند. این تودرتو به API های مختلف اجازه می دهد تا در API یا بر اساس وضعیت زمان اجرا کپسوله شوند. به عنوان مثال، یک جلسه ممکن است نشان دهنده مالکیت یک منبع خاص باشد. هنگامی که اینترفیس ها چندین بار ارسال می شوند یا به سرویس گیرنده یا سروری که از آن آمده اند بازگردانده می شوند، همیشه برابری اشاره گر شی بایندر زیرین را حفظ می کنند.

متدها می توانند صفر یا بیشتر آرگومان داشته باشند. آرگومان های متدها می توانند 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;
    }

اتحادیه ها

Android 12 و بالاتر از اعلامیه های اتحادیه برچسب گذاری شده پشتیبانی می کند. به عنوان مثال:

    package my.package;

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

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

برای جزئیات مربوط به باطن به اتحادیه های AIDL Backends مراجعه کنید.

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 + - ! ~