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 ConfigStore HAL là forceHwcForVirtualDisplays() với loại dữ liệu trả về là 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 tiện ích (getBool trong ví dụ trên) liên hệ với dịch vụ configstore để lấy handle cho proxy của hàm giao diện, sau đó truy xuất giá trị bằng cách gọi handle thông 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 tiện ích cho từng loại dữ liệu trả về gốc, bao gồm cả 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 quá trình triển khai HAL không chỉ định giá trị cho mục cấu hình. Mỗi hàm nhận hai tham số mẫu:

  • I là tên lớp giao diện.
  • Func là con trỏ hàm thành viên để lấy mục cấu hình.

Vì giá trị cấu hình chỉ có thể đọc và không thay đổi, nên hàm 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 đượ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 cho các bản nâng cấp phiên bản 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, bạn vẫn có thể sử dụng dịch vụ ConfigStore có phiên bản nhỏ cũ hơn trong /vendor.

Để có khả năng tương thích chuyển tiếp, hãy đảm bảo việc 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ì 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, 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ể.