Google is committed to advancing racial equity for Black communities. See how.
این صفحه به‌وسیله ‏Cloud Translation API‏ ترجمه شده است.
Switch to English

HIDL

زبان تعریف رابط HAL یا HIDL (تلفظ "hide-l") یک زبان توصیف رابط (IDL) برای تعیین رابط بین HAL و کاربران آن است. این امکان را می دهد تا انواع و روشهای تماس را که در رابط ها و بسته ها جمع آوری می شوند ، تعیین کنید. به طور گسترده تر ، HIDL سیستمی برای برقراری ارتباط بین پایگاه های کد است که ممکن است به طور مستقل تدوین شود.

HIDL در نظر گرفته شده است تا برای ارتباطات بین فرآیند (IPC) استفاده شود. از ارتباط بین فرآیندها به عنوان Binderized یاد می شود . برای کتابخانه هایی که باید به فرآیندی متصل شوند ، حالت passthrough نیز موجود است (در جاوا پشتیبانی نمی شود).

HIDL ساختار داده ها و روش های امضا را مشخص می کند ، که در رابط ها (شبیه به یک کلاس) سازماندهی می شوند که در بسته ها جمع می شوند. نحو HIDL برای برنامه نویسان ++ C و جاوا آشنا خواهد بود ، اگرچه با مجموعه ای متفاوت از کلمات کلیدی. HIDL همچنین از حاشیه نویسی به سبک جاوا استفاده می کند.

طراحی HIDL

هدف HIDL این است که بدون نیاز به بازسازی HAL ها می توان چارچوب را جایگزین کرد. HAL ها توسط فروشندگان یا سازندگان SOC ساخته می شوند و در یک پارتیشن /vendor بر روی دستگاه قرار می گیرند و این امکان را فراهم می کند تا در پارتیشن خود این فریم ورک بدون جایگزینی مجدد HAL ها با OTA جایگزین شود.

طراحی HIDL نگرانی های زیر را متعادل می کند:

  • قابلیت همکاری رابط های قابل اعتماد قابل اطمینان بین فرایندهایی که ممکن است با معماری های مختلف ، ابزارهای ابزار و پیکربندی های ایجاد شده ایجاد شوند ، ایجاد کنید. رابط های HIDL نسخه ای هستند و پس از انتشار قابل تغییر نیستند.
  • کارایی HIDL سعی دارد تعداد عملیات کپی را به حداقل برساند. داده های تعریف شده HIDL در ساختار داده های چیدمان استاندارد C ++ به کد C ++ تحویل داده می شوند که می توانند بدون بسته بندی استفاده شوند. HIDL همچنین رابط های حافظه اشتراکی را فراهم می کند و چون RPC ذاتاً تا حدودی کند است ، HIDL از دو روش برای انتقال داده بدون استفاده از تماس RPC پشتیبانی می کند: حافظه مشترک و صف پیام سریع (FMQ).
  • بصری HIDL اجتناب خاردار مسائل مربوط به مالکیت حافظه با استفاده از تنها in پارامترهای برای RPC (نگاه کنید به رابط آندروید تعریف زبان (AIDL) )؛ مقادیری که نمی توانند به طور م fromثر از روش ها برگردند از طریق توابع برگشت پاسخ بازگردانده می شوند. نه انتقال داده ها به HIDL برای انتقال و نه دریافت داده ها از HIDL باعث تغییر مالکیت داده ها نمی شود - مالکیت همیشه با عملکرد فراخوانی باقی می ماند. داده ها باید فقط برای مدت زمان تابع فراخوانی شده باقی بمانند و ممکن است بلافاصله پس از بازگشت تابع فراخوانی شده از بین بروند.

استفاده از حالت passthrough

برای به روزرسانی دستگاه های دارای نسخه های قبلی Android به Android O ، می توانید HAL های معمولی (و قدیمی) را در یک رابط HIDL جدید بپیچید که HAL را در حالت های اتصال یافته و همان فرآیند (انتقال) ارائه می دهد. این بسته بندی هم برای HAL و هم برای چارچوب Android شفاف است.

حالت Passthrough فقط برای کلاینت ++ C و پیاده سازی در دسترس است. دستگاه هایی که نسخه های قبلی Android را اجرا می کنند ، HAL ندارند که به زبان جاوا نوشته شده اند ، بنابراین Java HAL ها ذاتاً اتصال یافته اند.

هنگامی که یک .hal فایل وارد شده است، hidl-gen تولید عبوری فایل هدر اضافی BsFoo.h علاوه بر هدر استفاده برای برقراری ارتباط چسب؛ این تعریف هدر توابع به dlopen اد. همانطور که HAL های passthrough در همان فرایند فراخوانی شده اجرا می شوند ، در بیشتر موارد روشهای passthrough با فراخوانی عملکرد مستقیم (همان رشته) فراخوانی می شوند. oneway روش در موضوع خود را اجرا عنوان آنها در نظر گرفته شده برای HAL صبر کنید تا آنها را پردازش (این به معنی هر HAL که با استفاده از oneway روش در حالت عبوری باید موضوع امن باشد).

با توجه به IFoo.hal ، BsFoo.h کاری ادامه داده اند روش HIDL تولید به ارائه ویژگی های اضافی (مانند ساخت oneway معاملات در انجمن با کاربران دیگر اجرا). این فایل مشابه BpFoo.h ، اما به جای انتقال IPC با استفاده از اتصال دهنده ، توابع مورد نظر مستقیماً فراخوانی می شوند. پیاده سازی های آینده HAL ها ممکن است چندین پیاده سازی مانند FooFast HAL و FooAccurate HAL ارائه دهند. در چنین مواردی ، پرونده ای برای هر پیاده سازی اضافی ایجاد می شود (به عنوان مثال ، PTFooFast.cpp و PTFooAccurate.cpp ).

اتصال به HAL ها

می توانید پیاده سازی های HAL را که از حالت passthrough پشتیبانی می کنند ، اتصال دهید. با توجه به رابط HAL abcd@MN::IFoo ، دو بسته ایجاد می شود:

  • abcd@MN::IFoo-impl . شامل اجرای HAL است و عملکرد IFoo* HIDL_FETCH_IFoo(const char* name) را در معرض دید قرار می دهد. در دستگاه های قدیمی، این بسته است dlopen اد و اجرای با استفاده از نمونه است HIDL_FETCH_IFoo . می توانید کد پایه را با استفاده از hidl-gen و -Lc++-impl و -Landroidbp-impl .
  • abcd@MN::IFoo-service . گذرگاه HAL را باز می کند و خود را به عنوان یک سرویس اتصال دهنده ثبت می کند ، این امکان را می دهد که از همان اجرای HAL به عنوان گذرگاه و بسته بندی استفاده شود.

با توجه به نوع IFoo ، می توانید با sp<IFoo> IFoo::getService(string name, bool getStub) بگیرید تا به نمونه ای از IFoo دسترسی پیدا کنید. اگر getStub درست باشد ، getService تلاش می کند تا HAL را فقط در حالت passthrough باز کند. اگر getStub نادرست باشد ، getService تلاش می کند تا یک سرویس اتصال دهنده پیدا کند. در صورت عدم موفقیت ، سعی در یافتن سرویس passthrough دارد. پارامتر getStub هرگز نباید استفاده شود مگر در defaultPassthroughServiceImplementation . (دستگاه هایی که با Android O راه اندازی می شوند کاملاً اتصال دهنده هستند ، بنابراین باز کردن سرویس در حالت passthrough ممنوع است.)

دستور زبان HIDL

با طراحی ، زبان HIDL شبیه C است (اما از پیش پردازنده C استفاده نمی کند). تمام علائم نگارشی که در زیر توضیح داده نشده است (جدا از کاربرد واضح = و | ) بخشی از دستور زبان است.

توجه: برای جزئیات مربوط به سبک کد HIDL ، به راهنمای سبک کد مراجعه کنید.

  • /** */ یک نظر مستند را نشان می دهد. این موارد را فقط می توان برای نوع ، روش ، فیلد و اعلامیه های مقدار enum اعمال کرد.
  • /* */ یک نظر چند خطی را نشان می دهد.
  • // یک نظر را برای انتهای خط نشان می دهد. جدا از // ، خطوط جدید همان فضای سفید دیگر است.
  • در مثال گرامر زیر ، متن از // تا انتهای خط بخشی از دستور زبان نیست بلکه در عوض یک نظر در مورد دستور زبان است.
  • [empty] به معنای [empty] بودن این اصطلاح است.
  • ? پیروی از یک اصطلاح یا اصطلاح به معنای اختیاری بودن آن است.
  • ... توالی حاوی صفر یا بیشتر موارد با علائم نگارشی جدا شده را نشان می دهد. هیچ استدلال متغیری در HIDL وجود ندارد.
  • عناصر دنباله را با کاما جدا می کنید.
  • نقطه ویرگول ها هر عنصر ، از جمله آخرین عنصر را خاتمه می دهند.
  • UPPERCASE غیر انتهایی است.
  • italics یک خانواده نشانه مانند integer یا identifier (قوانین استاندارد تجزیه C).
  • constexpr یک عبارت ثابت به سبک C است (مانند 1 + 1 و 1L << 3 ).
  • import_name یک بسته یا نام واسط است ، همانطور که در HIDL Versioning شرح داده شده واجد شرایط است.
  • words کوچک نشانه های تحت اللفظی هستند.

مثال:

ROOT =
    PACKAGE IMPORTS PREAMBLE { ITEM ITEM ... }  // not for types.hal
  | PACKAGE IMPORTS ITEM ITEM...  // only for types.hal; no method definitions

ITEM =
    ANNOTATIONS? oneway? identifier(FIELD, FIELD ...) GENERATES?;
  |  safe_union identifier { UFIELD; UFIELD; ...};
  |  struct identifier { SFIELD; SFIELD; ...};  // Note - no forward declarations
  |  union identifier { UFIELD; UFIELD; ...};
  |  enum identifier: TYPE { ENUM_ENTRY, ENUM_ENTRY ... }; // TYPE = enum or scalar
  |  typedef TYPE identifier;

VERSION = integer.integer;

PACKAGE = package android.hardware.identifier[.identifier[...]]@VERSION;

PREAMBLE = interface identifier EXTENDS

EXTENDS = <empty> | extends import_name  // must be interface, not package

GENERATES = generates (FIELD, FIELD ...)

// allows the Binder interface to be used as a type
// (similar to typedef'ing the final identifier)
IMPORTS =
   [empty]
  |  IMPORTS import import_name;

TYPE =
  uint8_t | int8_t | uint16_t | int16_t | uint32_t | int32_t | uint64_t | int64_t |
 float | double | bool | string
|  identifier  // must be defined as a typedef, struct, union, enum or import
               // including those defined later in the file
|  memory
|  pointer
|  vec<TYPE>
|  bitfield<TYPE>  // TYPE is user-defined enum
|  fmq_sync<TYPE>
|  fmq_unsync<TYPE>
|  TYPE[SIZE]

FIELD =
   TYPE identifier

UFIELD =
   TYPE identifier
  |  safe_union identifier { FIELD; FIELD; ...} identifier;
  |  struct identifier { FIELD; FIELD; ...} identifier;
  |  union identifier { FIELD; FIELD; ...} identifier;

SFIELD =
   TYPE identifier
  |  safe_union identifier { FIELD; FIELD; ...};
  |  struct identifier { FIELD; FIELD; ...};
  |  union identifier { FIELD; FIELD; ...};
  |  safe_union identifier { FIELD; FIELD; ...} identifier;
  |  struct identifier { FIELD; FIELD; ...} identifier;
  |  union identifier { FIELD; FIELD; ...} identifier;

SIZE =  // Must be greater than zero
     constexpr

ANNOTATIONS =
     [empty]
  |  ANNOTATIONS ANNOTATION

ANNOTATION =
  |  @identifier
  |  @identifier(VALUE)
  |  @identifier(ANNO_ENTRY, ANNO_ENTRY  ...)

ANNO_ENTRY =
     identifier=VALUE

VALUE =
     "any text including \" and other escapes"
  |  constexpr
  |  {VALUE, VALUE ...}  // only in annotations

ENUM_ENTRY =
     identifier
  |  identifier = constexpr

واژه شناسی

این بخش از اصطلاحات مربوط به HIDL زیر استفاده می کند:

صحافی شده نشان می دهد که HIDL برای تماس های رویه ای از راه دور بین پردازش ها استفاده می شود که از طریق مکانیزمی مانند Binder اجرا می شود. به passthrough نیز مراجعه کنید.
پاسخگویی ، ناهمزمان رابطی که توسط کاربر HAL ارائه می شود ، به HAL (از طریق روش HIDL) منتقل می شود و توسط HAL فراخوانی می شود تا داده ها را در هر زمان بازگرداند.
تماس مجدد ، همزمان داده ها را از پیاده سازی روش HIDL سرور به مشتری برمی گرداند. برای روشهایی که باطل یا یک مقدار ابتدایی واحد برمی گردند استفاده نشده است.
مشتری فرایندی که روشهای یک رابط خاص را فراخوانی می کند. فرآیند HAL یا فریم ورک ممکن است مشتری یک رابط و سرور دیگری باشد. به passthrough نیز مراجعه کنید.
گسترش می یابد رابطی را نشان می دهد که متدها و / یا انواع را به رابط دیگر اضافه می کند. یک رابط می تواند فقط یک رابط دیگر را گسترش دهد. می تواند برای افزایش نسخه جزئی در همان نام بسته یا برای بسته جدید (به عنوان مثال پسوند فروشنده) برای ایجاد بسته قدیمی استفاده شود.
تولید می کند روشی رابط نشان می دهد که مقادیر را به مشتری برمی گرداند. برای بازگرداندن یک مقدار غیر اولیه یا بیش از یک مقدار ، یک عملکرد برگشت همزمان ایجاد می شود.
رابط مجموعه ای از روش ها و انواع. به C ++ یا Java به یک کلاس ترجمه شده است. تمام متدهای موجود در یک رابط در یک جهت فراخوانی می شوند: یک فرایند مشتری روش هایی را که توسط یک فرآیند سرور پیاده سازی شده فراخوانی می کند.
یک طرفه هنگامی که به یک روش HIDL اعمال می شود ، نشان می دهد که این روش هیچ مقداری را بر نمی گرداند و مسدود نمی شود.
بسته بندی مجموعه ای از رابط ها و انواع داده ها که نسخه را به اشتراک می گذارند.
گذرگاه نحوه HIDL که در آن سرور کتابخانه مشترک است، dlopen اد شده توسط مشتری. در حالت passthrough ، کلاینت و سرور یک فرایند هستند اما کدهای کد جداگانه ای هستند. فقط برای وارد کردن کدهای قدیمی به مدل HIDL استفاده می شود. همچنین به Binderized مراجعه کنید.
سرور فرایندی که روشهای یک رابط را پیاده سازی می کند. به passthrough نیز مراجعه کنید.
حمل و نقل زیرساخت HIDL که داده ها را بین سرور و سرویس گیرنده جابجا می کند.
نسخه نسخه یک بسته. از دو عدد صحیح بزرگ و جزئی تشکیل شده است. نسخه های جزئی ممکن است انواع و روش هایی را به آن اضافه کنند (اما تغییر نمی کنند).