HAL میانای استانداردی را برای پیادهسازی فروشندگان سختافزار تعریف میکند، که به Android امکان میدهد نسبت به پیادهسازیهای درایور سطح پایینتر بیتفاوت باشد. استفاده از HAL به شما امکان میدهد بدون تأثیرگذاری یا تغییر دادن سیستم سطح بالاتر، عملکرد را پیادهسازی کنید. این صفحه معماری قدیمیتر را شرح میدهد که از Android 8.0 دیگر پشتیبانی نمیشود. برای Android 8.0 و بالاتر، لطفاً نمای کلی HAL را ببینید.
شکل ۱. عناصر HAL
باید «لایه انتزاعی سختافزار» (و درایور) مربوط به سختافزار خاصی را که محصولتان ارائه میدهد پیادهسازی کنید. پیادهسازیهای HAL معمولاً در
واحدهای کتابخانه مشترک (فایلهای .so) ساخته میشوند، اما ازآنجاییکه Android
تعامل استاندارد بین پیادهسازی HAL و درایورهای دستگاه را الزامی نمیداند، میتوانید
آنچه را که برای وضعیتتان بهتر است انجام دهید. بااینحال، برای اینکه سیستم Android بتواند
بهدرستی با سختافزار شما تعامل داشته باشد، باید از
قرارداد تعریفشده در هر میانای HAL مختص سختافزار پیروی کنید.
برای تضمین اینکه HALها ساختار قابلپیشبینی داشته باشند، هر رابط HAL مختص سختافزار دارای داراییهایی است که در hardware/libhardware/include/hardware/hardware.h تعریف شده است. این میانای
به سیستم Android امکان میدهد نسخههای صحیح واحدهای HAL را به روشی
یکپارچه بار کند. میانای HAL از دو مؤلفه تشکیل شده است: پیمانهها و دستگاهها.
واحدهای HAL
یک ماژول نشاندهنده پیادهسازی HAL بستهبندیشده شما است که بهعنوان یک کتابخانه مشترک (.so file) ذخیره میشود. فایل سرایند hardware/libhardware/include/hardware/hardware.h یک ساختار (hw_module_t) را تعریف میکند که نشاندهنده یک ماژول است و حاوی فرادادههایی مانند نسخه، نام، و نویسنده ماژول است. Android از این فراداده برای پیدا کردن و بار کردن صحیح واحد 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> پیروی میکند.