Bạn có thể thêm các mục ConfigStore mới (tức là phương thức giao diện) cho một lớp giao diện hiện có. Nếu lớp giao diện chưa được xác định, bạn phải thêm một lớp mới trước khi có thể thêm mục ConfigStore cho lớp đó. Phần này sử dụng ví dụ về một mục cấu hình disableInitBlank cho healthd được thêm vào lớp giao diện IChargerConfigs.
Thêm lớp giao diện
Nếu không có lớp giao diện nào được xác định cho phương thức giao diện mà bạn muốn thêm, thì bạn phải thêm lớp giao diện trước khi có thể thêm các mục ConfigStore được liên kết.
- Tạo tệp giao diện HAL. Phiên bản ConfigStore là 1.0, vì vậy, hãy xác định các giao diện ConfigStore trong
hardware/interfaces/configstore/1.0. Ví dụ: tronghardware/interfaces/configstore/1.0/IChargerConfigs.hal:package android.hardware.configstore@1.0; interface IChargerConfigs { // TO-BE-FILLED-BELOW }; - Cập nhật
Android.bpvàAndroid.mkcho thư viện dùng chung ConfigStore và các tệp tiêu đề để đưa HAL giao diện mới vào. Ví dụ: Các lệnh này cập nhậthidl-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.bpvàAndroid.mktronghardware/interfaces/configstore/1.0. - Tạo mã giả lập C++ để triển khai mã máy chủ. Ví dụ:
Lệnh này tạo 2 tệp là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
ChargerConfigs.hvàChargerConfigs.cpptronghardware/interfaces/configstore/1.0/default. - Mở tệp triển khai
.hvà.cpp, rồi xoá mã liên quan đến hàmHIDL_FETCH_name(ví dụ:HIDL_FETCH_IChargerConfigs). Hàm này là cần thiết cho chế độ truyền trực tiếp HIDL mà ConfigStore không sử dụng. - Đăng ký việc triển khai cho dịch vụ ConfigStore. Ví dụ: trong
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 } - Sửa đổi tệp
Android.mkđể thêm tệp triển khai (modulenameConfigs.cpp) vàoLOCAL_SRC_FILESvà để ánh xạ các cờ bản dựng vào định nghĩa macro. Ví dụ: tronghardware/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
- (Không bắt buộc) Thêm mục nhập tệp kê khai. Nếu không tồn tại, hãy đặt tên thực thể mặc định là "default" của ConfigStore. Ví dụ: trong
device/google/marlin/manifest.xml:<hal format="hidl"> <name>android.hardware.configstore</name> ... <interface> <name>IChargerConfigs</name> <instance>default</instance> </interface> </hal> - Thêm quy tắc sepolicy nếu cần (tức là nếu ứng dụng không có quyền thực hiện lệnh gọi hwbinder đến
hal_configstore). Ví dụ: trongsystem/sepolicy/private/healthd.te:... // other rules binder_call(healthd, hal_configstore)
Thêm mục ConfigStore mới
Cách thêm mục ConfigStore mới:
- Mở tệp HAL và thêm phương thức giao diện bắt buộc cho mục đó. (Các tệp
.halcho ConfigStore nằm tronghardware/interfaces/configstore/1.0.) Ví dụ: tronghardware/interfaces/configstore/1.0/IChargerConfigs.hal:package android.hardware.configstore@1.0; interface IChargerConfigs { ... // Other interfaces disableInitBlank() generates(OptionalBool value); }; - Triển khai phương thức trong các tệp triển khai HAL giao diện tương ứng (
.hvà.cpp). Đặt các cách triển khai mặc định tronghardware/interfaces/configstore/1.0/default. Ví dụ: tronghardware/interfaces/configstore/1.0/default/ChargerConfigs.h: Và trongstruct ChargerConfigs : public IChargerConfigs { ... // Other interfaces Return<void> disableInitBlank(disableInitBlank_cb _hidl_cb) override; };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(); }
Sử dụng các mục ConfigStore
Cách sử dụng mục ConfigStore:
- Đưa các tệp tiêu đề bắt buộc vào. Ví dụ: trong
system/core/healthd/healthd.cpp:#include <android/hardware/configstore/1.0/IChargerConfigs.h> #include <configstore/Utils.h>
- Truy cập vào mục ConfigStore bằng hàm mẫu thích hợp trong
android.hardware.configstore-utils. Ví dụ: trongsystem/core/healthd/healthd.cpp: Trong ví dụ này, mục ConfigStoreusing namespace android::hardware::configstore; using namespace android::hardware::configstore::V1_0; static int64_t disableInitBlank = getBool< IChargerConfigs, &IChargerConfigs::disableInitBlank>(false);disableInitBlankđược truy xuất và lưu trữ vào một biến (hữu ích khi cần truy cập vào biến nhiều lần). Giá trị được truy xuất từ ConfigStore được lưu vào bộ nhớ đệm bên trong hàm mẫu đã khởi tạo để có thể truy xuất nhanh từ giá trị được lưu vào bộ nhớ đệm mà không cần liên hệ với dịch vụ ConfigStore cho các lệnh gọi sau này đến hàm mẫu đã khởi tạo. - Thêm phần phụ thuộc vào ConfigStore và thư viện
configstore-utilstrongAndroid.mkhoặcAndroid.bp. Ví dụ: trongsystem/core/healthd/Android.mk:LOCAL_SHARED_LIBRARIES := \ android.hardware.configstore@1.0 \ android.hardware.configstore-utils \ ... (other libraries) \