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