استفاده سمت کارخواه

می‌توانید کد کامپایل‌شده مشروط را بازسازی کنید تا مقادیر را به‌طور پویا از میانای 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 اصلاح می‌شود و برخی‌از کدهای چارچوب از موارد جدیداً معرفی‌شده استفاده می‌کنند، همچنان می‌توان از سرویس ConfigStore با نسخه جزئی قدیمی‌تر در /vendor استفاده کرد.

برای سازگاری رو به جلو، مطمئن شوید که پیاده‌سازی شما از رهنمودهای زیر پیروی می‌کند:

  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 باشد، سرویس v1_1 باید برای getService() برگردانده شود:
    V1_0::IConfig::getService()->v1_0API();
    

وقتی از توابع دسترسی در کتابخانه configstore-utils برای دسترسی به عنصر ConfigStore استفاده می‌شود، ‫#۱ با پیاده‌سازی تضمین می‌شود و ‫ #۲ با خطاهای کامپایلر تضمین می‌شود. به این دلایل، اکیداً توصیه می‌کنیم هرجا ممکن است از configstore-utils استفاده کنید.