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 পরিবর্তন করা
এরপর, LOCAL_SRC_FILES-এ ইমপ্লিমেন্টেশন ফাইল (<modulename>Configs.cpp) যোগ করতে
এবং ম্যাক্রো সংজ্ঞায় বিল্ড ফ্ল্যাগ ম্যাপ করতে
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 ফাংশন কল করুন। যেমন, আপনি 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 পরিষেবায় সব ইন্টারফেস ইমপ্লিমেন্টেশন রেজিস্টার করুন। যেমন, আপনি
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 পরিষেবা এক্সটার্নাল ফাইল পড়ে না, তাই এটি চালু হওয়ার পরে দ্রুত রেডি হয়ে যাবে বলে আশা করা হয়।