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;
    };