Bạn có thể thêm các mục ConfigStore mới (tức là các phương thức giao diện) cho
lớp giao diện hiện có. Nếu lớp giao diện không đượ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ục cấu hình disableInitBlank
cho
Đang thêm healthd
vào 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 bạn phải thêm lớp giao diện trước khi có thể thêm lớp giao diện Các mục ConfigStore.
- Tạo tệp giao diện HAL. Phiên bản ConfigStore là 1.0, vì vậy, hãy xác định
Giao diện ConfigStore trong
hardware/interfaces/configstore/1.0
. Cho 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.bp
vàAndroid.mk
cho Thư viện chia sẻ ConfigStore và các tệp tiêu đề để bao gồm HAL giao diện mới. Ví dụ: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
vàAndroid.mk
sauhardware/interfaces/configstore/1.0
. - Tạo mã giả lập C++ để triển khai mã máy chủ. Ví dụ:
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
Lệnh này tạo hai tệp làChargerConfigs.h
vàChargerConfigs.cpp
, inchhardware/interfaces/configstore/1.0/default
. - Mở các tệp triển khai
.h
và.cpp
rồi xoá mã liên quan đến hàmHIDL_FETCH_name
(cho ví dụ:HIDL_FETCH_IChargerConfigs
). Hàm này cần cho Chế độ truyền qua HIDL không được ConfigStore sử dụng. - Đăng ký phương thứ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
) đếnLOCAL_SRC_FILES
và ánh xạ cờ bản dựng thành các đị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ột mục kê khai. Nếu mã này không tồn tại, hãy đặt giá trị mặc định là
"mặc định" tên thực thể 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 (nghĩa là nếu khách hàng không có
để thực hiện lệnh gọi hwbinder đến
hal_configstore
). Cho ví dụ: trongsystem/sepolicy/private/healthd.te
:... // other rules binder_call(healthd, hal_configstore)
Thêm các mục ConfigStore mới
Cách thêm một 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
.hal
tệp cho 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 (Lớp trừu tượng phần cứng) của giao diện tương ứng
(
.h
và.cpp
). Đặt các phương thức triển khai mặc định tronghardware/interfaces/configstore/1.0/default
. Ví dụ: tronghardware/interfaces/configstore/1.0/default/ChargerConfigs.h
:struct ChargerConfigs : public IChargerConfigs { ... // Other interfaces Return<void> disableInitBlank(disableInitBlank_cb _hidl_cb) override; };
Và tronghardware/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ột mặt hàng trong ConfigStore:
- Bao gồm các tệp tiêu đề bắt buộc. Ví dụ: trong
system/core/healthd/healthd.cpp
:#include <android/hardware/configstore/1.0/IChargerConfigs.h> #include <configstore/Utils.h>
- Truy cập mục ConfigStore bằng cách sử dụng hàm mẫu thích hợp trong
android.hardware.configstore-utils
. Ví dụ: trongsystem/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);
Trong ví dụ này, mục ConfigStoredisableInitBlank
được truy xuất và được lưu trữ vào biến (hữu ích khi biến cần được truy cập nhiều lần). Giá trị truy xuất từ ConfigStore được lưu vào bộ nhớ đệm trong hàm mẫu được tạo thực thể để có thể nhanh chóng truy xuất hàm đó từ đã 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 được tạo thực thể. - Thêm phần phụ thuộc trên ConfigStore và
configstore-utils
thư viện trongAndroid.mk
hoặcAndroid.bp
. Ví dụ: trongsystem/core/healthd/Android.mk
:LOCAL_SHARED_LIBRARIES := \ android.hardware.configstore@1.0 \ android.hardware.configstore-utils \ ... (other libraries) \