안전한 공용체

HIDL의 safe_union은 태그가 명시적으로 지정된 공용체 형식을 나타냅니다. 이는 safe_union이 기본 형식을 추적하고 자바와 호환된다는 지원한다는 점을 제외하고는 union과 유사합니다. 새 기기 및 업그레이드된 기기의 경우 Android 10 이상에서 safe_union 형식을 사용할 수 있습니다.

구문

safe_union은 HIDL에서 정확히 union 또는 struct처럼 표현됩니다.

safe_union MySafeUnion {
     TypeA a;
     TypeB b;
     ...
};

사용

런타임에서 safe_union은 하나의 형식일 뿐입니다. 기본적으로 이 형식이 공용체의 첫 번째 형식이 됩니다. 예를 들어 위의 MySafeUnion은 기본적으로 TypeA입니다.

hidl-gen은 C++ 및 자바에서 safe_union을 위한 맞춤 클래스 또는 구조체를 생성합니다. 이 클래스에는 각 멤버의 판별자(hidl_discriminator로 나타냄), 현재 판별자(getDiscriminator)를 가져오기 위한 메서드, 각 멤버의 setter와 getter가 포함됩니다. 각 setter 및 getter의 이름은 멤버와 동일하게 지정됩니다. 예를 들어 TypeA a의 getter는 'a'라고 불리며 TypeA의 무언가를 반환합니다. 상응하는 setter도 'a'라고 불리며 TypeA의 매개변수를 사용합니다. safe_union의 값을 설정하면 getDiscriminator가 반환한 값으로 판별자의 값이 업데이트됩니다. 현재 판별자가 아닌 판별자에서 값에 액세스하면 프로그램이 중단됩니다. 예를 들어 MySafeUnion의 인스턴스에서 getDiscriminator를 호출하여 hidl_discriminator::b를 반환한 다음 a를 검색하려고 시도하면 프로그램이 중단됩니다.

Monostate

safe_union은 항상 값을 갖지만, 값을 갖지 않으려는 경우에는 android.hidl.safe_union@1.0::Monostate를 자리표시자로 사용합니다. 예를 들어 다음 공용체는 noinit(비어 있음) 또는 foo일 수 있습니다.

import android.hidl.safe_union@1.0::Monostate;

safe_union OptionalFoo {
     Monostate noinit;
     Foo foo;
};