HAL ইন্টারফেস থেকে ডাইনামিক ভ্যালু রিড করার জন্য আপনি কন্ডিশনালি কম্পাইল করা কোড রিফ্যাক্টর করতে পারেন। যেমন:
#ifdef TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS // some code fragment #endif
তারপরে ফ্রেমওয়ার্ক কোড,
<configstore/Utils.h>-এ সংজ্ঞায়িত উপযুক্ত ইউটিলিটি ফাংশনকে তার ধরনের উপর নির্ভর করে কল করতে পারে।
ConfigStore-এর উদাহরণ
এই উদাহরণে ConfigStore HAL-এ
TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS সংজ্ঞায়িত করা রিডিংকে
forceHwcForVirtualDisplays() রিটার্ন টাইপ
OptionalBool হিসেবে দেখানো হয়েছে:
#include <configstore/Utils.h>
using namespace android::hardware::configstore;
using namespace android::hardware::configstore::V1_0;
static bool vsyncPhaseOffsetNs = getBool<ISurfaceFlingerConfigs,
ISurfaceFlingerConfigs::forceHwcForVirtualDisplays>(false);
ইউটিলিটি ফাংশন (getBool উপরের উদাহরণে) ইন্টারফেস ফাংশনের
প্রক্সির হ্যান্ডেল পেতে
configstore পরিষেবার সাথে যোগাযোগ করে, তারপর HIDL/hwbinder-এর
মাধ্যমে হ্যান্ডেল ইনভোক করে ভ্যালু রিট্রিভ করে।
ইউটিলিটি ফাংশন
<configstore/Utils.h>
(configstore/1.0/include/configstore/Utils.h) প্রতিটি প্রিমিটিভ রিটার্ন টাইপের জন্য ইউটিলিটি
ফাংশন প্রদান করে, যার মধ্যে
Optional[Bool|String|Int32|UInt32|Int64|UInt64] অন্তর্ভুক্ত, যেমন নিচে
তালিকাভুক্ত করা হয়েছে:
| ধরন | ফাংশন (টেমপ্লেট প্যারামিটার বাদ দেওয়া হয়েছে) |
|---|---|
OptionalBool |
bool getBool(const bool defValue) |
OptionalInt32 |
int32_t getInt32(const int32_t defValue) |
OptionalUInt32 |
uint32_t getUInt32(const uint32_t defValue) |
OptionalInt64 |
int64_t getInt64(const int64_t defValue) |
OptionalUInt64 |
uint64_t getUInt64(const uint64_t defValue) |
OptionalString |
std::string getString(const std::string &defValue) |
HAL ইমপ্লিমেন্টেশন
কনফিগারেশন আইটেমের জন্য কোনও ভ্যালু নির্দিষ্ট না করলে, defValue হল একটি ডিফল্ট ভ্যালু যা রিটার্ন করা হয়। প্রতিটি ফাংশন দুটি
টেমপ্লেট প্যারামিটার নেয়:
Iহল ইন্টারফেস ক্লাসের নাম।Funcহল কনফিগারেশন আইটেম পাওয়ার জন্য মেম্বার ফাংশন পয়েন্টার।
কনফিগারেশন ভ্যালু শুধুমাত্র-পড়ার জন্য এবং পরিবর্তন হয় না বলে, ইউটিলিটি ফাংশন ইন্টার্নালি কনফিগারেশন ভ্যালু ক্যাশে করে। পরবর্তী কলগুলি একই লিঙ্কিং ইউনিটে ক্যাশে করা ভ্যালু ব্যবহার করে আরও দক্ষতার সাথে পরিষেবা প্রদান করা হয়।
configstore-utils ব্যবহার করা
ConfigStore HAL-কে মাইনর ভার্সন
আপগ্রেডের জন্য ফরওয়ার্ড কম্প্যাটিবল হিসেবে ডিজাইন করা হয়েছে, এর অর্থ হল, HAL সংশোধন করা হলে এবং কিছু ফ্রেমওয়ার্ক কোড
নতুন আইটেম ব্যবহার করলে, /vendor-এ থাকা পুরনো মাইনর
ভার্সনের ConfigStore পরিষেবা এখনও ব্যবহার করা যাবে।
ভবিষ্যতে মানানসই হওয়ার জন্য, আপনার প্রয়োগ নিম্নলিখিত নির্দেশিকা মেনে চলছে কিনা তা নিশ্চিত করুন:
- শুধুমাত্র পুরনো ভার্সনের পরিষেবা
উপলভ্য থাকলে নতুন আইটেম ডিফল্ট ভ্যালু ব্যবহার করে। উদাহরণ:
service = V1_1::IConfig::getService(); // null if V1_0 is installed value = DEFAULT_VALUE; if(service) { value = service->v1_1API(DEFAULT_VALUE); } - ক্লায়েন্ট প্রথম ইন্টারফেস ব্যবহার করে যাতে ConfigStore আইটেম অন্তর্ভুক্ত থাকে।
উদাহরণ:
V1_1::IConfig::getService()->v1_0API(); // NOT ALLOWED V1_0::IConfig::getService()->v1_0API(); // OK
- পুরনো ভার্সনের ইন্টারফেসের জন্য নতুন ভার্সনের পরিষেবা রিট্রিভ করা যেতে পারে। নিম্নলিখিত
উদাহরণে, ইনস্টল করা ভার্সন v1_1 হলে, v1_1 পরিষেবাটি
getService()-এর জন্য ফেরত দিতে হবে:V1_0::IConfig::getService()->v1_0API();
ConfigStore আইটেম অ্যাক্সেস করার জন্য configstore-utils লাইব্রেরিতে অ্যাক্সেস ফাংশন ব্যবহার করা হলে, #১ ইমপ্লিমেন্টেশনের মাধ্যমে এবং #২ কম্পাইলার সমস্যার মাধ্যমে নিশ্চিত করা হয়। এইসব কারণে, আমরা যেখানেই সম্ভব configstore-utils ব্যবহার করার জন্য
সাজেস্ট করি।