安全联合

HIDL 中的 safe_union 表示显式标记的联合类型。这与 union 类似,不同之处在于 safe_union 会跟踪底层类型,并且与 Java 兼容。safe_union 类型在 Android 10 及更高版本中适用于新的和升级的设备。

语法

在 HIDL 中,safe_union 的表达方式与 unionstruct 完全相同。

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

用法

在运行时,safe_union 始终只有一种类型。默认情况下,它是联合中的第一种类型。例如,在上面,MySafeUnion 默认情况下是 TypeA

hidl-gen 会在 C++ 和 Java 中为 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;
};