कुछ अपवादों को छोड़कर, HIDL इंटरफ़ेस पैकेज hardware/interfaces
या vendor/
डायरेक्ट्री में मौजूद होते हैं. hardware/interfaces
टॉप-लेवल, सीधे android.hardware
पैकेज नेमस्पेस पर मैप करता है. वर्शन, पैकेज (इंटरफ़ेस नहीं) नेमस्पेस के तहत एक सबडायरेक्ट्री है.
hidl-gen
कंपाइलर, .hal
फ़ाइलों को .h
और .cpp
फ़ाइलों के सेट में कंपाइल करता है. अपने-आप जनरेट हुई इन फ़ाइलों से, एक शेयर की गई लाइब्रेरी बनाई जाती है. क्लाइंट/सर्वर लागू करने के लिए, इस लाइब्रेरी को लिंक किया जाता है.
इस शेयर की गई लाइब्रेरी को बनाने वाली Android.bp
फ़ाइल, hardware/interfaces/update-makefiles.sh
स्क्रिप्ट से अपने-आप जनरेट होती है. जब भी hardware/interfaces
में नया पैकेज जोड़ा जाता है या किसी मौजूदा पैकेज में .hal
फ़ाइलें जोड़ी या हटाई जाती हैं, तो आपको स्क्रिप्ट को फिर से चलाना होगा. इससे यह पक्का किया जा सकेगा कि जनरेट की गई शेयर की जा सकने वाली लाइब्रेरी अप-टू-डेट है.
उदाहरण के लिए, IFoo.hal
सैंपल फ़ाइल, hardware/interfaces/samples/1.0
में होनी चाहिए. सैंपल
IFoo.hal
फ़ाइल, सैंपल पैकेज में IFoo इंटरफ़ेस बनाती है:
package android.hardware.samples@1.0; interface IFoo { struct Foo { int64_t someValue; handle myHandle; }; someMethod() generates (vec<uint32_t>); anotherMethod(Foo foo) generates (int32_t ret); };
जनरेट की गई फ़ाइलें
HIDL पैकेज में अपने-आप जनरेट हुई फ़ाइलों को एक शेयर की गई लाइब्रेरी में लिंक किया जाता है. इस लाइब्रेरी का नाम पैकेज के नाम जैसा होता है. उदाहरण के लिए, android.hardware.samples@1.0
. शेयर की गई लाइब्रेरी, एक हेडर IFoo.h
भी एक्सपोर्ट करती है. इसे क्लाइंट और सर्वर शामिल कर सकते हैं. इनपुट के तौर पर IFoo.hal
इंटरफ़ेस फ़ाइल के साथ hidl-gen
कंपाइलर का इस्तेमाल करने पर, बाइंडर मोड में ये फ़ाइलें अपने-आप जनरेट होती हैं:
पहली इमेज. कंपाइलर से जनरेट हुई फ़ाइलें.
IFoo.h
. C++ क्लास में,IFoo
इंटरफ़ेस के बारे में बताता है. इसमेंIFoo.hal
फ़ाइल मेंIFoo
इंटरफ़ेस में बताए गए तरीके और टाइप शामिल होते हैं. ज़रूरत पड़ने पर, इन्हें C++ टाइप में बदल दिया जाता है. इस इंटरफ़ेस को लागू करने के लिए इस्तेमाल किए गए आरपीसी (उदाहरण के लिए,HwBinder
) के तरीके से जुड़ी जानकारी इसमें शामिल नहीं होती. क्लास को पैकेज और वर्शन के नेमस्पेस के साथ रखा जाता है. उदाहरण के लिए,::android::hardware::samples::IFoo::V1_0
. क्लाइंट और सर्वर, दोनों में यह हेडर शामिल होता है: क्लाइंट, उस पर तरीकों को कॉल करने के लिए और सर्वर, उन तरीकों को लागू करने के लिए.IHwFoo.h
. हेडर फ़ाइल, जिसमें इंटरफ़ेस में इस्तेमाल किए जाने वाले डेटा टाइप को सीरियलाइज़ करने वाले फ़ंक्शन के एलान होते हैं. डेवलपर को कभी भी सीधे तौर पर अपना हेडर शामिल नहीं करना चाहिए. इसमें कोई क्लास नहीं होती.BpHwFoo.h
. यह एक ऐसी क्लास है जोIFoo
से इनहेरिट करती है और इंटरफ़ेस केHwBinder
प्रॉक्सी (क्लाइंट-साइड) लागू करने के बारे में बताती है. डेवलपर को इस क्लास का सीधे तौर पर कभी भी रेफ़र नहीं करना चाहिए.BnHwFoo.h
. यह एक ऐसी क्लास है जिसमेंIFoo
को लागू करने का रेफ़रंस होता है. साथ ही, इसमें इंटरफ़ेस केHwBinder
स्टब (सर्वर साइड) को लागू करने के बारे में बताया जाता है. डेवलपर को इस क्लास को सीधे तौर पर कभी रेफ़र नहीं करना चाहिए.FooAll.cpp
. एक ऐसी क्लास जिसमेंHwBinder
प्रॉक्सी औरHwBinder
स्टब, दोनों के लिए लागू करने की सुविधाएं शामिल होती हैं. जब कोई क्लाइंट किसी इंटरफ़ेस के तरीके को कॉल करता है, तो प्रॉक्सी, क्लाइंट से मिले आर्ग्युमेंट को अपने-आप मार्शल करता है और लेन-देन को बाइंडर कर्नेल ड्राइवर पर भेजता है. यह ड्राइवर, लेन-देन को दूसरी तरफ़ मौजूद स्टब पर भेजता है. इसके बाद, स्टब, लेन-देन को असली सर्वर पर लागू करता है.
इन फ़ाइलों का स्ट्रक्चर, aidl-cpp
से जनरेट की गई फ़ाइलों से मिलता-जुलता है. ज़्यादा जानकारी के लिए, HIDL की खास जानकारी में "पासथ्रू मोड" देखें. HIDL के इस्तेमाल किए गए आरपीसी (रिकॉर्ड किए गए प्रोसेस कॉल) तरीके से अलग, अपने-आप जनरेट होने वाली एकमात्र फ़ाइल IFoo.h
है. बाकी सभी फ़ाइलें, HIDL के इस्तेमाल किए गए HwBinder आरपीसी तरीके से जुड़ी होती हैं. इसलिए, क्लाइंट और सर्वर के लागू होने पर, IFoo
के अलावा किसी और चीज़ का सीधे तौर पर रेफ़रंस नहीं दिया जाना चाहिए. ऐसा करने के लिए, सिर्फ़ IFoo.h
शामिल करें और जनरेट की गई शेयर की गई लाइब्रेरी से लिंक करें.
शेयर की गई लाइब्रेरी से लिंक करना
किसी पैकेज में किसी इंटरफ़ेस का इस्तेमाल करने वाले क्लाइंट या सर्वर में, उस पैकेज की शेयर की गई लाइब्रेरी को इनमें से किसी एक (1) जगह पर शामिल करना ज़रूरी है:
- Android.mk में:
LOCAL_SHARED_LIBRARIES += android.hardware.samples@1.0
- Android.bp में:
shared_libs: [ /* ... */ "android.hardware.samples@1.0", ],
आपको इन लाइब्रेरी को भी शामिल करना पड़ सकता है:
libhidlbase |
इसमें स्टैंडर्ड HIDL डेटा टाइप शामिल होते हैं. Android
10 में, इसमें वे सभी सिंबल भी शामिल हैं जो पहले libhidltransport और
libhwbinder में थे.
|
---|---|
libhidltransport |
अलग-अलग आरपीसी/आईपीसी प्रोसेस के ज़रिए, HIDL कॉल के ट्रांसपोर्ट को मैनेज करता है. Android 10 में इस लाइब्रेरी का इस्तेमाल नहीं किया जा सकता. |
libhwbinder |
बाइंडर के हिसाब से सिंबल. Android 10 में इस लाइब्रेरी का इस्तेमाल नहीं किया जा सकता. |
libfmq |
फ़ास्ट मैसेज क्यू आईपीसी. |
नेमस्पेस
Return<T>
और
Void()
जैसे HIDL फ़ंक्शन और टाइप, नेमस्पेस ::android::hardware
में एलान किए जाते हैं.
किसी पैकेज का C++ नेमस्पेस, पैकेज के नाम और वर्शन से तय होता है.
उदाहरण के लिए, hardware/interfaces
में मौजूद mypackage पैकेज के वर्शन 1.2 की ये विशेषताएं हैं:
- C++ नेमस्पेस
::android::hardware::mypackage::V1_2
है - उस पैकेज में
IMyInterface
का पूरी तरह क्वालिफ़ाइड नाम :::android::hardware::mypackage::V1_2::IMyInterface
है. (IMyInterface
एक आइडेंटिफ़ायर है, नेमस्पेस का हिस्सा नहीं). - पैकेज की
types.hal
फ़ाइल में तय किए गए टाइप की पहचान इस तरह की जाती है:::android::hardware::mypackage::V1_2::MyPackageType