لغة AIDL

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

الحزمة

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

    package my.package;

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

الأنواع

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

التعليقات التوضيحية

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

الواردات

لاستخدام الأنواع المحددة في واجهات أخرى، يجب أولاً إضافة تبعيات في نظام الإصدار. يمكنك إضافة أدلة باستخدام الحقل aidl: { include_dirs: ... } في وحدتَي cc_* وjava_* Sayg، حيث يتم استخدام ملفات .aidl مباشرةً ضمن srcs في إصدارات نظام Android الأساسي. لإجراء عمليات الاستيراد باستخدام "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 ونظام الإنشاء لدينا، يمكنك الاطّلاع على واجهة برمجة التطبيقات API المهيكلة مقابل الثابتة.

على سبيل المثال:

    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;
    }

تعدادات

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

    package my.package;

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

إعلانات الأنواع المدمجة

يتوافق الإصدار 13 من نظام التشغيل Android والإصدارات الأحدث مع نماذج تعريف الأنواع المدمجة. على سبيل المثال:

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