‫HALهای قدیمی

HAL میانای استانداردی را برای پیاده‌سازی فروشندگان سخت‌افزار تعریف می‌کند، که به Android امکان می‌دهد نسبت به پیاده‌سازی‌های درایور سطح پایین‌تر بی‌تفاوت باشد. استفاده از HAL به شما امکان می‌دهد بدون تأثیرگذاری یا تغییر دادن سیستم سطح بالاتر، عملکرد را پیاده‌سازی کنید. این صفحه معماری قدیمی‌تر را شرح می‌دهد که از Android 8.0 دیگر پشتیبانی نمی‌شود. برای Android 8.0 و بالاتر، لطفاً نمای کلی HAL را ببینید.

عناصر 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> پیروی می‌کند.

لایه انتزاع سخت‌افزار قدیمی

اصطلاح HAL قدیمی به‌طور کلی به همه HALهای قبل‌از Android 8.0 اشاره دارد (در Android 8 منسوخ شده است). بخش عمده‌ای از میاناهای سیستم Android (دوربین، صدا، حسگرها، و غیره) در `hardware/libhardware/include/hardware` تعریف شده‌اند و نسخه‌بندی تقریبی و ABI تقریباً پایداری دارند. چند زیرسیستم (ازجمله Wi-Fi، لایه میانای رادیویی، و بلوتوث) دارای میاناهای غیراستاندارد دیگری در `libhardware_legacy` یا در سراسر پایگاه کد هستند. «لایه انتزاع سخت‌افزار» قدیمی هرگز ضمانت‌های پایداری سخت ارائه نمی‌داد.