لغة AIDL

تعتمد لغة AIDL بشكل فضفاض على لغة Java. تحدد الملفات عقد الواجهة وأنواع البيانات والثوابت المختلفة المستخدمة في هذا العقد.

طَرد

تبدأ كل ملفات AIDL بحزمة اختيارية تتوافق مع أسماء الحزم في الواجهات الخلفية المختلفة. يبدو إعلان الحزمة كما يلي:

    package my.package;

كما هو الحال مع Java، يجب أن تكون ملفات AIDL في بنية مجلد مطابقة لحزمتها. يجب أن تكون الملفات التي تحتوي على الحزمة my.package موجودة في المجلد my/package/ .

أنواع

في ملفات AIDL، هناك العديد من الأماكن التي يمكن تحديد الأنواع فيها. للحصول على قائمة دقيقة بالأنواع المدعومة في لغة AIDL، راجع أنواع واجهات AIDL الخلفية .

الشروح

تدعم عدة أجزاء من لغة AIDL التعليقات التوضيحية. للحصول على قائمة بالتعليقات التوضيحية وأين يمكن تطبيقها، راجع تعليقات AIDL التوضيحية .

الواردات

لاستخدام الأنواع المحددة في واجهات أخرى، يجب عليك أولاً إضافة التبعيات في نظام الإنشاء. في وحدات cc_* و java_* Soong، حيث يتم استخدام ملفات .aidl مباشرة ضمن srcs في إصدارات نظام التشغيل 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 .

يمكن أن تحتوي الأساليب على صفر أو أكثر من الوسائط. يمكن أن تكون الحجج الخاصة بالطرق in أو out أو inout . لمناقشة كيفية تأثير ذلك على أنواع الوسائط، راجع اتجاهية الواجهة الخلفية لـ AIDL .

الطرود

للحصول على وصف لكيفية إنشاء أجزاء قابلة للتجزئة خاصة بالواجهة الخلفية، يقوم AIDL بإرجاع الأجزاء القابلة للتجزئة المخصصة للواجهة الخلفية .

يدعم Android 10 والإصدارات الأحدث التعريفات القابلة للتجزئة مباشرة في AIDL. يُطلق على هذا النوع من الطرود اسم الطرود المهيكلة. لمزيد من المعلومات حول كيفية ارتباط 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;
    }

التعدادات

Android 11 والإصدارات الأحدث تدعم إعلانات التعداد. على سبيل المثال:

    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 يفيض ليكون byte 0 . يتم تفسير القيم السداسية، مثل 0x3 ، أولاً على أنها أصغر نوع غير موقّع يحافظ على القيمة بين 32 بت و64 بت، ثم يُعاد تفسيرها على أنها قيم غير موقّعة. لذلك، 0xffffffff له قيمة int -1 . بدءًا من Android 13، يمكن إضافة اللاحقة u8 إلى الثوابت، مثل 3u8 ، لتمثيل قيمة byte . هذه اللاحقة مهمة بحيث يتم تفسير عملية حسابية، مثل 0xffu8 * 3 ، على أنها -3 من النوع byte بينما 0xff * 3 هي 765 من النوع int .

لدى المشغلين المدعومين دلالات C++ وJava. بالترتيب من الأدنى إلى الأعلى، تكون العوامل الثنائية هي || && | ^ & == != < > <= >= << >> + - * / % . العوامل الأحادية هي + - ! ~ .