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 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:

  1. 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);
      }
    
  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 đâ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ể.