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

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