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

Bạn có thể cấu trúc lại mã được biên dịch có điều kiện để đọc các giá trị một cách linh hoạt 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 tiện ích thích hợp được xác định trong <configstore/Utils.h> tùy thuộc vào loại của nó.

Ví dụ về ConfigStore

Ví dụ này hiển thị cách đọc TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS , được xác định trong ConfigStore HAL là forceHwcForVirtualDisplays() với kiể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 tiện ích ( getBool trong ví dụ trên) liên hệ với dịch vụ configstore để lấy phần xử lý cho proxy của hàm giao diện, sau đó lấy giá trị bằng cách gọi phần xử lý thông qua HIDL/hwbinder.

Các chức năng tiện ích

<configstore/Utils.h> ( configstore/1.0/include/configstore/Utils.h ) cung cấp các hàm tiện ích cho từng kiểu trả về nguyên thủy, bao gồm Optional[Bool|String|Int32|UInt32|Int64|UInt64] , như được liệt kê bên dưới:

Kiểu Chức năng (tham 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ó 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ế độ chỉ đọc và không thay đổi nên chức năng tiện ích sẽ lưu trữ giá trị cấu hình bên trong. Các cuộc 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 trong bộ nhớ đệm trong cùng một đơn vị liên kết.

Sử dụng configstore-utils

ConfigStore HAL được thiết kế để tương thích về phía trước cho các 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, dịch vụ ConfigStore với 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 về sau, 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:

  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. Máy khách sử dụng giao diện đầu tiên bao gồm mục ConfigStore. Ví dụ:
    V1_1::IConfig::getService()->v1_0API(); // NOT ALLOWED
    
    V1_0::IConfig::getService()->v1_0API(); // OK
    
  3. Dịch vụ của phiên bản mới có thể được truy xuất 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 sử dụng để truy cập mục ConfigStore, #1 được đảm bảo bằng quá trình triển khai và #2 được đảm bảo bởi lỗi trình biên dịch. Vì những lý do này, chúng tôi thực sự khuyên bạn nên sử dụng configstore-utils bất cứ khi nào có thể.