لغة AIDL

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

الحزمة

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

    package my.package;

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

الأنواع

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

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

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

الواردات

لاستخدام الأنواع المحددة في واجهات أخرى، يجب أولاً إضافة تبعيات في نظام التصميم. في وحدتَي "cc_*" وjava_* "سونغ" (Sumg)، حيث يتم استخدام .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;
    }

تعدادات

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

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