विरासत एचएएल

एचएएल हार्डवेयर विक्रेताओं को लागू करने के लिए एक मानक इंटरफ़ेस को परिभाषित करता है, जो एंड्रॉइड को निचले स्तर के चालक कार्यान्वयन के बारे में अज्ञेय बनाता है। HAL का उपयोग करने से आप उच्च स्तरीय प्रणाली को प्रभावित या संशोधित किए बिना कार्यक्षमता को लागू कर सकते हैं। यह पृष्ठ पुराने आर्किटेक्चर का वर्णन करता है, जो अब एंड्रॉइड 8.0 के रूप में समर्थित नहीं है। Android 8.0 और उच्चतर के लिए, कृपया HAL प्रकार देखें।

चित्र 1. एचएएल घटक

आपके उत्पाद द्वारा प्रदान किए जाने वाले विशिष्ट हार्डवेयर के लिए आपको संबंधित HAL (और ड्राइवर) को लागू करना होगा। एचएएल कार्यान्वयन आमतौर पर साझा पुस्तकालय मॉड्यूल ( .so फ़ाइलों) में बनाया जाता है, लेकिन जैसा कि एंड्रॉइड एक एचएएल कार्यान्वयन और डिवाइस ड्राइवरों के बीच एक मानक बातचीत को अनिवार्य नहीं करता है, आप अपनी स्थिति के लिए सबसे अच्छा कर सकते हैं। हालाँकि, एंड्रॉइड सिस्टम को आपके हार्डवेयर के साथ सही तरीके से इंटरैक्ट करने में सक्षम करने के लिए, आपको प्रत्येक हार्डवेयर-विशिष्ट एचएएल इंटरफ़ेस में परिभाषित अनुबंध का पालन करना होगा

यह गारंटी देने के लिए कि एचएएल के पास एक अनुमानित संरचना है, प्रत्येक हार्डवेयर-विशिष्ट एचएएल इंटरफ़ेस में hardware/libhardware/include/hardware/hardware.h । यह इंटरफ़ेस एंड्रॉइड सिस्टम को आपके एचएएल मॉड्यूल के सही संस्करणों को एक सुसंगत तरीके से लोड करने की अनुमति देता है। HAL इंटरफ़ेस में दो घटक होते हैं: मॉड्यूल और डिवाइस।

एचएएल मॉड्यूल

एक मॉड्यूल आपके पैकेज्ड एचएएल कार्यान्वयन का प्रतिनिधित्व करता है, जिसे एक साझा लाइब्रेरी ( .so file ) के रूप में संग्रहीत किया जाता है। hardware/libhardware/include/hardware/hardware.h हेडर फ़ाइल एक संरचना ( hw_module_t ) को परिभाषित करता है जो एक मॉड्यूल का प्रतिनिधित्व करता है और इसमें मेटाडेटा जैसे कि संस्करण, नाम और मॉड्यूल का लेखक शामिल होता है। Android HAL मॉड्यूल को सही ढंग से खोजने और लोड करने के लिए इस मेटाडेटा का उपयोग करता है।

इसके अलावा, hw_module_t संरचना में एक अन्य संरचना के लिए एक सूचक होता है, hw_module_methods_t , जिसमें मॉड्यूल के लिए एक खुले फ़ंक्शन के लिए एक सूचक होता है। इस खुले फ़ंक्शन का उपयोग हार्डवेयर के साथ संचार शुरू करने के लिए किया जाता है जिसके लिए HAL एक अमूर्त के रूप में कार्य कर रहा है। प्रत्येक हार्डवेयर-विशिष्ट एचएएल आमतौर पर हार्डवेयर के उस विशिष्ट टुकड़े के लिए अतिरिक्त जानकारी के साथ सामान्य hw_module_t संरचना का विस्तार करता है। उदाहरण के लिए, कैमरा एचएएल में, camera_module_t struct एक शामिल hw_module_t अन्य कैमरा-विशेष समारोह संकेत के साथ struct:

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 नाम देना होगा। नेक्सस 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,
    },
};

एचएएल डिवाइस

एक उपकरण आपके उत्पाद के हार्डवेयर का सार करता है। उदाहरण के लिए, एक ऑडियो मॉड्यूल में एक प्राथमिक ऑडियो डिवाइस, एक 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;

इन मानक गुणों के अलावा, प्रत्येक हार्डवेयर-विशिष्ट एचएएल इंटरफ़ेस अपनी स्वयं की सुविधाओं और आवश्यकताओं को अधिक परिभाषित कर सकता है। विवरण के लिए, एचएएल संदर्भ प्रलेखन और साथ ही प्रत्येक एचएएल के लिए व्यक्तिगत निर्देश देखें।

एचएएल मॉड्यूल का निर्माण

एचएएल कार्यान्वयन मॉड्यूल ( .so ) फ़ाइलों में निर्मित होते हैं और उपयुक्त होने पर एंड्रॉइड द्वारा गतिशील रूप से जुड़े होते हैं। आप अपने प्रत्येक HAL कार्यान्वयन के लिए Android.mk फ़ाइलें बनाकर और अपने स्रोत फ़ाइलों को इंगित करके अपने मॉड्यूल का निर्माण कर सकते हैं। सामान्य तौर पर, आपके साझा पुस्तकालयों को एक विशिष्ट प्रारूप में नामित किया जाना चाहिए ताकि उन्हें ठीक से ढूंढा और लोड किया जा सके। नामकरण योजना मॉड्यूल से मॉड्यूल में थोड़ी भिन्न होती है, लेकिन सामान्य पैटर्न का अनुसरण करती है: <module_type>.<device_name>