새로운 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
에서 다음을 실행합니다.using namespace android::hardware::configstore; using namespace android::hardware::configstore::V1_0; static int64_t disableInitBlank = getBool< IChargerConfigs, &IChargerConfigs::disableInitBlank>(false);
이 예시에서는 ConfigStore 항목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) \