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

الشكل 1: مكونات 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
، تحتوي على مؤشر إلى
دالة مفتوحة للوحدة. تُستخدَم دالة open هذه لبدء
التواصل مع الجهاز الذي يقدّم HAL واجهة برمجة تطبيقات مجردة له.
عادةً ما يضيف كل HAL خاص بالأجهزة hw_module_t
struct العام معلومات إضافية لهذا الجهاز المحدّد. على سبيل المثال، في طبقة 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>
.