पैकेज

कुछ अपवादों को छोड़कर, 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