Anda dapat menambahkan item ConfigStore baru (yaitu, metode antarmuka) untuk kelas antarmuka yang 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 Anda dapat menambahkan item ConfigStore terkait.
- Buat file antarmuka HAL. Versi ConfigStore adalah 1.0, jadi tentukan antarmuka ConfigStore di
hardware/interfaces/configstore/1.0. Misalnya, dihardware/interfaces/configstore/1.0/IChargerConfigs.hal: l10npackage android.hardware.configstore@1.0; interface IChargerConfigs { // TO-BE-FILLED-BELOW }; - Perbarui
Android.bpdanAndroid.mkuntuk pustaka bersama ConfigStore dan file header untuk menyertakan antarmuka baru HAL. Misalnya:
Perintah ini memperbaruihidl-gen -o hardware/interfaces/configstore/1.0/default -Lmakefile -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.configstore@1.0::IChargerConfigshidl-gen -o hardware/interfaces/configstore/1.0/default -Landroidbp -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.configstore@1.0::IChargerConfigsAndroid.bpdanAndroid.mkdihardware/interfaces/configstore/1.0. - 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.hdanChargerConfigs.cpp, dihardware/interfaces/configstore/1.0/default. - Buka file implementasi
.hdan.cppdan hapus kode yang terkait dengan nama fungsiHIDL_FETCH_ name(misalnya,HIDL_FETCH_IChargerConfigs). Fungsi ini diperlukan untuk mode passthrough HIDL, yang tidak digunakan oleh ConfigStore. - 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 } - Ubah file
Android.mkuntuk menambahkan file implementasi (modulename Configs.cpp) keLOCAL_SRC_FILESdan untuk memetakan flag build ke dalam definisi makro. Misalnya, dihardware/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
- (Opsional) Tambahkan entri manifes. Jika tidak ada, default ke nama instance "default" dari 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> - Tambahkan aturan sepolicy jika diperlukan (yaitu, jika klien tidak memiliki izin untuk membuat panggilan hwbinder ke
hal_configstore). Misalnya, disystem/sepolicy/private/healthd.te: l10n... // other rules binder_call(healthd, hal_configstore)
Menambahkan item ConfigStore baru
Untuk menambahkan item ConfigStore baru:
- Buka file HAL dan tambahkan metode antarmuka yang diperlukan untuk item tersebut. (File .hal untuk
.halberada dihardware/interfaces/configstore/1.0.) Misalnya, dihardware/interfaces/configstore/1.0/IChargerConfigs.hal: l10npackage android.hardware.configstore@1.0; interface IChargerConfigs { ... // Other interfaces disableInitBlank() generates(OptionalBool value); }; - Terapkan metode dalam file implementasi HAL antarmuka yang sesuai (
.hdan.cpp). Tempatkan implementasi default dihardware/interfaces/configstore/1.0/default. Misalnya, dihardware/interfaces/configstore/1.0/default/ChargerConfigs.h: l10nstruct ChargerConfigs : public IChargerConfigs { ... // Other interfaces Return<void> disableInitBlank(disableInitBlank_cb _hidl_cb) override; };Dan dihardware/interfaces/configstore/1.0/default/ChargerConfigs.cpp: l10nReturn<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:
- Sertakan file header yang diperlukan. Misalnya, di
system/core/healthd/healthd.cpp: l10n#include <android/hardware/configstore/1.0/IChargerConfigs.h> #include <configstore/Utils.h>
- Akses item ConfigStore menggunakan fungsi template yang sesuai di
android.hardware.configstore-utils. Misalnya, disystem/core/healthd/healthd.cpp: l10nusing namespace android::hardware::configstore; using namespace android::hardware::configstore::V1_0; static int64_t disableInitBlank = getBool< IChargerConfigs, &IChargerConfigs::disableInitBlank>(false);Dalam contoh ini, itemdisableInitBlankdiambil dan disimpan ke variabel (berguna saat variabel perlu diakses beberapa kali). Nilai yang diambil dari ConfigStore di-cache di dalam fungsi template yang dipakai sehingga dapat diambil dengan cepat dari nilai yang di-cache tanpa menghubungi layanan ConfigStore untuk panggilan selanjutnya ke fungsi template yang dipakai. - Tambahkan dependensi pada ConfigStore dan
configstore-utilsdiAndroid.mkatauAndroid.bp. Misalnya, disystem/core/healthd/Android.mk:LOCAL_SHARED_LIBRARIES := \ android.hardware.configstore@1.0 \ android.hardware.configstore-utils \ ... (other libraries) \