Menambahkan Kelas dan Item ConfigStore

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

Menambahkan kelas antarmuka

Jika tidak ada kelas antarmuka yang ditentukan untuk metode antarmuka yang ingin Anda tambahkan, Anda harus menambahkan kelas antarmuka sebelum dapat menambahkan item ConfigStore terkait.

  1. Buat file antarmuka HAL. Versi ConfigStore adalah 1.0, jadi tentukan antarmuka ConfigStore di hardware/interfaces/configstore/1.0 . Misalnya, di hardware/interfaces/configstore/1.0/IChargerConfigs.hal :
    package android.hardware.configstore@1.0;
    
    interface IChargerConfigs {
        // TO-BE-FILLED-BELOW
    };
    
  2. Perbarui Android.bp dan Android.mk untuk pustaka bersama ConfigStore dan file header agar menyertakan antarmuka baru HAL. Misalnya:
    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. Hasilkan rintisan C++ untuk mengimplementasikan kode server. Misalnya:
    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 membuat dua file, ChargerConfigs.h dan ChargerConfigs.cpp , di hardware/interfaces/configstore/1.0/default .
  4. Buka file implementasi .h dan .cpp dan hapus kode yang terkait dengan HIDL_FETCH_ name (misalnya, HIDL_FETCH_IChargerConfigs ). Fungsi ini diperlukan untuk mode passthrough HIDL, yang tidak digunakan oleh ConfigStore.
  5. Daftarkan penerapannya 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 implementasi ( modulename Configs.cpp ) ke LOCAL_SRC_FILES dan memetakan flag build ke dalam 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 nama instance "default" ConfigStore secara default. 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 ). Misalnya, di 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. (File .hal 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. Terapkan metode dalam file implementasi HAL antarmuka yang sesuai ( .h dan .cpp ). Tempatkan implementasi default 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 di 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. Akses item ConfigStore menggunakan fungsi template yang sesuai di android.hardware.configstore-utils . Misalnya, dalam 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 variabel (berguna ketika variabel perlu diakses beberapa kali). Nilai yang diambil dari ConfigStore disimpan dalam cache di dalam fungsi templat yang dipakai sehingga dapat diambil dengan cepat dari nilai yang disimpan dalam cache tanpa menghubungi layanan ConfigStore untuk panggilan selanjutnya ke fungsi templat yang dipakai.
  3. Tambahkan ketergantungan pada ConfigStore dan perpustakaan configstore-utils 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) \