सेवा लागू करना

HAL को लागू करने के लिए, ConfigStore इंटरफ़ेस का बेसिक कोड जनरेट किया जा सकता है. इसके बाद, अपनी ज़रूरतों के हिसाब से उसमें बदलाव किया जा सकता है.

इंटरफ़ेस कोड जनरेट करना

इंटरफ़ेस के लिए छोटे-मोटे बदलाव वाला कोड जनरेट करने के लिए, hidl-gen चलाएं. उदाहरण के लिए, surfaceflinger के लिए कोड जनरेट करने के लिए:

hidl-gen -o hardware/interfaces/configstore/1.0/default \
    -Lc++-impl \
    -randroid.hardware:hardware/interfaces \
    -randroid.hidl:system/libhidl/transport \
    android.hardware.config@1.0::ISurfaceFlingerConfigs

Android.mk में बदलाव करना

इसके बाद, Android.mk फ़ाइल में बदलाव करके, LOCAL_SRC_FILES में लागू करने वाली फ़ाइल (<modulename>Configs.cpp) जोड़ें. साथ ही, बिल्ड फ़्लैग को मैक्रो डेफ़िनिशन में मैप करें. उदाहरण के लिए, surfaceflinger में hardware/interface/configstore/1.0/default/Android.mk बदलाव किया जा सकता है:

LOCAL_SRC_FILES += SurfaceFlingerConfigs.cpp
ifneq ($(NUM_FRAMEBUFFER_SURFACE_BUFFERS),)
    LOCAL_CFLAGS += -DNUM_FRAMEBUFFER_SURFACE_BUFFERS=$(NUM_FRAMEBUFFER_SURFACE_BUFFERS)
endif

ifeq ($(TARGET_RUNNING_WITHOUT_SYNC_FRAMEWORK),true)
    LOCAL_CFLAGS += -DRUNNING_WITHOUT_SYNC_FRAMEWORK
endif

अगर Android.mk में कई ifeq-endif ब्लॉक शामिल हैं, तो अपने कोड को किसी नई फ़ाइल (यानी कि surfaceflinger.mk) में ले जाएं. इसके बाद, उस फ़ाइल को Android.mk में शामिल करें.

फ़ंक्शन लागू करना

HAL को लागू करने के लिए फ़ंक्शन भरने के लिए, अलग-अलग वैल्यू के साथ _hidl_cb फ़ंक्शन को वापस कॉल करें. हालांकि, ऐसा सिर्फ़ तब किया जा सकता है, जब बिल्ड फ़्लैग की शर्तें पूरी होती हों. उदाहरण के लिए, surfaceflinger in hardware/interfaces/configstore/1.0/default/SurfaceFlingerConfigs.cpp के लिए फ़ंक्शन भरे जा सकते हैं:

Return<void> SurfaceFlingerConfigs::numFramebufferSurfaceBuffers(
        numFramebufferSurfaceBuffers_cb _hidl_cb) {
    #if NUM_FRAMEBUFFER_SURFACE_BUFFERS 2
    _hidl_cb(NumBuffers.TWO);
    #else if NUM_FRAMEBUFFER_SURFACE_BUFFERS 3
    _hidl_cb(NumBuffers.THREE);
    #else
    _hidl_cb(NumBuffers.USE_DEFAULT);
    #endif
}

Return<void> SurfaceFlingerConfigs::runWithoutSyncFramework(
        runWithoutSyncFramework_cb _hidl_cb) {
    #ifdef RUNNING_WITHOUT_SYNC_FRAMEWORK
    _hidl_cb({true /* specified */, true /* value */});
    #else
    // when macro not defined, we can give any value to the second argument.
    // It will simply be ignored in the framework side.
    _hidl_cb({false /* specified */, false /* value */});
    #endif
}

पक्का करें कि लागू करने के तरीके में HIDL_FETCH_interface-name नाम का कोई फ़ंक्शन शामिल न हो. उदाहरण के लिए, HIDL_FETCH_ISurfaceFlingerConfigs. यह फ़ंक्शन, एचआईडीएल पासथ्रू मोड के लिए ज़रूरी है. configstore इसका इस्तेमाल नहीं करता है और इसे इस्तेमाल करने की अनुमति नहीं है. ConfigStore को हमेशा बाइंडर मोड में चलाना चाहिए.

सेवा के तौर पर रजिस्टर करना

आखिर में, सभी इंटरफ़ेस लागू करने की प्रोसेस को configstore सेवा में रजिस्टर करें. उदाहरण के लिए, surfaceflinger को hardware/interfaces/configstore/1.0/default/service.cpp में लागू करने के लिए रजिस्टर किया जा सकता है:

configureRpcThreadpool(maxThreads, true);
sp<ISurfaceFlingerConfigs> surfaceFlingerConfigs = new SurfaceFlingerConfigs;
status_t status = surfaceFlingerConfigs->registerAsService();

sp<IBluetoothConfigs> bluetoothConfigs = new BluetoothConfigs;
status = bluetoothConfigs->registerAsService();

// register more interfaces here
joinRpcThreadpool();

रिलीज़ होने से पहले ऐक्सेस पाने की सुविधा चालू करना

यह पक्का करने के लिए कि फ़्रेमवर्क मॉड्यूल को HAL सेवा का ऐक्सेस जल्द मिल जाए, कॉन्फ़िग HAL सेवा को जल्द से जल्द शुरू किया जाना चाहिए. यह सेवा, hwservicemanager के तैयार होने के तुरंत बाद शुरू होनी चाहिए. कॉन्फ़िगरेशन HAL सेवा बाहरी फ़ाइलों को नहीं पढ़ती है. इसलिए, लॉन्च होने के बाद यह सेवा तुरंत शुरू हो जाती है.