Menambahkan class dan item ConfigStore

Anda dapat menambahkan item ConfigStore baru (yaitu, metode antarmuka) untuk class antarmuka yang sudah ada. Jika kelas antarmuka tidak didefinisikan, Anda harus menambahkan class baru sebelum Anda dapat menambahkan item ConfigStore untuk class tersebut. Bagian ini menggunakan contoh item konfigurasi disableInitBlank untuk healthd sedang ditambahkan ke antarmuka IChargerConfigs .

Menambahkan class antarmuka

Jika tidak ada class antarmuka yang ditentukan untuk metode antarmuka yang ingin Anda Anda harus menambahkan kelas antarmuka sebelum dapat menambahkan Item ConfigStore.

  1. Buat file antarmuka HAL. Versi ConfigStore adalah 1.0, jadi tentukan Antarmuka ConfigStore di hardware/interfaces/configstore/1.0. Sebagai misalnya, di hardware/interfaces/configstore/1.0/IChargerConfigs.hal:
    package android.hardware.configstore@1.0;
    
    interface IChargerConfigs {
        // TO-BE-FILLED-BELOW
    };
    
  2. Update Android.bp dan Android.mk untuk Library bersama dan file header ConfigStore untuk menyertakan HAL antarmuka baru. Contoh:
    hidl-gen -o hardware/interfaces/configstore/1.0/default -Lmakefile -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.configstore@1.0::IChargerConfigs
    hidl-gen -o hardware/interfaces/configstore/1.0/default -Landroidbp -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.configstore@1.0::IChargerConfigs
    
    Perintah ini memperbarui Android.bp dan Android.mk di hardware/interfaces/configstore/1.0.
  3. Buat stub C++ untuk mengimplementasikan kode server. Contoh:
    hidl-gen -o hardware/interfaces/configstore/1.0/default -Lc++-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.configstore@1.0::IChargerConfigs
    
    Perintah ini akan membuat dua file, ChargerConfigs.h dan ChargerConfigs.cpp, inci hardware/interfaces/configstore/1.0/default.
  4. Buka file implementasi .h dan .cpp, lalu hapus kode yang terkait dengan fungsi HIDL_FETCH_name (untuk contoh, HIDL_FETCH_IChargerConfigs). Fungsi ini diperlukan untuk Mode passthrough HIDL, yang tidak digunakan oleh ConfigStore.
  5. Daftarkan implementasi ke layanan ConfigStore. Misalnya, di hardware/interfaces/configstore/1.0/default/service.cpp:
    #include <android/hardware/configstore/1.0/IChargerConfigs.h>
    #include "ChargerConfigs.h"
    
    using android::hardware::configstore::V1_0::IChargerConfigs;
    using android::hardware::configstore::V1_0::implementation::ChargerConfigs;
    
    int main() {
        ... // other code
        sp<IChargerConfigs> chargerConfigs = new ChargerConfigs;
        status = chargerConfigs->registerAsService();
        LOG_ALWAYS_FATAL_IF(status != OK, "Could not register IChargerConfigs");
        ... // other code
    }
    
  6. Ubah file Android.mk untuk menambahkan file penerapan (modulenameConfigs.cpp) ke LOCAL_SRC_FILES dan untuk memetakan flag build menjadi definisi makro. Misalnya, di hardware/interfaces/configstore/1.0/default/Android.mk:
    LOCAL_SRC_FILES += ChargerConfigs.cpp
    
    ifeq ($(strip $(BOARD_CHARGER_DISABLE_INIT_BLANK)),true)
    LOCAL_CFLAGS += -DCHARGER_DISABLE_INIT_BLANK
    endif
    
  7. (Opsional) Tambahkan entri manifes. Jika tidak ada, gunakan nilai default "default" nama instance ConfigStore. Misalnya, di device/google/marlin/manifest.xml:
        <hal format="hidl">
            <name>android.hardware.configstore</name>
            ...
            <interface>
                <name>IChargerConfigs</name>
                <instance>default</instance>
            </interface>
        </hal>
    
  8. Tambahkan aturan sepolicy jika diperlukan (yaitu, jika klien tidak memiliki izin untuk melakukan panggilan hwbinder ke hal_configstore). Sebagai misalnya, dalam system/sepolicy/private/healthd.te:
    ... // other rules
    binder_call(healthd, hal_configstore)
    

Menambahkan item ConfigStore baru

Untuk menambahkan item ConfigStore baru:

  1. Buka file HAL dan tambahkan metode antarmuka yang diperlukan untuk item tersebut. ( .hal file untuk ConfigStore berada di hardware/interfaces/configstore/1.0.) Misalnya, di hardware/interfaces/configstore/1.0/IChargerConfigs.hal:
    package android.hardware.configstore@1.0;
    
    interface IChargerConfigs {
        ... // Other interfaces
        disableInitBlank() generates(OptionalBool value);
    };
    
  2. Implementasikan metode ini dalam file implementasi HAL antarmuka yang sesuai (.h dan .cpp). Tempatkan implementasi {i>default<i} di hardware/interfaces/configstore/1.0/default. Misalnya, di hardware/interfaces/configstore/1.0/default/ChargerConfigs.h:
    struct ChargerConfigs : public IChargerConfigs {
        ... // Other interfaces
        Return<void> disableInitBlank(disableInitBlank_cb _hidl_cb) override;
    };
    
    Dan masuk hardware/interfaces/configstore/1.0/default/ChargerConfigs.cpp:
    Return<void> ChargerConfigs::disableInitBlank(disableInitBlank_cb _hidl_cb) {
        bool value = false;
    #ifdef CHARGER_DISABLE_INIT_BLANK
        value = true;
    #endif
        _hidl_cb({true, value});
        return Void();
    }
    

Menggunakan item ConfigStore

Untuk menggunakan item ConfigStore:

  1. Sertakan file header yang diperlukan. Misalnya, di system/core/healthd/healthd.cpp:
    #include <android/hardware/configstore/1.0/IChargerConfigs.h>
    #include <configstore/Utils.h>
    
  2. Mengakses item ConfigStore menggunakan fungsi template yang sesuai di android.hardware.configstore-utils. Misalnya, di system/core/healthd/healthd.cpp:
    using namespace android::hardware::configstore;
    using namespace android::hardware::configstore::V1_0;
    
    static int64_t disableInitBlank = getBool<
            IChargerConfigs,
            &IChargerConfigs::disableInitBlank>(false);
    
    Dalam contoh ini, item ConfigStore disableInitBlank diambil dan disimpan ke suatu variabel (berguna ketika variabel perlu diakses beberapa kali). Nilai yang diambil dari ConfigStore di-cache di dalam membuat instance fungsi template agar dapat diambil dengan cepat dari nilai yang di-cache tanpa menghubungi layanan ConfigStore untuk panggilan berikutnya ke fungsi template yang dibuat instance.
  3. Menambahkan dependensi pada ConfigStore dan configstore-utils library di Android.mk atau Android.bp. Misalnya, di system/core/healthd/Android.mk:
    LOCAL_SHARED_LIBRARIES := \
        android.hardware.configstore@1.0 \
        android.hardware.configstore-utils \
        ... (other libraries) \