تراث HALs

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

مكونات هال

الشكل 1. مكونات هال

يجب عليك تنفيذ HAL (وبرنامج التشغيل) المطابق للأجهزة المحددة التي يوفرها منتجك. عادةً ما تكون تطبيقات HAL مدمجة في وحدات المكتبة المشتركة (ملفات .so )، ولكن نظرًا لأن Android لا يفرض تفاعلًا قياسيًا بين تطبيق HAL وبرامج تشغيل الأجهزة، فيمكنك القيام بما هو أفضل لموقفك. ومع ذلك، لتمكين نظام Android من التفاعل بشكل صحيح مع أجهزتك، يجب عليك الالتزام بالعقد المحدد في كل واجهة HAL خاصة بالجهاز.

لضمان أن يكون لـ HALs بنية يمكن التنبؤ بها، فإن كل واجهة HAL خاصة بالأجهزة لها خصائص محددة في hardware/libhardware/include/hardware/hardware.h . تسمح هذه الواجهة لنظام Android بتحميل الإصدارات الصحيحة من وحدات 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 . مثال من جهاز 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,
    },
};

أجهزة هال

يقوم الجهاز بتجريد الأجهزة الخاصة بمنتجك. على سبيل المثال، يمكن أن تحتوي وحدة الصوت على جهاز صوت أساسي، أو جهاز صوت 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> .

تراث هال

يشير المصطلح Legacy HAL على نطاق واسع إلى جميع HALs السابقة لنظام Android 8.0 (تم إهمالها في Android 8). يتم تعريف الجزء الأكبر من واجهات نظام Android (الكاميرا والصوت وأجهزة الاستشعار وما إلى ذلك) ضمن "الأجهزة/libhardware/التضمين/الأجهزة" ولها إصدار تقريبي وواجهة برمجة التطبيقات (ABI) مستقرة تقريبًا. تحتوي بعض الأنظمة الفرعية (بما في ذلك Wi-Fi وطبقة واجهة الراديو والبلوتوث) على واجهات أخرى غير قياسية في "libhardware_legacy" أو تتخللها قاعدة التعليمات البرمجية. لم تقدم HALs القديمة أبدًا ضمانات استقرار صارمة.