एचएएल को लागू करने के लिए तैयारी करने के लिए, बुनियादी 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
और
का इस्तेमाल करें. उदाहरण के लिए, आपके पास
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
के लिए फ़ंक्शन भर सकते हैं
इंच
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
). यह फ़ंक्शन इनके लिए ज़रूरी है
HIDL पासथ्रू मोड, जो इसके द्वारा उपयोग नहीं किया गया (और प्रतिबंधित) है
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 सेवा के रिलीज़ होने से पहले उसका ऐक्सेस मिल सके, इसके लिए
config HAL सेवा जल्द से जल्द शुरू होनी चाहिए
hwservicemanager
इस्तेमाल के लिए तैयार है. ऐसा इसलिए है, क्योंकि कॉन्फ़िगरेशन एचएएल सेवा
बाहरी फ़ाइलें हैं, तो लॉन्च के बाद इसके जल्दी तैयार होने की उम्मीद होती है.