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