安全聯盟

safe_union中的 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;
};