الحِزم

مع بعض الاستثناءات، توجد حزم واجهة 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 كمدخل، يحتوي الوضع الموثق على الملفات التي تم إنشاؤها تلقائيًا التالية:

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

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

يتم تنظيم الملفات بشكل مشابه للملفات التي تم إنشاؤها بواسطة 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