يحدد HAL واجهة قياسية لبائعي الأجهزة لتطبيقها ، مما يمكّن Android من أن يكون محايدًا بشأن تطبيقات برامج التشغيل ذات المستوى المنخفض. يتيح لك استخدام HAL تنفيذ الوظائف دون التأثير على نظام المستوى الأعلى أو تعديله. تصف هذه الصفحة البنية القديمة ، والتي لم تعد مدعومة اعتبارًا من Android 8.0. بالنسبة لنظام التشغيل Android 8.0 والإصدارات الأحدث ، يرجى الاطلاع على نظرة عامة على HAL .

الشكل 1. مكونات HAL
يجب عليك تطبيق HAL المطابق (وبرنامج التشغيل) للأجهزة المحددة التي يوفرها منتجك. عادةً ما يتم تضمين تطبيقات HAL في وحدات المكتبة المشتركة (ملفات .so
) ، ولكن نظرًا لأن Android لا يفرض تفاعلًا قياسيًا بين تنفيذ HAL وبرامج تشغيل الجهاز ، يمكنك القيام بما هو أفضل لموقفك. ومع ذلك ، لتمكين نظام Android من التفاعل بشكل صحيح مع أجهزتك ، يجب عليك الالتزام بالعقد المحدد في كل واجهة HAL خاصة بالأجهزة.
لضمان أن تحتوي HALs على بنية يمكن التنبؤ بها ، فإن كل واجهة 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
Structure 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
. مثال من Nexus 9 audio HAL:
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 أو جهاز صوت Bluetooth 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>
.