بهاستثنای چند مورد، بستههای میانای 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 را در بسته
samples ایجاد میکند:
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 بهعنوان ورودی، حالت binderized فایلهای زیر را بهطور خودکار تولید میکند:

شکل ۱. فایلهای تولیدشده توسط مترجم.
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را دربرمیگیرد. وقتی مشتری روش رابطی را فرا میخواند، کارگزار بهطور خودکار آرگومانها را از مشتری مرتب میکند و تراکنش را به درایور هسته پیونددهنده ارسال میکند، که تراکنش را به کُندوکاو در طرف دیگر تحویل میدهد (که سپس پیادهسازی سرور واقعی را فرا میخواند).
ساختار فایلها مشابه فایلهای تولیدشده توسط
aidl-cpp است (برای جزئیات، به «حالت Passthrough» در
نمای کلی HIDL مراجعه کنید). تنها فایل
خودکار تولیدشده که مستقل از سازوکار RPC مورداستفاده HIDL است
IFoo.h است؛ همه فایلهای دیگر به سازوکار HwBinder RPC مورداستفاده
HIDL وابسته هستند. بنابراین، پیادهسازیهای کارخواه و سرور هرگز نباید
مستقیماً به چیزی غیراز IFoo ارجاع دهند. برای دستیابی به این هدف، فقط IFoo.h را اضافه کنید و به کتابخانه همرسانیشده تولیدشده پیوند دهید.
پیوند به کتابخانههای مشترک
کارخواه یا سروری که از هرگونه میانای موجود در بسته استفاده میکند باید کتابخانه مشترک آن بسته را در یکی (۱) از مکانهای زیر قرار دهد:
- در 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 |
ارتباط میان پردازشی صف پیام سریع. |
جای نام
توابع و انواع HIDL مانند Return<T> و
Void() در فضای نام ::android::hardware اعلام شدهاند.
فضای نام C++ بسته براساس نام و نسخه بسته تعیین میشود.
برای مثال، بسته mypackage با نسخه ۱.۲ در
hardware/interfaces ویژگیهای زیر را دارد:
- فضای نام C++
::android::hardware::mypackage::V1_2است - نام کاملاً واجدشرایط
IMyInterfaceدر آن بسته:::android::hardware::mypackage::V1_2::IMyInterface. (IMyInterfaceیک شناسه است و بخشی از فضای نام نیست). - انواع تعریفشده در فایل
types.halبسته بهصورت زیر شناسایی میشوند:::android::hardware::mypackage::V1_2::MyPackageType