Safe Union

HIDL の safe_union は、明示的にタグ付けされた共用体型を表します。union と似ていますが、safe_union は基になる型をトラッキングし、Java と互換性がある点で異なります。safe_union 型は、Android 10 以上の新しいデバイスおよびアップグレードされたデバイスで使用できます。

構文

safe_union は、unionstruct とまったく同じように HIDL で表現されます。

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

用途

実行時、safe_union は常に 1 つの型のみになります。デフォルトでは、共用体の最初の型になります。上記の例では、MySafeUnion はデフォルトでは TypeA です。

hidl-gen は、safe_union のカスタムクラスまたは構造体を C++と Java の両方で生成します。このクラスには、各メンバーの弁別子(hidl_discriminator 内)、現在の弁別子を取得するメソッド(getDiscriminator)、各メンバーのセッターとゲッターが含まれます。各セッターとゲッターには、そのメンバーとまったく同じ名前が付けられます。たとえば、TypeA a のゲッターは「a」と呼ばれ、TypeA の何かを返します。対応するセッターも「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;
};