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 फ़ाइल में बदलाव करके, लागू करने वाली फ़ाइल (<modulename>Configs.cpp) को LOCAL_SRC_FILES में जोड़ें. साथ ही, बिल्ड फ़्लैग को मैक्रो की परिभाषाओं में मैप करें. उदाहरण के लिए, hardware/interface/configstore/1.0/default/Android.mk में मौजूद surfaceflinger में बदलाव किया जा सकता है:
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 सेवा बाहरी फ़ाइलों को नहीं पढ़ती है. इसलिए, इसे लॉन्च करने के बाद, यह सेवा तुरंत शुरू हो जाती है.