HIDL HAL은 Android 핵심 시스템(system.img 또는 프레임워크)이 이전 버전과 호환됨을 보장합니다. 공급업체 테스트 도구 모음(VTS) 테스트는 HAL이 예상대로 작동(예를 들어 1.1 HAL 테스트는 모든 1.2 구현에서 실행됨)하는지 확인하는 반면에 프레임워크 테스트는 지원되는 HAL(1.0, 1.1, 1.2)이 제공되면 프레임워크가 HAL과 제대로 작동하는지 확인하기 위해 필요합니다.
HAL 인터페이스 정의 언어(HIDL)에 관한 자세한 내용은 HIDL, HIDL 버전 관리 및 HIDL HAL 지원 중단을 참조하세요.
HAL 업그레이드 정보
HAL 업그레이드에는 주 버전과 부 버전의 두 가지 유형이 있습니다. 대부분의 시스템은 하나의 HAL 구현만을 포함하지만 여러 구현이 지원됩니다. 예:
android.hardware.teleport@1.0 # initial interface android.hardware.teleport@1.1 # minor version upgrade android.hardware.teleport@1.2 # another minor version upgrade ... android.hardware.teleport@2.0 # major version upgrade ...
일반적으로 시스템 파티션에는 특정 HAL 구현 그룹과의 통신을 관리하는 프레임워크 데몬(예: teleportd
)이 포함됩니다. 또는 편리한 클라이언트 동작을 구현하는 시스템 라이브러리(예: android.hardware.configstore-utils
)를 포함하는 시스템이 있을 수도 있습니다. 위의 예에서 teleportd
는 기기에 설치된 HAL 버전과 관계없이 작동해야 합니다.
Google에서 유지하는 버전
주 버전 업그레이드(1.0, 2.0, 3.0 등)가 있는 경우 Google에서 유지하는 하나 이상의 기기는 이 버전이 지원 중단될 때까지 각 주 버전의 구현이 유지되어야 합니다. Google에서 유지하는 기기에 특정 주요 버전이 제공되지 않는 경우 Google은 이 주요 버전의 이전 구현을 계속 유지합니다.
새로운 구현(예 : 2.0)을 만들 때 이전 구현(예 : 1.2)은 유지되고 기본적으로 사용되지 않으므로 유지하는 데 약간의 추가 오버헤드가 추가됩니다.
부 버전 업그레이드 테스트
프레임워크에서 하위 버전의 이전 버전과의 호환성을 테스트하려면 부 버전 구현을 자동으로 생성하는 방법이 필요합니다. Google에서 유지하는 버전 관련 제한이 있을 때 hidl-gen
은 1.(x+n) 구현을 사용하고 1.x 구현을 제공하는 어댑터만 생성합니다. 2.0 구현에서 주 버전의 정의에 따라 1.0 구현을 생성할 수 없습니다.
예를 들어 1.2 구현에서 1.1 테스트를 실행하려면 1.1 구현을 시뮬레이션할 수 있어야 합니다. 1.2 인터페이스는 동작(예: 프레임워크가 수동으로 버전을 확인하거나 castFrom
을 호출함)에 약간의 차이가 있는 1.1 구현으로 자동 사용될 수 있습니다.
기본 개념은 다음과 같습니다.
- Android 휴대기기에 x.(y + n) 인터페이스를 설치합니다.
- xy 대상 어댑터를 설치하고 활성화합니다.
- 이전 버전의 부 버전을 실행할 때 예상대로 작동하는지 기기를 테스트합니다.
이러한 어댑터는 구현이 실제로 1.2 인터페이스에서 지원되고 1.1 인터페이스만 제공한다는 사실을 완전히 숨깁니다. 어댑터는 1.2 인터페이스를 사용하고 1.1 인터페이스처럼 보이게 만듭니다.
워크플로 예
이 예에서 Android 기기는 android.hardware.foo@1.1::IFoo/default
를 실행합니다. 클라이언트가 android.hardware.foo@1.0::IFoo/default
를 제대로 작동하는지 확인하려면 다음을 실행합니다.
- 터미널에서 다음을 실행합니다.
$ PACKAGE=android.hidl.allocator@1.0-adapter $ INTERFACE=IAllocator $ INSTANCE=ashmem $ THREAD_COUNT=1 # can see current thread use on `lshal -i -e` $ m -j $PACKAGE $ /data/nativetest64/$PACKAGE/$PACKAGE $INTERFACE $INSTANCE $THREAD_COUNT Trying to adapt down android.hidl.allocator@1.0-adapter/default Press any key to disassociate adapter.
adb shell stop
또는start
를 사용하여 클라이언트를 다시 시작하거나 프로세스를 종료합니다.- 테스트가 완료되면 어댑터의 연결을 해제합니다.
- 기기를 다시 시작하거나 클라이언트를 다시 시작하여 시스템 상태를 복원합니다.
추가 타겟
hidl-gen
은 빌드 시스템에서 hidl_interface
로 지정된 모든 인터페이스와 관련한 어댑터의 추가 빌드 타겟을 자동으로 추가합니다. a.b.c@x.y
패키지에는 추가 C++ 타겟 a.b.c@x.y-adapter
가 있습니다.
a.b.c@x.y
관련 어댑터는 일부 구현 a.b.c@x.(y+n)::ISomething/instance-name
을 입력으로 가져오고 a.b.c@x.y::ISomething/instance-name
을 등록해야 하며 y+n
구현도 취소해야 합니다.
다음과 같은 샘플 인터페이스가 제공됩니다.
// IFoo.hal package a.b.c@1.0; interface IFoo { doFoo(int32_t a) generates (int64_t b); doSubInterface() generates (IFoo a); };
a.b.c@1.0-adapter
에서 제공하는 코드는 아래 샘플과 비슷합니다.
// autogenerated code // in namespace a::b::c::V1_0::IFoo struct MockFoo { // takes some subclass of V1_0. May be V1_1, V1_2, etc... MockFoo(V1_0::IFoo impl) mImpl(impl) {} Return<int64_t> doFoo(int32_t a) { return this->mImpl->doFoo(a); } Return<V1_0::ICallback> doSubInterface() { // getMockForBinder returns MockCallback instance // that corresponds to a particular binder object // It can't return a new object every time or // clients using interfacesSame will have // divergent behavior when using the mock. auto _hidl_out = this->mImpl->doSubInterface(); return getMockForBinder(_hidl_out); } };
데이터 값은 반환되는 하위 인터페이스를 제외하고 자동 생성된 모의 클래스 외부 및 내부로 정확하게 전달됩니다. 이러한 인터페이스는 상응하는 최신 콜백 객체로 래핑되어야 합니다.