Bạn có thể tái cấu trúc mã đã biên dịch có điều kiện để đọc một cách linh động các giá trị từ giao diện HAL. Ví dụ:
#ifdef TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS // some code fragment #endif
Sau đó, mã khung có thể gọi một hàm hiệu dụng thích hợp được xác định trong
<configstore/Utils.h>
tuỳ thuộc vào loại.
Ví dụ về ConfigStore
Ví dụ này chỉ cho phép đọc
TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS
, được xác định trong lớp trừu tượng phần cứng (HAL) ConfigStore
dưới dạng forceHwcForVirtualDisplays()
với loại dữ liệu trả về
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);
Hàm hiệu dụng (getBool
trong ví dụ trên) liên hệ với
Dịch vụ configstore
để nhận tên xử lý cho proxy của
hàm giao diện, sau đó truy xuất giá trị bằng cách gọi điều khiển qua
HIDL/hwbinder.
Hàm hiệu dụng
<configstore/Utils.h>
(configstore/1.0/include/configstore/Utils.h
) cung cấp tiện ích
hàm cho từng loại dữ liệu trả về gốc, bao gồm
Optional[Bool|String|Int32|UInt32|Int64|UInt64]
, như được liệt kê
bên dưới:
Loại | Hàm (thông số mẫu bị bỏ qua) |
---|---|
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
là giá trị mặc định được trả về khi triển khai HAL
không chỉ định giá trị cho mục cấu hình. Mỗi hàm cần 2
thông số mẫu:
I
là tên lớp giao diện.Func
là con trỏ hàm thành phần của mục cấu hình.
Vì giá trị cấu hình ở chế độ chỉ đọc và không thay đổi, nên tiện ích sẽ lưu giá trị cấu hình vào bộ nhớ đệm nội bộ. Các lệnh gọi tiếp theo là phục vụ hiệu quả hơn bằng cách sử dụng giá trị được lưu vào bộ nhớ đệm trong cùng một đơn vị liên kết.
Sử dụng configstore-utils
Lớp trừu tượng phần cứng ConfigStore được thiết kế để tương thích chuyển tiếp cho phiên bản nhỏ
nâng cấp, có nghĩa là khi HAL được sửa đổi và một số mã khung
sử dụng các mặt hàng mới được giới thiệu, dịch vụ ConfigStore với trẻ vị thành niên lớn tuổi
phiên bản trong /vendor
vẫn có thể sử dụng được.
Để có khả năng tương thích chuyển tiếp, hãy đảm bảo rằng việc triển khai của bạn tuân thủ các nguyên tắc sau:
- Các mục mới sử dụng giá trị mặc định khi chỉ sử dụng dịch vụ của phiên bản cũ
có sẵn. Ví dụ:
service = V1_1::IConfig::getService(); // null if V1_0 is installed value = DEFAULT_VALUE; if(service) { value = service->v1_1API(DEFAULT_VALUE); }
- Ứng dụng sử dụng giao diện đầu tiên có chứa mục ConfigStore.
Ví dụ:
V1_1::IConfig::getService()->v1_0API(); // NOT ALLOWED V1_0::IConfig::getService()->v1_0API(); // OK
- Bạn có thể truy xuất dịch vụ của phiên bản mới cho giao diện của phiên bản cũ. Trong
ví dụ sau đây, nếu phiên bản đã cài đặt là v1_1, thì dịch vụ v1_1 phải
được trả về cho
getService()
:V1_0::IConfig::getService()->v1_0API();
Khi các hàm truy cập trong thư viện configstore-utils
được
dùng để truy cập mục ConfigStore, #1 được đảm bảo bằng việc triển khai
và số 2 được đảm bảo bởi các lỗi trình biên dịch. Vì những lý do này, chúng tôi đặc biệt
khuyên bạn nên sử dụng configstore-utils
bất cứ khi nào có thể.