安全聯合

HIDL 中的 safe_union 代表明確標記的聯集型別。這與 union 類似,但 safe_union 會追蹤基礎型別,且與 Java 相容。搭載 Android 10 以上版本的新裝置和升級裝置,都支援 safe_union 型別。

語法

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

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

用量

在執行階段,safe_union 一律只會是一種型別。根據預設,這是聯集中的第一個型別。舉例來說,上述 MySafeUnion 預設為 TypeA

hidl-gen 會在 C++ 和 Java 中為 safe_union 生成自訂類別或結構體。這個類別包含每個成員的鑑別器 (位於 hidl_discriminator 中)、取得目前鑑別器的方法 (getDiscriminator),以及每個成員的設定器和取得器。每個 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;
};