یک HAL یک رابط استاندارد برای پیاده سازی فروشندگان سخت افزار تعریف می کند، که اندروید را قادر می سازد تا در مورد پیاده سازی درایورهای سطح پایین تر، آگنوستیک باشد. استفاده از HAL به شما این امکان را میدهد تا بدون تأثیرگذاری یا تغییر سیستم سطح بالاتر، عملکرد را پیادهسازی کنید. این صفحه معماری قدیمیتر را توصیف میکند که از اندروید 8.0 دیگر پشتیبانی نمیشود. برای Android 8.0 و بالاتر، لطفاً نمای کلی HAL را ببینید.
شما باید HAL (و درایور) مربوطه را برای سخت افزار خاصی که محصول شما ارائه می دهد پیاده سازی کنید. پیادهسازیهای HAL معمولاً در ماژولهای کتابخانه مشترک (فایلهای .so
) ساخته میشوند، اما از آنجایی که Android یک تعامل استاندارد بین اجرای HAL و درایورهای دستگاه را الزامی نمیکند، میتوانید بهترین را برای موقعیت خود انجام دهید. با این حال، برای فعال کردن سیستم Android برای تعامل صحیح با سخت افزار شما، باید از قرارداد تعریف شده در هر رابط HAL مخصوص سخت افزار پیروی کنید.
برای تضمین اینکه HAL ها ساختار قابل پیش بینی دارند، هر رابط HAL مخصوص سخت افزار دارای ویژگی هایی است که در hardware/libhardware/include/hardware/hardware.h
تعریف شده است. این رابط به سیستم اندروید اجازه می دهد تا نسخه های صحیح ماژول های HAL شما را به روشی ثابت بارگیری کند. یک رابط HAL از دو جزء تشکیل شده است: ماژول ها و دستگاه ها.
ماژول های HAL
یک ماژول اجرای HAL بسته بندی شده شما را نشان می دهد که به عنوان یک کتابخانه مشترک ( .so file
) ذخیره می شود. فایل هدر hardware/libhardware/include/hardware/hardware.h
ساختاری ( hw_module_t
) را تعریف میکند که نشاندهنده یک ماژول است و حاوی ابردادههایی مانند نسخه، نام و نویسنده ماژول است. اندروید از این ابرداده برای یافتن و بارگذاری صحیح ماژول HAL استفاده می کند.
علاوه بر این، ساختار hw_module_t
حاوی یک اشاره گر به ساختار دیگر، hw_module_methods_t
است که حاوی یک اشاره گر به یک تابع باز برای ماژول است. این تابع باز برای شروع ارتباط با سخت افزاری که HAL برای آن به عنوان یک انتزاع خدمت می کند، استفاده می شود. هر HAL مخصوص سخت افزار معمولا ساختار hw_module_t
عمومی را با اطلاعات اضافی برای آن قطعه خاص از سخت افزار گسترش می دهد. به عنوان مثال، در دوربین HAL، ساختار camera_module_t
شامل یک ساختار hw_module_t
به همراه سایر نشانگرهای عملکرد خاص دوربین است:
typedef struct camera_module { hw_module_t common; int (*get_number_of_cameras)(void); int (*get_camera_info)(int camera_id, struct camera_info *info); } camera_module_t;
هنگامی که یک HAL را پیاده سازی می کنید و ساختار ماژول را ایجاد می کنید، باید نام آن را HAL_MODULE_INFO_SYM
بگذارید. مثالی از HAL صوتی Nexus 9:
struct audio_module HAL_MODULE_INFO_SYM = { .common = { .tag = HARDWARE_MODULE_TAG, .module_api_version = AUDIO_MODULE_API_VERSION_0_1, .hal_api_version = HARDWARE_HAL_API_VERSION, .id = AUDIO_HARDWARE_MODULE_ID, .name = "NVIDIA Tegra Audio HAL", .author = "The Android Open Source Project", .methods = &hal_module_methods, }, };
دستگاه های HAL
یک دستگاه سخت افزار محصول شما را خلاصه می کند. برای مثال، یک ماژول صوتی میتواند شامل یک دستگاه صوتی اصلی، یک دستگاه صوتی USB یا یک دستگاه صوتی بلوتوث A2DP باشد.
یک دستگاه با ساختار hw_device_t
نشان داده می شود. مشابه یک ماژول، هر نوع دستگاه یک نسخه دقیق از hw_device_t
عمومی را تعریف می کند که حاوی نشانگرهای عملکرد برای ویژگی های خاص سخت افزار است. به عنوان مثال، نوع ساختار audio_hw_device_t
حاوی نشانگرهای عملکردی برای عملیات دستگاه صوتی است:
struct audio_hw_device { struct hw_device_t common; /** * used by audio flinger to enumerate what devices are supported by * each audio_hw_device implementation. * * Return value is a bitmask of 1 or more values of audio_devices_t */ uint32_t (*get_supported_devices)(const struct audio_hw_device *dev); ... }; typedef struct audio_hw_device audio_hw_device_t;
علاوه بر این ویژگیهای استاندارد، هر رابط HAL مخصوص سختافزار میتواند ویژگیها و الزامات بیشتری را تعریف کند. برای جزئیات، به مستندات مرجع HAL و همچنین دستورالعمل های جداگانه برای هر HAL مراجعه کنید.
ساخت ماژول های HAL
پیاده سازی های HAL در فایل های ماژول ( .so
) ساخته شده اند و در صورت لزوم توسط Android به صورت پویا پیوند داده می شوند. شما می توانید ماژول های خود را با ایجاد فایل های Android.mk
برای هر یک از پیاده سازی های HAL خود و اشاره به فایل های منبع خود بسازید. به طور کلی، کتابخانه های اشتراکی شما باید در قالب خاصی نامگذاری شوند تا بتوان آنها را به درستی یافت و بارگذاری کرد. طرح نامگذاری از ماژول به ماژول کمی متفاوت است، اما از الگوی کلی پیروی می کند: <module_type>.<device_name>
.