새로운 ConfigStore 항목(인터페이스 메서드)을 기존 인터페이스 클래스에 추가할 수 있습니다. 인터페이스가 정의되지 않은 경우 먼저 새 클래스를 추가해야 ConfigStore 항목을 클래스에 추가할 수 있습니다. 이 섹션에서는 IChargerConfigs
인터페이스 클래스에 추가되는 healthd
의 disableInitBlank
구성 항목에 관한 예시를 사용합니다.
인터페이스 클래스 추가
추가하고 싶은 인터페이스 메서드에 인터페이스 클래스가 정의되지 않은 경우 먼저 인터페이스 클래스부터 추가해야 관련 ConfigStore 항목을 추가할 수 있습니다.
- HAL 인터페이스 파일을 생성합니다. ConfigStore 버전이 1.0이므로
hardware/interfaces/configstore/1.0
에서 ConfigStore 인터페이스를 정의합니다. 예를 들어hardware/interfaces/configstore/1.0/IChargerConfigs.hal
에서 다음을 실행합니다.package android.hardware.configstore@1.0; interface IChargerConfigs { // TO-BE-FILLED-BELOW };
- ConfigStore 공유 라이브러리의
Android.bp
및Android.mk
와 헤더 파일을 업데이트하여 새 인터페이스 HAL을 포함합니다. 예를 들면 다음과 같습니다. 이 명령어는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
hardware/interfaces/configstore/1.0
에서Android.bp
및Android.mk
를 업데이트합니다. - 서버 코드 구현을 위한 C++ 스텁을 생성합니다. 예를 들면 다음과 같습니다.
이 명령어는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
hardware/interfaces/configstore/1.0/default
에ChargerConfigs.h
및ChargerConfigs.cpp
의 두 파일을 만듭니다. .h
및.cpp
구현 파일을 열고 함수HIDL_FETCH_name
과 관련된 코드(예:HIDL_FETCH_IChargerConfigs
)를 삭제합니다. 이 함수는 ConfigStore에서 사용하지 않는 HIDL 패스 스루 모드에 필요합니다.- 구현을 ConfigStore 서비스에 등록합니다. 예를 들어
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 }
- 그런 다음
Android.mk
파일을 수정하여 구현 파일(modulenameConfigs.cpp
)을LOCAL_SRC_FILES
에 추가하고 빌드 플래그를 매크로 정의에 매핑합니다. 예를 들어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
- (선택사항) 매니페스트 항목을 추가합니다. 존재하지 않는 경우 ConfigStore의 '기본' 인스턴스 이름으로 되돌립니다. 예를 들어
device/google/marlin/manifest.xml
에서 다음을 실행합니다.<hal format="hidl"> <name>android.hardware.configstore</name> ... <interface> <name>IChargerConfigs</name> <instance>default</instance> </interface> </hal>
- 필요한 경우 sepolicy 규칙을 추가합니다(클라이언트에
hal_configstore
에 관한 hwbinder 호출 권한이 없는 경우). 예를 들어system/sepolicy/private/healthd.te
에서 다음과 같습니다.... // other rules binder_call(healthd, hal_configstore)
새 ConfigStore 항목 추가
새 ConfigStore 항목을 추가하는 방법:
- HAL 파일을 열고 항목의 필수 인터페이스 메서드를 추가합니다. (ConfigStore의
.hal
파일은hardware/interfaces/configstore/1.0
에 위치함) 예를 들어hardware/interfaces/configstore/1.0/IChargerConfigs.hal
에서 다음과 같습니다.package android.hardware.configstore@1.0; interface IChargerConfigs { ... // Other interfaces disableInitBlank() generates(OptionalBool value); };
- 상응하는 인터페이스 HAL 구성 파일(
.h
및.cpp
)에 메서드를 구현합니다. 기본 구현을hardware/interfaces/configstore/1.0/default
에 삽입합니다. 예를 들어hardware/interfaces/configstore/1.0/default/ChargerConfigs.h
에서 다음을 실행합니다.struct 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(); }
ConfigStore 항목 사용
ConfigStore 항목을 사용하는 방법:
- 필수 헤더 파일을 포함합니다. 예를 들어
system/core/healthd/healthd.cpp
에서 다음을 실행합니다.#include <android/hardware/configstore/1.0/IChargerConfigs.h> #include <configstore/Utils.h>
android.hardware.configstore-utils
에서 적절한 템플릿 함수를 사용하여 ConfigStore 항목에 액세스합니다. 예를 들어system/core/healthd/healthd.cpp
에서 다음을 실행합니다. 이 예에서는 ConfigStore 항목using namespace android::hardware::configstore; using namespace android::hardware::configstore::V1_0; static int64_t disableInitBlank = getBool< IChargerConfigs, &IChargerConfigs::disableInitBlank>(false);
disableInitBlank
가 검색되어 변수에 저장됩니다 (변수에 여러 번 액세스해야 하는 경우에 유용). ConfigStore에서 검색된 값은 인스턴스화된 템플릿 함수 내에서 캐시됩니다. 이는 인스턴스화된 템플릿 함수에 관한 향후 호출을 위해 ConfigStore 서비스에 접속하지 않고도 값을 캐시된 값에서 빠르게 가져올 수 있도록 하기 위함입니다.Android.mk
또는Android.bp
에서 ConfigStore 및configstore-utils
라이브러리에 관한 종속 항목을 추가합니다. 예를 들어system/core/healthd/Android.mk
에서 다음을 실행합니다.LOCAL_SHARED_LIBRARIES := \ android.hardware.configstore@1.0 \ android.hardware.configstore-utils \ ... (other libraries) \