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