Penggunaan Sisi Klien

Anda dapat memfaktorkan ulang kode yang dikompilasi secara kondisional untuk membaca nilai secara dinamis dari antarmuka HAL. Misalnya:

#ifdef TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS
// some code fragment
#endif

Kode kerangka kerja kemudian dapat memanggil fungsi utilitas yang sesuai yang ditentukan dalam <configstore/Utils.h> tergantung pada tipenya.

Contoh ConfigStore

Contoh ini menunjukkan pembacaan TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS , yang didefinisikan di ConfigStore HAL sebagai forceHwcForVirtualDisplays() dengan tipe kembalian 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);

Fungsi utilitas ( getBool pada contoh di atas) menghubungi layanan configstore untuk mendapatkan pegangan untuk proxy fungsi antarmuka, kemudian mengambil nilainya dengan memanggil pegangan melalui HIDL/hwbinder.

Fungsi utilitas

<configstore/Utils.h> ( configstore/1.0/include/configstore/Utils.h ) menyediakan fungsi utilitas untuk setiap tipe pengembalian primitif, termasuk Optional[Bool|String|Int32|UInt32|Int64|UInt64] , seperti yang tercantum di bawah ini:

Jenis Fungsi (parameter template dihilangkan)
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 adalah nilai default yang dikembalikan ketika implementasi HAL tidak menentukan nilai untuk item konfigurasi. Setiap fungsi membutuhkan dua parameter templat:

  • I adalah nama kelas antarmuka.
  • Func adalah penunjuk fungsi anggota untuk mendapatkan item konfigurasi.

Karena nilai konfigurasi bersifat baca-saja dan tidak berubah, fungsi utilitas secara internal menyimpan nilai konfigurasi dalam cache. Panggilan berikutnya dilayani lebih efisien menggunakan nilai cache di unit penghubung yang sama.

Menggunakan configstore-utils

ConfigStore HAL dirancang agar kompatibel untuk peningkatan versi minor, artinya ketika HAL direvisi dan beberapa kode kerangka kerja menggunakan item yang baru diperkenalkan, layanan ConfigStore dengan versi minor yang lebih lama di /vendor masih dapat digunakan.

Untuk kompatibilitas ke depan, pastikan penerapan Anda mematuhi pedoman berikut:

  1. Item baru menggunakan nilai default ketika hanya layanan versi lama yang tersedia. Contoh:
    service = V1_1::IConfig::getService(); // null if V1_0 is installed
    value = DEFAULT_VALUE;
      if(service) {
        value = service->v1_1API(DEFAULT_VALUE);
      }
    
  2. Klien menggunakan antarmuka pertama yang menyertakan item ConfigStore. Contoh:
    V1_1::IConfig::getService()->v1_0API(); // NOT ALLOWED
    
    V1_0::IConfig::getService()->v1_0API(); // OK
    
  3. Layanan versi baru dapat diambil untuk antarmuka versi lama. Dalam contoh berikut, jika versi yang diinstal adalah v1_1, layanan v1_1 harus dikembalikan untuk getService() :
    V1_0::IConfig::getService()->v1_0API();
    

Ketika fungsi akses di perpustakaan configstore-utils digunakan untuk mengakses item ConfigStore, #1 dijamin oleh implementasi dan #2 dijamin oleh kesalahan kompiler. Karena alasan ini, kami sangat menyarankan penggunaan configstore-utils jika memungkinkan.