Anda dapat menambahkan item ConfigStore baru (yaitu, metode antarmuka) untuk class antarmuka yang ada. Jika class antarmuka tidak ditentukan, Anda harus menambahkan
class baru sebelum dapat menambahkan item ConfigStore untuk class tersebut. Bagian ini
menggunakan contoh item konfigurasi disableInitBlank
untuk
healthd
yang ditambahkan ke class antarmuka
IChargerConfigs
.
Menambahkan class antarmuka
Jika tidak ada class antarmuka yang ditentukan untuk metode antarmuka yang ingin Anda tambahkan, Anda harus menambahkan class antarmuka sebelum dapat menambahkan item ConfigStore yang terkait.
- Buat file antarmuka HAL. Versi ConfigStore adalah 1.0. Jadi, tentukan antarmuka ConfigStore di
hardware/interfaces/configstore/1.0
. Misalnya, dalamhardware/interfaces/configstore/1.0/IChargerConfigs.hal
:package android.hardware.configstore@1.0; interface IChargerConfigs { // TO-BE-FILLED-BELOW };
- Update
Android.bp
danAndroid.mk
untuk library bersama dan file header ConfigStore guna menyertakan HAL antarmuka baru. 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
Android.bp
danAndroid.mk
dihardware/interfaces/configstore/1.0
. - Buat stub 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 akan membuat dua file,ChargerConfigs.h
danChargerConfigs.cpp
, dihardware/interfaces/configstore/1.0/default
. - Buka file implementasi
.h
dan.cpp
, lalu hapus kode yang terkait dengan 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, dalam
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.mk
untuk menambahkan file implementasi (modulenameConfigs.cpp
) keLOCAL_SRC_FILES
dan untuk memetakan flag build ke dalam definisi makro. Misalnya, dalamhardware/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, gunakan nama instance "default" sebagai default untuk ConfigStore. Misalnya, dalam
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, dalamsystem/sepolicy/private/healthd.te
:... // 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 ConfigStore berada dihardware/interfaces/configstore/1.0
.) Misalnya, dalamhardware/interfaces/configstore/1.0/IChargerConfigs.hal
:package android.hardware.configstore@1.0; interface IChargerConfigs { ... // Other interfaces disableInitBlank() generates(OptionalBool value); };
- Implementasikan metode ini dalam file implementasi HAL antarmuka yang sesuai
(
.h
dan.cpp
). Tempatkan implementasi default dalamhardware/interfaces/configstore/1.0/default
. Misalnya, dalamhardware/interfaces/configstore/1.0/default/ChargerConfigs.h
:struct ChargerConfigs : public IChargerConfigs { ... // Other interfaces Return<void> disableInitBlank(disableInitBlank_cb _hidl_cb) override; };
Dan dalamhardware/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:
- Sertakan file header yang diperlukan. Misalnya, dalam
system/core/healthd/healthd.cpp
:#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, dalamsystem/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 ConfigStoredisableInitBlank
diambil dan disimpan ke variabel (berguna jika variabel perlu diakses beberapa kali). Nilai yang diambil dari ConfigStore disimpan dalam cache di dalam fungsi template yang dibuat instance, sehingga nilai tersebut dapat diambil dengan cepat dari nilai yang disimpan dalam cache tanpa menghubungi layanan ConfigStore untuk panggilan berikutnya ke fungsi template yang dibuat instance. - Tambahkan dependensi pada ConfigStore dan library
configstore-utils
diAndroid.mk
atauAndroid.bp
. Misalnya, dalamsystem/core/healthd/Android.mk
:LOCAL_SHARED_LIBRARIES := \ android.hardware.configstore@1.0 \ android.hardware.configstore-utils \ ... (other libraries) \