HIDL C ++

एंड्रॉइड O ने डिवाइस-स्वतंत्र एंड्रॉइड प्लेटफ़ॉर्म और डिवाइस- और विक्रेता-विशिष्ट कोड के बीच स्पष्ट इंटरफेस को परिभाषित करने के लिए एंड्रॉइड ओएस को फिर से आर्किटेक्ट किया। Android पहले से ही HAL इंटरफेस के रूप में कई ऐसे इंटरफेस को परिभाषित करता है, जिन्हें hardware/libhardware में C हेडर के रूप में परिभाषित किया गया है। HIDL इन HAL इंटरफेस को स्टेबल, वर्जन इंटरफेस के साथ बदल देता है, जो क्लाइंट- और सर्वर साइड HIDL इंटरफेस C ++ (नीचे वर्णित) या जावा में हो सकते हैं

इस खंड के पृष्ठ HIDL इंटरफेस के C ++ कार्यान्वयन का वर्णन करते हैं, जिसमें HIDL .hal फ़ाइलों से hidl-gen संकलक द्वारा स्वतः उत्पन्न की गई फ़ाइलों के बारे में विवरण, इन फ़ाइलों को कैसे पैक किया जाता है, और इन फ़ाइलों को C ++ कोड के साथ कैसे एकीकृत किया जाए। उनका उपयोग करता है।

क्लाइंट और सर्वर कार्यान्वयन

HIDL इंटरफेस में क्लाइंट और सर्वर कार्यान्वयन हैं:

  • एक HIDL इंटरफ़ेस का एक क्लाइंट कोड है जो उस पर तरीकों को कॉल करके इंटरफ़ेस का उपयोग करता है।
  • एक सर्वर एक HIDL इंटरफ़ेस का कार्यान्वयन है जो क्लाइंट से कॉल प्राप्त करता है और परिणाम (यदि आवश्यक हो) देता है।

libhardware HALs से libhardware HALs में संक्रमण होने पर, HAL कार्यान्वयन सर्वर बन जाता है और HAL में कॉल करने की प्रक्रिया क्लाइंट बन जाती है। डिफ़ॉल्ट कार्यान्वयन पास्चथ्रू और बाइंडराइज़्ड HALs दोनों की सेवा कर सकते हैं, और समय के साथ बदल सकते हैं:

चित्रा 1. विरासत एचएएल के लिए विकास प्रगति।

एचएएल क्लाइंट बनाना

मेकफाइल में एचएएल पुस्तकालयों को शामिल करके शुरू करें:

  • बनाओ: LOCAL_SHARED_LIBRARIES += android.hardware.nfc@1.0
  • Soong: shared_libs: [ …, android.hardware.nfc@1.0 ]

अगला, HAL शीर्षक फ़ाइलें शामिल करें:

#include <android/hardware/nfc/1.0/IFoo.h>
…
// in code:
sp<IFoo> client = IFoo::getService();
client->doThing();

HAL सर्वर बनाना

एचएएल कार्यान्वयन बनाने के लिए, आपके पास .hal फाइलें होनी चाहिए जो आपके HAL का प्रतिनिधित्व करती हैं और आपके HAL के लिए पहले से ही -Lmakefile उत्पन्न करती हैं -Lmakefile या -Landroidbp पर hidl-gen ( ./hardware/interfaces/update-makefiles.sh लिए यह करता है। आंतरिक एचएएल फाइलें और एक अच्छा संदर्भ है)। जब से HALs स्थानांतरित libhardware , आप आसानी से c2hal का उपयोग कर इस काम का एक बहुत कुछ कर सकते हैं।

अपने HAL को लागू करने के लिए आवश्यक फाइलें बनाने के लिए:

PACKAGE=android.hardware.nfc@1.0
LOC=hardware/interfaces/nfc/1.0/default/
m -j hidl-gen
hidl-gen -o $LOC -Lc++-impl -randroid.hardware:hardware/interfaces \
    -randroid.hidl:system/libhidl/transport $PACKAGE
hidl-gen -o $LOC -Landroidbp-impl -randroid.hardware:hardware/interfaces \
    -randroid.hidl:system/libhidl/transport $PACKAGE
है

PALsthrough मोड में काम करने के लिए HAL के लिए, आपके पास HIDL_FETCH_IModuleName /(system|vendor|...)/lib(64)?/hw/android.hardware.package@3.0-impl( OPTIONAL_IDENTIFIER ).so में रहने वाला फ़ंक्शन होना चाहिए। जहां OPTIONAL_IDENTIFIER एक स्ट्रिंग है जो पस्चथ्र कार्यान्वयन को पहचानती है। Passthrough मोड आवश्यकताओं को उपरोक्त आदेशों द्वारा स्वचालित रूप से पूरा किया जाता है, जो android.hardware.nfc@1.0-impl लक्ष्य भी बनाते हैं, लेकिन किसी भी एक्सटेंशन का उपयोग किया जा सकता है। उदाहरण के लिए android.hardware.nfc@1.0-impl-foo का उपयोग करता है -foo खुद को अलग करने के।

यदि HAL एक मामूली संस्करण है या किसी अन्य HAL का विस्तार है, तो आधार HAL का उपयोग इस बाइनरी को नाम देने के लिए किया जाना चाहिए। उदाहरण के लिए, android.hardware.graphics.mapper@2.1 कार्यान्वयन अभी भी एक बाइनरी में होना चाहिए जिसे android.hardware.graphics.mapper@2.0-impl( OPTIONAL_IDENTIFIER ) कहा जाता है। आमतौर पर, यहां OPTIONAL_IDENTIFIER में वास्तविक HAL संस्करण शामिल होगा। इस तरह से बाइनरी का नामकरण करके, 2.0 क्लाइंट इसे सीधे प्राप्त कर सकते हैं, और 2.1 क्लाइंट कार्यान्वयन को बढ़ा सकते हैं।

इसके बाद, कार्यक्षमता के साथ स्टब्स को भरें और एक डेमॉन सेटअप करें। उदाहरण डेमन कोड (समर्थन का समर्थन):

#include <hidl/LegacySupport.h>

int main(int /* argc */, char* /* argv */ []) {
    return defaultPassthroughServiceImplementation<INfc>("nfc");
}

defaultPassthroughServiceImplementation जाएगा dlopen() प्रदान की -impl पुस्तकालय और एक binderized सेवा के रूप में यह प्रदान करते हैं। उदाहरण डेमन कोड (शुद्ध बाइंडराइज्ड सेवा के लिए):

0a1cd04e0

यह डेमन आमतौर पर $PACKAGE + "-service-suffix" (उदाहरण के लिए, android.hardware.nfc@1.0-service ) में रहता है, लेकिन यह कहीं भी हो सकता है। एचएएल के एक विशिष्ट वर्ग के लिए सेपोलिश है विशेषता hal_<module> (उदाहरण के लिए, hal_nfc) । इस विशेषता को डेमन पर लागू किया जाना चाहिए जो एक विशेष एचएएल चलाता है (यदि एक ही प्रक्रिया कई एचएएल की सेवा करती है, तो इसके लिए कई विशेषताओं को लागू किया जा सकता है)।