विरासती एचएएल

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

एचएएल घटक

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

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

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

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

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

इसके अलावा, hw_module_t संरचना में किसी अन्य संरचना, hw_module_methods_t के लिए एक सूचक होता है, जिसमें मॉड्यूल के लिए एक खुले फ़ंक्शन के लिए एक सूचक होता है। इस ओपन फ़ंक्शन का उपयोग हार्डवेयर के साथ संचार आरंभ करने के लिए किया जाता है जिसके लिए एचएएल एक अमूर्त के रूप में कार्य कर रहा है। प्रत्येक हार्डवेयर-विशिष्ट HAL आमतौर पर हार्डवेयर के उस विशिष्ट टुकड़े के लिए अतिरिक्त जानकारी के साथ सामान्य hw_module_t संरचना का विस्तार करता है। उदाहरण के लिए, कैमरा एचएएल में, 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 ऑडियो 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,
    },
};

एचएएल उपकरण

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

विरासत एचएएल

लीगेसी एचएएल शब्द मोटे तौर पर सभी प्री-एंड्रॉइड 8.0 एचएएल (एंड्रॉइड 8 में अप्रचलित) को संदर्भित करता है। अधिकांश एंड्रॉइड सिस्टम इंटरफेस (कैमरा, ऑडियो, सेंसर इत्यादि) को 'हार्डवेयर/लिबहार्डवेयर/इनक्लूड/हार्डवेयर' के तहत परिभाषित किया गया है और इसमें रफ वर्जनिंग और लगभग स्थिर एबीआई है। कुछ उपप्रणालियों (वाई-फाई, रेडियो इंटरफेस लेयर और ब्लूटूथ सहित) में `libhardware_legacy` में अन्य गैर-मानकीकृत इंटरफेस हैं या पूरे कोडबेस में फैले हुए हैं। लीगेसी एचएएल ने कभी भी कठोर स्थिरता की गारंटी नहीं दी।