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 পরিবর্তন করুন
এরপরে, ইমপ্লিমেন্টেশন ফাইল ( <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 থেকে সেই ফাইলটি অন্তর্ভুক্ত করুন।
ফাংশনগুলি বাস্তবায়ন করুন
HAL বাস্তবায়নের জন্য ফাংশনগুলো পূরণ করতে, বিল্ড ফ্ল্যাগের উপর ভিত্তি করে বিভিন্ন মান দিয়ে _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();
দ্রুত অ্যাক্সেস নিশ্চিত করুন
একটি ফ্রেমওয়ার্ক মডিউল যাতে HAL সার্ভিসে আগেভাগে অ্যাক্সেস পেতে পারে, তা নিশ্চিত করার জন্য, hwservicemanager প্রস্তুত হওয়ার ঠিক পরেই, যত দ্রুত সম্ভব কনফিগ HAL সার্ভিসটি চালু করা উচিত। যেহেতু কনফিগ HAL সার্ভিসটি কোনো এক্সটার্নাল ফাইল পড়ে না, তাই এটি চালু হওয়ার পরপরই দ্রুত প্রস্তুত হয়ে যাবে বলে আশা করা হয়।