يحدد HAL واجهة قياسية لموردي الأجهزة لتنفيذها، التي تمكّن نظام Android من تجنُّب عمليات تنفيذ برامج التشغيل ذات المستوى الأدنى. يتيح لك استخدام HAL تنفيذ الوظائف دون التأثير أو التعديل بنظام المستوى الأعلى. تصف هذه الصفحة البنية القديمة، والتي ليست أصبح مدعومًا بدءًا من نظام Android 8.0. على الإصدار 8.0 من نظام التشغيل Android والإصدارات الأحدث، يُرجى مراجعة نظرة عامة على 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
على
تركيبة "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>
.