زبان 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 + - ! ~