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

पहली इमेज. HAL कॉम्पोनेंट
आपको अपने प्रॉडक्ट में मौजूद हार्डवेयर के लिए, उससे जुड़ा एचएएल (और ड्राइवर) लागू करना होगा. आम तौर पर, एचएएल को लागू करने की सुविधा, शेयर की गई लाइब्रेरी के मॉड्यूल (.so
फ़ाइलें) में बनाई जाती है. हालांकि, Android, एचएएल को लागू करने की सुविधा और डिवाइस ड्राइवर के बीच स्टैंडर्ड इंटरैक्शन को ज़रूरी नहीं मानता. इसलिए, अपनी स्थिति के हिसाब से, आपके पास अपनी पसंद का विकल्प चुनने का विकल्प होता है. हालांकि, Android सिस्टम को आपके हार्डवेयर के साथ सही तरीके से इंटरैक्ट करने के लिए, आपको हर हार्डवेयर के हिसाब से बनाए गए एचएएल इंटरफ़ेस में बताए गए समझौते का पालन करना होगा.
यह पक्का करने के लिए कि एचएएल का स्ट्रक्चर अनुमानित हो, हर हार्डवेयर के हिसाब से बने एचएएल इंटरफ़ेस में, hardware/libhardware/include/hardware/hardware.h
में बताई गई प्रॉपर्टी होती हैं. इस इंटरफ़ेस की मदद से, Android सिस्टम आपके HAL मॉड्यूल के सही वर्शन को एक जैसा लोड कर सकता है. एचएएल इंटरफ़ेस में दो कॉम्पोनेंट होते हैं: मॉड्यूल और डिवाइस.
HAL मॉड्यूल
मॉड्यूल, पैकेज किए गए एचएएल के लागू होने का प्रतिनिधित्व करता है. इसे शेयर की गई लाइब्रेरी (.so file
) के तौर पर सेव किया जाता है. hardware/libhardware/include/hardware/hardware.h
हेडर फ़ाइल, एक स्ट्रक्चर (hw_module_t
) तय करती है, जो मॉड्यूल को दिखाता है. साथ ही, इसमें मॉड्यूल का वर्शन, नाम, और लेखक जैसे मेटाडेटा शामिल होते हैं. Android, एचएएल मॉड्यूल को सही तरीके से ढूंढने और लोड करने के लिए, इस मेटाडेटा का इस्तेमाल करता है.
इसके अलावा, hw_module_t
स्ट्रक्चर में एक और स्ट्रक्चर, hw_module_methods_t
का पॉइंटर होता है. इसमें मॉड्यूल के लिए, ओपन फ़ंक्शन का पॉइंटर होता है. इस open फ़ंक्शन का इस्तेमाल, उस हार्डवेयर के साथ कम्यूनिकेशन शुरू करने के लिए किया जाता है जिसके लिए HAL, एब्स्ट्रैक्शन के तौर पर काम कर रहा है.
आम तौर पर, हर हार्डवेयर के लिए बना HAL, उस हार्डवेयर के बारे में ज़्यादा जानकारी के साथ सामान्य hw_module_t
struct को बड़ा करता है. उदाहरण के लिए, कैमरा एचएएल में, 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 के ऑडियो एचएएल का उदाहरण:
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 डिवाइस
डिवाइस, आपके प्रॉडक्ट के हार्डवेयर को एब्स्ट्रैक्ट करता है. उदाहरण के लिए, किसी ऑडियो मॉड्यूल में मुख्य ऑडियो डिवाइस, यूएसबी ऑडियो डिवाइस या ब्लूटूथ 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 मॉड्यूल बनाना
एचएएल लागू करने की सुविधा, मॉड्यूल (.so
) फ़ाइलों में बनाई गई है. साथ ही, ज़रूरत पड़ने पर Android, इसे डाइनैमिक तौर पर लिंक करता है. अपने हर एचएएल लागू करने के लिए Android.mk
फ़ाइलें बनाकर और अपनी सोर्स फ़ाइलों पर ले जाकर, अपने मॉड्यूल बनाए जा सकते हैं. आम तौर पर, शेयर की गई लाइब्रेरी का नाम किसी खास फ़ॉर्मैट में होना चाहिए, ताकि उन्हें आसानी से ढूंढा और लोड किया जा सके. नाम रखने का तरीका, हर मॉड्यूल में थोड़ा अलग होता है. हालांकि, यह आम तौर पर इस पैटर्न का पालन करता है: <module_type>.<device_name>
.