لغة 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 oneway interface ITeleport {...} ) ، فحينئذٍ تكون جميع الطرق الموجودة فيها في oneway ضمنيًا. يتم إرسال طرق Oneway بشكل غير متزامن ولا يمكنها إرجاع نتيجة. طرق Oneway من نفس الخيط إلى نفس الموثق مضمونة أيضًا للتنفيذ التسلسلي (على الرغم من احتمال حدوثها على خيوط مختلفة). للحصول على مناقشة حول كيفية إعداد سلاسل الرسائل ، راجع إدارة سلاسل عمليات AIDL للخلفيات .

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

الطرود

للحصول على وصف لكيفية إنشاء عناصر خاصة بالواجهة الخلفية ، AIDL backends Custom parcelables .

يدعم Android 10 والإصدارات الأحدث الإعلانات القابلة للتجزئة مباشرةً في 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;
    }

Enums

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