ক্লায়েন্ট-সাইড ব্যবহার

আপনি শর্তসাপেক্ষে কম্পাইল করা কোড রিফ্যাক্টর করে HAL ইন্টারফেস থেকে ডায়নামিকভাবে মান পড়তে পারেন। উদাহরণস্বরূপ:

#ifdef TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS
// some code fragment
#endif

এরপর ফ্রেমওয়ার্ক কোড তার প্রকারভেদের ওপর নির্ভর করে <configstore/Utils.h> এ সংজ্ঞায়িত একটি উপযুক্ত ইউটিলিটি ফাংশন কল করতে পারে।

ConfigStore উদাহরণ

এই উদাহরণটি TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS পড়া দেখাচ্ছে, যা ConfigStore HAL-এ 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)

defValue হলো একটি ডিফল্ট মান যা তখন ফেরত আসে যখন HAL ইমপ্লিমেন্টেশন কনফিগারেশন আইটেমটির জন্য কোনো মান নির্দিষ্ট করে না। প্রতিটি ফাংশন দুটি টেমপ্লেট প্যারামিটার গ্রহণ করে:

  • I হলো ইন্টারফেস ক্লাসের নাম।
  • Func হলো কনফিগারেশন আইটেমটি পাওয়ার জন্য ব্যবহৃত মেম্বার ফাংশন পয়েন্টার।

যেহেতু কনফিগারেশন মানটি পঠনযোগ্য এবং পরিবর্তন হয় না, তাই ইউটিলিটি ফাংশনটি অভ্যন্তরীণভাবে কনফিগারেশন মানটি ক্যাশ করে রাখে। একই লিঙ্কিং ইউনিটে ক্যাশ করা মানটি ব্যবহার করে পরবর্তী কলগুলো আরও দক্ষতার সাথে সম্পন্ন করা হয়।

configstore-utils ব্যবহার করুন

ConfigStore HAL-কে মাইনর ভার্সন আপগ্রেডের জন্য ফরোয়ার্ড কম্প্যাটিবল করে ডিজাইন করা হয়েছে, যার অর্থ হলো, যখন HAL-টি সংশোধিত হয় এবং কিছু ফ্রেমওয়ার্ক কোড নতুন সংযোজিত আইটেমগুলো ব্যবহার করে, তখনও /vendor এ থাকা পুরোনো মাইনর ভার্সনের ConfigStore সার্ভিসটি ব্যবহার করা যাবে।

ভবিষ্যৎ সামঞ্জস্যতার জন্য, নিশ্চিত করুন যে আপনার বাস্তবায়ন নিম্নলিখিত নির্দেশিকাগুলো মেনে চলে:

  1. যখন শুধুমাত্র পুরানো সংস্করণের পরিষেবা উপলব্ধ থাকে, তখন নতুন আইটেমগুলি ডিফল্ট মান ব্যবহার করে। উদাহরণ:
    service = V1_1::IConfig::getService(); // null if V1_0 is installed
    value = DEFAULT_VALUE;
      if(service) {
        value = service->v1_1API(DEFAULT_VALUE);
      }
    
  2. ক্লায়েন্ট সেই প্রথম ইন্টারফেসটি ব্যবহার করে যেটিতে ConfigStore আইটেমটি অন্তর্ভুক্ত ছিল। উদাহরণ:
    V1_1::IConfig::getService()->v1_0API(); // NOT ALLOWED
    
    V1_0::IConfig::getService()->v1_0API(); // OK
    
  3. পুরানো সংস্করণের ইন্টারফেসের জন্য নতুন সংস্করণের সার্ভিসটি পাওয়া যেতে পারে। নিম্নলিখিত উদাহরণে, যদি ইনস্টল করা সংস্করণটি v1_1 হয়, তাহলে getService() এর জন্য অবশ্যই v1_1 সার্ভিসটি রিটার্ন করতে হবে:
    V1_0::IConfig::getService()->v1_0API();
    

যখন ConfigStore আইটেম অ্যাক্সেস করার জন্য configstore-utils লাইব্রেরির অ্যাক্সেস ফাংশনগুলো ব্যবহার করা হয়, তখন #1 ইমপ্লিমেন্টেশন দ্বারা নিশ্চিত করা হয় এবং #2 কম্পাইলার এরর দ্বারা নিশ্চিত করা হয়। এইসব কারণে, আমরা যেখানেই সম্ভব configstore-utils ব্যবহার করার জন্য দৃঢ়ভাবে সুপারিশ করি।