পরিষেবাটি বাস্তবায়ন করুন

HAL বাস্তবায়নের জন্য প্রস্তুত করতে, আপনি মৌলিক কনফিগস্টোর ইন্টারফেস কোড তৈরি করতে পারেন, তারপর আপনার প্রয়োজন মেটানোর জন্য এটি পরিবর্তন করতে পারেন।

ইন্টারফেস কোড তৈরি করুন

ইন্টারফেসের জন্য বয়লারপ্লেট কোড তৈরি করতে, 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.mksurfaceflinger পরিবর্তন করতে পারেন:

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.cppsurfaceflinger জন্য ফাংশনগুলি পূরণ করতে পারেন:

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.cppsurfaceflinger বাস্তবায়ন নিবন্ধন করতে পারেন :

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();

প্রাথমিক অ্যাক্সেস নিশ্চিত করুন

To ensure that a framework module can get early access the HAL service, the config HAL service should start as early as possible, just after hwservicemanager is ready. যেহেতু কনফিগার HAL পরিষেবাটি বাহ্যিক ফাইলগুলি পড়ে না, এটি চালু হওয়ার পরে এটি দ্রুত প্রস্তুত হবে বলে আশা করা হচ্ছে।

,

HAL বাস্তবায়নের জন্য প্রস্তুত করতে, আপনি মৌলিক কনফিগস্টোর ইন্টারফেস কোড তৈরি করতে পারেন, তারপর আপনার প্রয়োজন মেটানোর জন্য এটি পরিবর্তন করতে পারেন।

ইন্টারফেস কোড তৈরি করুন

ইন্টারফেসের জন্য বয়লারপ্লেট কোড তৈরি করতে, 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.mksurfaceflinger পরিবর্তন করতে পারেন:

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.cppsurfaceflinger জন্য ফাংশনগুলি পূরণ করতে পারেন:

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.cppsurfaceflinger বাস্তবায়ন নিবন্ধন করতে পারেন :

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 পরিষেবাটি বাহ্যিক ফাইলগুলি পড়ে না, এটি চালু হওয়ার পরে এটি দ্রুত প্রস্তুত হবে বলে আশা করা হচ্ছে।