पैकेज

कुछ अपवादों के साथ, 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 कंपाइलर का उपयोग करते हुए, बाइंडराइज़्ड मोड में निम्नलिखित स्वचालित फ़ाइलें होती हैं:

संकलक द्वारा बनाई गई फ़ाइलें

चित्र 1. संकलक द्वारा उत्पन्न फ़ाइलें
  • IFoo.h । C++ वर्ग में शुद्ध IFoo इंटरफ़ेस का वर्णन करता है; इसमें IFoo.hal फ़ाइल में IFoo इंटरफ़ेस में परिभाषित विधियां और प्रकार शामिल हैं, जहां आवश्यक हो, C++ प्रकारों में अनुवादित किया गया है। इस इंटरफ़ेस को लागू करने के लिए उपयोग किए जाने वाले RPC तंत्र (उदाहरण के लिए, HwBinder ) से संबंधित विवरण शामिल नहीं हैं । क्लास को पैकेज और संस्करण के साथ नामित किया गया है, उदाहरण के लिए ::android::hardware::samples::IFoo::V1_0 । क्लाइंट और सर्वर दोनों में यह हेडर शामिल है: इस पर कॉल करने के तरीकों के लिए क्लाइंट और उन तरीकों को लागू करने के लिए सर्वर।
  • IHwFoo.h . हेडर फ़ाइल जिसमें फ़ंक्शंस के लिए घोषणाएं शामिल हैं जो इंटरफ़ेस में उपयोग किए गए डेटा प्रकारों को क्रमबद्ध करती हैं। डेवलपर्स को कभी भी अपना हेडर सीधे शामिल नहीं करना चाहिए (इसमें कोई क्लास शामिल नहीं है)।
  • BpHwFoo.h . एक वर्ग जो IFoo से विरासत में मिला है और इंटरफ़ेस के HwBinder प्रॉक्सी (क्लाइंट-साइड) कार्यान्वयन का वर्णन करता है। डेवलपर्स को कभी भी इस वर्ग का सीधे संदर्भ नहीं लेना चाहिए।
  • BnHwFoo.h . एक वर्ग जो IFoo कार्यान्वयन का संदर्भ रखता है और इंटरफ़ेस के HwBinder स्टब (सर्वर-साइड) कार्यान्वयन का वर्णन करता है। डेवलपर्स को कभी भी इस वर्ग का सीधे संदर्भ नहीं लेना चाहिए।
  • FooAll.cpp । एक वर्ग जिसमें HwBinder प्रॉक्सी और HwBinder स्टब दोनों के कार्यान्वयन शामिल हैं। जब कोई क्लाइंट इंटरफ़ेस विधि को कॉल करता है, तो प्रॉक्सी स्वचालित रूप से क्लाइंट से तर्कों को मार्शल करता है और लेनदेन को बाइंडर कर्नेल ड्राइवर को भेजता है, जो लेनदेन को दूसरी तरफ स्टब तक पहुंचाता है (जो तब वास्तविक सर्वर कार्यान्वयन को कॉल करता है)।

फ़ाइलें aidl-cpp द्वारा उत्पन्न फ़ाइलों के समान ही संरचित हैं (विवरण के लिए, एचआईडीएल अवलोकन में "पासथ्रू मोड" देखें)। एकमात्र ऑटोजेनरेटेड फ़ाइल जो HIDL द्वारा प्रयुक्त RPC तंत्र से स्वतंत्र है, IFoo.h है; अन्य सभी फ़ाइलें HIDL द्वारा प्रयुक्त HwBinder RPC तंत्र से जुड़ी हैं। इसलिए, क्लाइंट और सर्वर कार्यान्वयन को कभी भी सीधे तौर पर 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 डेटा प्रकार शामिल हैं। एंड्रॉइड 10 से शुरू होकर, इसमें libhidltransport और libhwbinder में पहले के सभी प्रतीक भी शामिल हैं।
libhidltransport विभिन्न आरपीसी/आईपीसी तंत्रों पर एचआईडीएल कॉल के परिवहन को संभालता है। एंड्रॉइड 10 इस लाइब्रेरी को बंद कर देता है।
libhwbinder बाइंडर-विशिष्ट प्रतीक. एंड्रॉइड 10 इस लाइब्रेरी को बंद कर देता है।
libfmq तेज़ संदेश कतार आईपीसी.

नेमस्पेस

HIDL फ़ंक्शंस और प्रकार जैसे Return<T> और Void() को नेमस्पेस ::android::hardware में घोषित किया गया है। पैकेज का C++ नेमस्पेस पैकेज नाम और संस्करण द्वारा निर्धारित किया जाता है। उदाहरण के लिए, hardware/interfaces के अंतर्गत संस्करण 1.2 वाले पैकेज मायपैकेज में निम्नलिखित गुण हैं:

  • C++ नेमस्पेस ::android::hardware::mypackage::V1_2 है
  • उस पैकेज में IMyInterface का पूर्णतः योग्य नाम है: ::android::hardware::mypackage::V1_2::IMyInterface । ( IMyInterface एक पहचानकर्ता है, नेमस्पेस का हिस्सा नहीं)।
  • पैकेज के types.hal फ़ाइल में परिभाषित प्रकारों की पहचान इस प्रकार की जाती है: ::android::hardware::mypackage::V1_2::MyPackageType