Sử dụng phía máy khách

Bạn có thể tái cấu trúc mã đã biên dịch có điều kiện để đọc các giá trị một cách linh động 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 hàm đó.

Ví dụ về ConfigStore

Ví dụ này cho thấy việc đọc TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS, được xác định trong HAL ConfigStore là 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) sẽ liên hệ với dịch vụ configstore để lấy tên người dùng cho proxy của hàm giao diện, sau đó truy xuất giá trị bằng cách gọi trình đ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 các hàm hiệu dụng cho từng kiểu dữ liệu trả về gốc, bao gồm cả Optional[Bool|String|Int32|UInt32|Int64|UInt64], như liệt kê dưới đây:

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 quá trình triển khai HAL không chỉ định giá trị cho mục cấu hình. Mỗi hàm sẽ nhậ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 để lấy mục cấu hình.

Vì giá trị cấu hình ở chế độ chỉ đọc và không thay đổi, nên hàm hiệu dụng sẽ lưu trong bộ nhớ đệm giá trị cấu hình. Các lệnh gọi tiếp theo được 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

HAL ConfigStore được thiết kế để tương thích chuyển tiếp với các bản nâng cấp nhỏ, nghĩa là khi HAL được sửa đổi và một số mã khung sử dụng các mục mới được giới thiệu, dịch vụ ConfigStore có phiên bản nhỏ cũ hơn trong /vendor vẫn có thể được sử dụng.

Để có khả năng tương thích chuyển tiếp, hãy đảm bảo quá trình triển khai của bạn tuân thủ các nguyên tắc sau:

  1. Các mục mới sử dụng giá trị mặc định khi chỉ có dịch vụ của phiên bản cũ. Ví dụ:
    service = V1_1::IConfig::getService(); // null if V1_0 is installed
    value = DEFAULT_VALUE;
      if(service) {
        value = service->v1_1API(DEFAULT_VALUE);
      }
    
  2. Ứ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
    
  3. 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, nếu phiên bản đã cài đặt là v1_1, thì bạn phải trả về dịch vụ v1_1 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, số 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, bạn nên sử dụng configstore-utils bất cứ khi nào có thể.