بسته‌ها

به‌استثنای چند مورد، بسته‌های میانای 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