استفاده از سمت مشتری

می توانید کدهای کامپایل شده مشروط را برای خواندن پویا مقادیر از رابط 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 استفاده می شود، شماره 1 توسط پیاده سازی و شماره 2 با خطاهای کامپایلر تضمین می شود. به این دلایل، ما قویاً توصیه می‌کنیم تا جایی که ممکن است از configstore-utils استفاده کنید.