एचआईडीएल सी++

Android 8, Android OS को फिर से संग्रहित करता है, ताकि डिवाइस स्वतंत्र Android प्लैटफ़ॉर्म और डिवाइस और वेंडर के लिए खास कोड. Android ऐसे कई इंटरफ़ेस को पहले ही HAL इंटरफ़ेस के तौर पर परिभाषित करता है. को hardware/libhardware में C हेडर के तौर पर परिभाषित किया गया है. HIDL इनकी जगह लेता है स्थिर और वर्शन वाले इंटरफ़ेस वाले HAL इंटरफ़ेस, जो क्लाइंट- और C++ में सर्वर-साइड HIDL इंटरफ़ेस (नीचे बताया गया है) या Java.

इस सेक्शन के पेजों में, HIDL इंटरफ़ेस के C++ को लागू करने के बारे में बताया गया है. इसमें HIDL .hal से अपने-आप जनरेट हुई फ़ाइलों की जानकारी शामिल होगी फ़ाइलें hidl-gen कंपाइलर की ओर से, और इन फ़ाइलों को पैकेज करने का तरीका, और इन फ़ाइलों को C++ कोड के साथ इंटिग्रेट करने का तरीका जानें.

क्लाइंट और सर्वर को लागू करना

HIDL इंटरफ़ेस में क्लाइंट और सर्वर को लागू किया जाता है:

  • HIDL इंटरफ़ेस का क्लाइंट वह कोड होता है जो उस पर विधियों को कॉल करने का विकल्प होता है.
  • सर्वर एक HIDL इंटरफ़ेस को लागू करने का तरीका है, जो यह ग्राहकों के कॉल को स्वीकार करता है और ज़रूरत पड़ने पर, नतीजे दिखाता है.

libhardware एचएएल से एचएएल एचएएल पर स्विच किया जा रहा है. एचएएल सर्वर के तौर पर काम करना, सर्वर बन जाता है और एचएएल में कॉल करने की प्रोसेस से संपर्क करने के लिए प्रोत्साहित करें. डिफ़ॉल्ट तौर पर लागू होने वाला बदलाव, पासथ्रू और बाइंडराइज़्ड, दोनों के लिए काम कर सकता है एचएएल में शामिल हैं और समय के साथ इनमें बदलाव हो सकते हैं:

पहला डायग्राम. लेगसी एचएएल के डेवलपमेंट की प्रोग्रेस.

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

सबसे पहले, मेकफ़ाइल में एचएएल लाइब्रेरी शामिल करें:

  • कंपनी: LOCAL_SHARED_LIBRARIES += android.hardware.nfc@1.0
  • सूंग: 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 फ़ाइलें होनी चाहिए जो आपके एचएएल को दिखाती हैं. साथ ही, एचएएल के लिए पहले ही मेकफ़ाइल जनरेट कर चुकी हैं hidl-gen पर -Lmakefile या -Landroidbp (./hardware/interfaces/update-makefiles.sh ऐसा इंटरनल सिस्टम के लिए करता है HAL फ़ाइलें शामिल हैं और यह एक अच्छा रेफ़रंस है). इस खाते से एचएएल को ट्रांसफ़र करते समय libhardware, c2hal का इस्तेमाल करके, बहुत सारे काम आसानी से किए जा सकते हैं.

अपने एचएएल को लागू करने के लिए ज़रूरी फ़ाइलें बनाने के लिए:

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

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

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

इसके बाद, स्टब को फ़ंक्शन से भरें और डीमन सेटअप करें. उदाहरण डीमन कोड (पासथ्रू के साथ काम करने वाला):

#include <hidl/LegacySupport.h>

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

defaultPassthroughServiceImplementation कॉल दी गई -impl लाइब्रेरी के लिए dlopen() और इसे इस तौर पर उपलब्ध कराता है एक बाध्य सेवा. डीमन कोड का उदाहरण (प्योर बाइंडराइज़्ड सेवा के लिए):

int main(int /* argc */, char* /* argv */ []) {
    // This function must be called before you join to ensure the proper
    // number of threads are created. The threadpool never exceeds
    // size one because of this call.
    ::android::hardware::configureRpcThreadpool(1 /*threads*/, true /*willJoin*/);

    sp<INfc> nfc = new Nfc();
    const status_t status = nfc->registerAsService();
    if (status != ::android::OK) {
        return 1; // or handle error
    }

    // Adds this thread to the threadpool, resulting in one total
    // thread in the threadpool. We could also do other things, but
    // would have to specify 'false' to willJoin in configureRpcThreadpool.
    ::android::hardware::joinRpcThreadpool();
    return 1; // joinRpcThreadpool should never return
}

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