مع استثناءات قليلة، توجد حزم واجهة 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
(من جهة العميل) تنفيذ الواجهة. يجب ألّا يشير المطوّرون إلى هذا الصف مطلقًا مباشرةً.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