الحِزم

مع استثناءات قليلة، توجد حزم واجهة HIDL في hardware/interfaces أو دليل vendor/ تشير رسالة الأشكال البيانية hardware/interfaces خرائط ذات مستوى أعلى مباشرةً إلى مساحة اسم الحزمة android.hardware الإصدار هو دليل فرعي ضمن مساحة اسم الحزمة (وليس الواجهة).

يجمع برنامج التحويل البرمجي hidl-gen ملفات .hal في مجموعة من ملفات .h و.cpp. من هذه النتائج التي تم إنشاؤها تلقائيًا يحتوي على مكتبة مشتركة تم ربط عمليات تنفيذ العميل/الخادم بها. الملف Android.bp الذي ينشئ هذه المكتبة المشتركة هو تم إنشاؤها تلقائيًا بواسطة hardware/interfaces/update-makefiles.sh البرنامج النصي. في كل مرة تضيف فيها حزمة جديدة إلى hardware/interfaces إضافة/إزالة .hal ملف من/إلى حزمة حالية، يجب إعادة التشغيل النص البرمجي لضمان أن تكون المكتبة المشتركة التي تم إنشاؤها محدثة.

على سبيل المثال، يجب وضع نموذج الملف IFoo.hal في hardware/interfaces/samples/1.0 العيّنة ينشئ ملف IFoo.hal واجهة IFoo في حزمة عيّنات:

package android.hardware.samples@1.0;
interface IFoo {
    struct Foo {
       int64_t someValue;
       handle  myHandle;
    };

    someMethod() generates (vec<uint32_t>);
    anotherMethod(Foo foo) generates (int32_t ret);
};

الملفات التي تم إنشاؤها

يتم ربط الملفات التي يتم إنشاؤها تلقائيًا في حزمة HIDL بملف مشترك واحد بنفس اسم الحزمة (على سبيل المثال، android.hardware.samples@1.0). تُصدِّر المكتبة المشتركة أيضًا عنوان واحد، IFoo.h، والذي يمكن للعملاء تضمينه الخوادم. استخدام المحول البرمجي لـ hidl-gen مع IFoo.hal كمدخلات، فإن الوضع الثنائي يضم ما يلي الملفات:

Files من Google
تم إنشاؤه بواسطة برنامج التجميع

الشكل 1. الملفات التي تم إنشاؤها بواسطة برنامج التجميع.

  • IFoo.h يصف IFoo النقي واجهة في فئة C++؛ إلا أنه يحتوي على الطرق والأنواع المحددة في واجهة IFoo في ملف IFoo.hal، مترجَمة إلى C++ الأنواع عند الضرورة. لا تحتوي على تفاصيل ذات صلة آلية استدعاء إجراء عن بُعد (RPC)، مثل HwBinder، المستخدَمة لتنفيذ هذه الواجهة. تتم مساحة اسم الفئة مع الحزمة والإصدار، على سبيل المثال، ::android::hardware::samples::IFoo::V1_0 كل من العملاء والخوادم تضمين هذا العنوان: برامج لطرق الاتصال عليه والخوادم وتنفيذ هذه الطرق.
  • IHwFoo.h ملف العنوان الذي يحتوي على تعريفات الدوال التي تؤدي إلى إنشاء تسلسل لأنواع البيانات المستخدمة في الواجهة. لا ينبغي لمطوّري البرامج تضمين العنوان مباشرةً (حيث لا يحتوي على أي الصفوف).
  • BpHwFoo.h يشير هذا المصطلح إلى فئة تكتسب من IFoo ويصف الخادم الوكيل HwBinder (من جهة العميل) تنفيذ الواجهة. يجب ألّا يشير المطوّرون إلى هذا الصف مطلقًا مباشرةً.
  • BnHwFoo.h فصل يحمل الإشارة إلى تنفيذ IFoo ويصف تطبيق HwBinder كعب (من جهة الخادم) للواجهة. يجب ألّا يشير المطوّرون إلى هذه الفئة بشكل مباشر مطلقًا.
  • FooAll.cpp فئة تحتوي على لكل من الخادم الوكيل HwBinder HwBinder بديل عندما يستدعي أحد العملاء طريقة واجهة، فإن الخادم الوكيل تنظيم الوسيطات من العميل تلقائيًا وإرسال المعاملة إلى برنامج تشغيل kernel، والذي يسلم المعاملة إلى الكعب على الجانب الآخر (الذي يستدعي بعد ذلك تنفيذ الخادم الفعلي).

تتم هيكلة الملفات بشكل مشابه للملفات التي تم إنشاؤها بواسطة aidl-cpp (للحصول على التفاصيل، يُرجى الاطّلاع على "وضع العبور" في نظرة عامة على HIDL). الملف الذي تم إنشاؤه تلقائيًا والمستقل عن آلية استدعاء إجراء عن بُعد (RPC) المستخدمة بواسطة HIDL IFoo.h؛ وترتبط جميع الملفات الأخرى بآلية HwBinder RPC المستخدمة بواسطة HIDL. لذلك، لا ينبغي أبدًا تنفيذ عمليات تنفيذ العميل والخادم تشير مباشرةً إلى أي شيء بخلاف IFoo. لتحقيق هذا، تضمين IFoo.h فقط والربط بالملف المشترك الذي تم إنشاؤه المكتبة.

يجب أن يتضمن العميل أو الخادم الذي يستخدم أي واجهة في الحزمة المكتبة المشتركة لهذه الحزمة في واحد (1) مما يلي المواقع:

  • في Android.mk:
    LOCAL_SHARED_LIBRARIES += android.hardware.samples@1.0
    
  • في Android.bp:
    shared_libs: [
        /* ... */
        "android.hardware.samples@1.0",
    ],
    

مكتبات إضافية قد تحتاج إلى تضمينها:

libhidlbase تتضمّن أنواع بيانات HIDL العادية. بدءًا من Android 10، يحتوي هذا أيضًا على جميع الرموز الموجودة سابقًا في libhidltransport و libhwbinder
libhidltransport يعالج نقل استدعاءات HIDL عبر آليات RPC/IPC المختلفة. يوقِف Android 10 هذه المكتبة نهائيًا.
libhwbinder الرموز الخاصة بالربط. نظام التشغيل Android 10 ستوقف هذه المكتبة نهائيًا.
libfmq IPC لقائمة انتظار الرسائل السريعة

مساحات الاسم

دوال HIDL وأنواعها مثل Return<T> يتم الإعلان عن Void() في مساحة الاسم ::android::hardware. يتم تحديد مساحة الاسم C++ للحزمة حسب اسم الحزمة وإصدارها. على سبيل المثال، حزمة mypackage بالإصدار 1.2 ضمن في ما يلي الصفات التي يتسم بها hardware/interfaces:

  • مساحة الاسم C++ هي ::android::hardware::mypackage::V1_2
  • اسم مؤهل بالكامل لـ IMyInterface في ذلك الحزمة هي: ::android::hardware::mypackage::V1_2::IMyInterface. (يمثِّل IMyInterface معرِّفًا، وليس جزءًا من مساحة الاسم).
  • الأنواع المحدّدة في ملف types.hal للحزمة كما يلي: ::android::hardware::mypackage::V1_2::MyPackageType