Safe Union

HIDL 中的 safe_union 表示明确标记的联合类型。它类似于 union,但 safe_union 会跟踪基础类型且与 Java 兼容。safe_union 类型适用于搭载 Android 10 及更高版本的新设备和升级设备。

语法

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

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

用法

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

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