لغة AIDL

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

الحزمة

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

    package my.package;

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

الأنواع

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

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

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

الواردات

لاستخدام الأنواع المحدّدة في واجهات أخرى، يجب أولاً إضافة التبعيات في نظام الإنشاء. في وحدات Soong cc_* وjava_*، حيث يتم استخدام ملفات .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 {
        // 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 ضمنيًا. يتم إرسال الطرق ذات الاتجاه الواحد بشكل غير متزامن ولا يمكن وإرجاع النتيجة. يتم أيضًا تنفيذ الأساليب أحادية الاتجاه من سلسلة المحادثات نفسها إلى الرابط نفسه بشكل تسلسلي (على الرغم من أنّه من المحتمل أن يتم تنفيذها في سلاسل محادثات مختلفة). بالنسبة إلى كيفية إعداد سلاسل المحادثات، راجِع سلسلة خلفيات AIDL الخلفية. المشروع.

يسمح Binder بمشاركة العديد من الواجهات وعناصر Binder من خلال واجهة Binder. كثيرًا ما تستخدم واجهات AIDL عمليات معاودة الاتصال كجزء من طلبات الطريقة، كما هو الحال مع ITeleportCallback في المثال السابق. يمكنك إعادة استخدام معاودة الاتصال الكائنات بين الاستدعاءات لنفس الطريقة أو استدعاءات طرق مختلفة. ومن يكون الاستخدام الشائع لأنواع الواجهات هو الواجهات الفرعية أو كائنات الجلسة التي سيتم عرضها من طرق مثل ITeleportSession في المثال السابق. يسمح هذا التداخل بتضمين واجهات برمجة تطبيقات مختلفة في إما واجهة برمجة التطبيقات أو استنادًا إلى حالة وقت التشغيل. على سبيل المثال، قد تمثّل الجلسة ملكية مورد معيّن. عند تمرير الواجهات عدة مرات أو إعادتها إلى العميل أو الخادم الذي أتت منه، تحافظ الواجهات دائمًا على تكافؤ المؤشر لعنصر الربط الأساسي.

يمكن أن تحتوي الطرق على صفر أو أكثر من الوسيطات. يمكن أن تكون الوسيطات إلى الطرق 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;
    }

تعدادات

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