تراث HALs

يحدد 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 ( hw_module_t ) يمثل وحدة نمطية ويحتوي على بيانات وصفية مثل الإصدار والاسم ومؤلف الوحدة. يستخدم Android هذه البيانات الوصفية للعثور على وحدة HAL وتحميلها بشكل صحيح.

بالإضافة إلى ذلك ، تحتوي البنية hw_module_t على مؤشر إلى بنية أخرى ، hw_module_methods_t ، تحتوي على مؤشر لوظيفة مفتوحة للوحدة النمطية. تُستخدم هذه الوظيفة المفتوحة لبدء الاتصال بالأجهزة التي يعمل HAL بمثابة تجريد لها. عادةً ما يوسع كل HAL الخاص hw_module_t البنية hw_module_t العامة 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,
    },
};

أجهزة 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> .