安全聯盟

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

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將中止程式。

單態

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