میتوانید کد کامپایلشده مشروط را بازسازی کنید تا مقادیر را بهطور پویا از میانای 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 استفاده کرد.
برای سازگاری رو به جلو، مطمئن شوید که پیادهسازی شما از رهنمودهای زیر پیروی میکند:
- وقتی فقط سرویس نسخه قدیمی دردسترس باشد،
عناصر جدید از مقدار پیشفرض استفاده میکنند. مثال:
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-utils برای دسترسی به عنصر ConfigStore استفاده میشود،
#۱ با پیادهسازی تضمین میشود و
#۲ با خطاهای کامپایلر تضمین میشود. به این دلایل، اکیداً توصیه میکنیم
هرجا ممکن است از configstore-utils استفاده کنید.