Macierze zgodności

W tej sekcji opisaliśmy system i matrycę zgodności urządzeń oraz schemat tej ostatniej. Informacje o regułach dopasowania znajdziesz w artykule Reguły dopasowania.

Macierz zgodności frameworka (FCM)

Macierz zgodności frameworku (FCM) opisuje wymagania frameworku na urządzeniu, na którym jest on uruchamiany. Matryca zgodności frameworku składa się z matrycy zgodności systemu, matrycy zgodności produktumatrycy zgodności system_ext. Manifest urządzenia musi spełniać wymagania FCM (wymagania są egzekwowane w czasie kompilacji, w czasie działania i w VTS).

System_ext FCM i product FCM to uzupełnienia FCM dla poszczególnych urządzeń (zainstalowane na partycji systemowej).

  • FCM urządzenia powinien odzwierciedlać wymagania modułów na partycji systemowej.
  • W przypadku systemu system_ext FCM należy uwzględnić wymagania dotyczące poszczególnych modułów na partycji system_ext.
  • FCM produktu powinien odzwierciedlać wymagania dotyczące modułów w partycji produktu.

Wszystkie pliki FCM powinny być zgodne z modyfikacjami frameworku w partycjach system, product i system_ext wprowadzonymi przez OEM. Jeśli na przykład aplikacja zainstalowana w partycji produktu używa rozszerzenia dostawcy interfejsu HAL, wymagania dotyczące interfejsu HAL należy zadeklarować w FCM produktu.

Przykładowy plik z macierzą zgodności systemów:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Comments, Legal notices, etc. here -->
<compatibility-matrix version="1.0" type="framework" level="3">
    <hal>
        <name>android.hardware.camera</name>
        <version>1.0</version>
        <version>3.1-4</version>
        <interface>
            <name>ICameraProvider</name>
            <instance>default</instance>
            <regex-instance>[a-z_]+/[0-9]+</regex-instance>
        </interface>
    </hal>
    <hal>
        <name>android.hardware.nfc</name>
        <version>1.0</version>
        <interface>
            <name>INfc</name>
            <instance>default</instance>
        </interface>
    </hal>
    <hal optional="true">
        <name>android.hardware.graphics.composer</name>
        <version>2.1</version>
        <interface>
            <name>IComposer</name>
            <instance>default</instance>
        </interface>
    </hal>
    <hal format="aidl" optional="true">
        <name>android.hardware.light</name>
        <version>1-2</version>
        <interface>
            <name>ILights</name>
            <instance>default</instance>
        </interface>
    </hal>
    <hal format="native">
        <name>GL</name>
        <version>1.1</version>
        <version>3.0</version>
    </hal>
    <hal format="native">
        <name>EGL</name>
        <version>1.1</version>
    </hal>
    <kernel version="3.18.51">
        <!-- common configs -->
    </kernel>
    <kernel version="3.18.51">
        <!-- arm specific configs -->
        <condition>
            <config>
                <key>CONFIG_ARM</key>
                <value type="tristate">y</value>
            </config>
        <condition>
        <config>
            <key>CONFIG_A</key>
            <value type="string"></value>
        </config>
        <config>
            <key>CONFIG_B</key>
            <value type="tristate">y</value>
        </config>
    </kernel>
    <kernel version="4.1.22">
        <!-- common configs -->
        <config>
            <key>CONFIG_A</key>
            <value type="string">foo</value>
        </config>
        <config>
            <key>CONFIG_B2</key>
            <value type="int">1024</value>
        </config>
    </kernel>
    <sepolicy>
        <kernel-sepolicy-version>30</kernel-sepolicy-version>
        <sepolicy-version>25.0</sepolicy-version>
        <sepolicy-version>26.0-3</sepolicy-version>
    </sepolicy>
    <avb>
        <vbmeta-version>2.1</vbmeta-version>
    </avb>
    <xmlfile format="dtd">
        <name>media_profile</name>
        <version>1.0</version>
        <path>/system/etc/media_profile_V1_0.dtd</path>
    </xmlfile>
</compatibility-matrix>

Więcej informacji znajdziesz w artykule Cykl życia usługi Firebase Messaging.

Tabela zgodności produktów

Plik FCM produktu to plik matrycy zgodności systemu w partycji produktu. Obiekt VINTF łączy FCM produktu z FCM w systemie i partycjach system_ext w czasie wykonywania.

Przykładowy plik FCM produktu:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Comments, Legal notices, etc. here -->
<compatibility-matrix version="1.0" type="framework">
    <hal>
        <name>vendor.foo.camera</name>
        <version>1.0</version>
        <interface>
            <name>IBetterCamera</name>
            <instance>default</instance>
        </interface>
    </hal>
</compatibility-matrix>

Tabela zgodności System_ext

System_ext FCM to plik macierzy zgodności frameworku w partycji system_ext. Obiekt VINTF łączy system_ext FCM z FCM w systemie i partycjach produktów w czasie wykonywania. Przykładowy plik system_ext FCM znajdziesz w macierz zgodności produktów.

Matryca zgodności urządzeń (DCM)

Matryca zgodności urządzenia opisuje zestaw wymagań, które urządzenie oczekuje od platformy (wymagania egzekwowane podczas uruchamiania i w ramach aktualizacji OTA).

Przykładowy plik DCM:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Comments, Legal notices, etc. here -->
<compatibility-matrix version="1.0" type="device">
    <hal>
        <name>android.hidl.manager</name>
        <version>1.0</version>
        <interface>
            <name>IServiceManager</name>
            <instance>default</instance>
        </interface>
    </hal>
    <hal>
        <name>android.hidl.memory</name>
        <version>1.0</version>
        <interface>
            <name>IMemory</name>
            <instance>ashmem</instance>
        </interface>
    </hal>
    <hal>
        <name>android.hidl.allocator</name>
        <version>1.0</version>
        <interface>
            <name>IAllocator</name>
            <instance>ashmem</instance>
        </interface>
    </hal>
    <hal>
        <name>android.framework.sensor</name>
        <version>1.0</version>
        <interface>
            <name>ISensorManager</name>
            <instance>default</instance>
        </interface>
    </hal>
    <vendor-ndk>
        <version>27</version>
    </vendor-ndk>
    <system-sdk>
        <version>27</version>
    </system-sdk>
</compatibility-matrix>

Schemat macierzy zgodności

W tej sekcji opisano znaczenie tych tagów XML. Niektóre tagi „required” mogą nie występować w pliku źródłowym w drzewie źródłowym Androida i być zapisane przez assemble_vintf w czasie kompilacji. W odpowiednich plikach na urządzeniu muszą znajdować się tagi „Wymagane”.

?xml
Opcjonalnie. Udostępnia ona informacje tylko dla parsowania XML.
compatibility-matrix.version
Wymagane. Metawersja tej tabeli zgodności. Opisuje elementy oczekiwane w macierzy zgodności. Niezwiązane z wersją pliku XML.
compatibility-matrix.type
Wymagane. Typ tej tabeli zgodności:
  • "device": tabela zgodności urządzeń.
  • "framework": tabela zgodności platformy.
manifest.level
Wymagane w ramach tabeli zgodności. W Androidzie 12 i nowszych dozwolone w plikach macierzy zgodności frameworka w partycjach product i system_ext. Określa wersję macierzy zgodności platformy (wersja FCM) tego pliku. Nie deklaruj tego w ramce matrycy zgodności systemu (np. DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE).
compatibility-matrix.hal
Opcjonalne i można je powtórzyć. Wyświetla jeden interfejs HAL (HIDL lub natywny), który musi być obecny zgodnie z wymaganiami właściciela macierzy zgodności (platformy lub urządzenia). Wpisy HAL są rozróżniane za pomocą elementu <name>. Może istnieć kilka wpisów HAL o tej samej nazwie (co oznacza warunek „i”).
compatibility-matrix.hal.format
Opcjonalnie. Możliwe wartości:
  • "hidl": interfejsy HIDL HAL. Jest to ustawienie domyślne.
  • "aidl": interfejsy AIDL HAL. Dozwolone tylko w przypadku metawersji 2.0 w macierz zgodności.
  • "native": natywne HAL.
compatibility-matrix.hal.optional (Android 15 lub starszy)
Atrybut
jest opcjonalny i domyślnie ma wartość fałsz. Określa, czy ten interfejs HAL jest opcjonalny dla właściciela macierzy zgodności (platformy lub urządzenia). Jeśli wpis <hal> jest oznaczony jako opcjonalny, oznacza to, że właściciel może korzystać z tego interfejsu API, jeśli jest obecny, ale nie jest to wymagane.
Ostrzeżenie: ten atrybut został wycofany w Androidzie 15 i nie ma już żadnego wpływu. Jeśli wymagane jest zainstalowanie jakichkolwiek HAL-i, należy to uwzględnić w testach.
compatibility-matrix.hal.name
Wymagane. Pełna nazwa pakietu tego HAL. Przykłady:
  • android.hardware.camera (HIDL lub AIDL HAL)
  • GLES (natywne HAL, wymagana tylko nazwa)
compatibility-matrix.hal.version
Lista zakresów wersji (patrz zgodność HAL), która określa, których wersji oczekuje właściciel macierzy zgodności (platformy lub urządzenia).

W przypadku interfejsów HIDL i własnych interfejsów HAL wymagane, mogą się powtarzać bez duplikatów. Format:
  • MAJOR.MINOR_MIN-MINOR_MAX
  • MAJOR.MINOR (odpowiednik:MAJOR.MINOR-MINOR)

W przypadku interfejsów AIDL HAL nie można ich używać na urządzeniach z Androidem 11 lub starszym. Opcjonalnie na urządzeniach z późniejszymi wersjami. Jeśli jest określony, format jest jeden z tych:
  • VERSION_MIN-VERSION_MAX
  • VERSION (odpowiednik:VERSION-VERSION)
Jeśli nie podasz żadnej wartości, zostanie użyta wartość domyślna 1.
compatibility-matrix.hal.interface
Opcjonalnie, można powtórzyć. Lista wymaganych interfejsów tego HAL.
compatibility-matrix.hal.interface.name
Wymagane. Nazwa interfejsu.
compatibility-matrix.hal.interface.instance
Opcjonalnie, można powtórzyć. Lista wymaganych wystąpień tego interfejsu.
compatibility-matrix.hal.interface.regex-instance
Opcjonalnie, można powtórzyć. Lista wymaganych wzorów nazw instancji w tym interfejsie. Użyj formatu rozszerzonego wyrażenia regularnego.
compatibility-matrix.kernel
Opcjonalnie, można powtórzyć. Określ listę konfiguracji jądra, których wymaga framework w przypadku każdej wersji jądra.
Może istnieć wiele <kernel> z tą samą wartością <version>, co oznacza relację „i”. Każda wartość <kernel> to „fragment” wymagań, które są włączone tylko wtedy, gdy spełnione są warunki <conditions>.
compatibility-matrix.kernel.version
Wymagane. Wersja jądra. Format: VERSION.MAJOR_REVISION.MINOR_REVISION. Wersja i główna wersja muszą być identyczne. Wersja podrzędna określa minimalną wersję LTS jądra, której oczekuje platforma.
compatibility-matrix.kernel.condition
Opcjonalnie. Nie może ona występować w przypadku pierwszego <kernel> w każdej wersji. Określa listę warunków. Gdy warunki zostaną spełnione, wymagania podane w tym fragmencie <kernel> zostaną włączone.
compatibility-matrix.kernel.config
Opcjonalnie, można powtórzyć. Zawiera listę CONFIG elementów, które muszą być dopasowane do tej wersji jądra. Każdy element CONFIG to para klucz-wartość; elementy konfiguracji są rozróżniane za pomocą klucza.
compatibility-matrix.kernel.config.key
Wymagane. Nazwa klucza elementu CONFIG. Zaczyna się od CONFIG_.
compatibility-matrix.kernel.config.value
Wymagane. Wartość elementu CONFIG. Format zależy od typu:
  • string. Cudzysłowy są pomijane.
  • int. Akceptowane są wartości dziesiętne i szesnastkowe (muszą zaczynać się od 0x lub 0X)). Interpretowana jako 64-bitowa liczba całkowita. Przepełnienie powoduje obcięcie. (Parser akceptuje wartości od -264 + 1 do 264 - 1, 65. bit jest obcinany; szczegółowe informacje znajdziesz na stronie man strtoull).
  • range. Format to [int]-[int], np. 10-20. Dozwolone są wartości szesnastkowe, które muszą się zaczynać od 0x lub 0X. Oba zakresy muszą być 64-bitowymi liczbami całkowitymi bez znaku.
  • tristate. Prawidłowe wartości to y, m i n.
compatibility-matrix.kernel.config.value.type
Wymagane. Typ wartości elementu CONFIG:
  • string
  • int
  • range
  • tristate
compatibility-matrix.sepolicy
Wymagane. Zawiera wszystkie wpisy związane z sepolicy. Używany tylko przez macierz zgodności frameworka.
compatibility-matrix.sepolicy.sepolicy-version
Wymagane, można powtórzyć. Opisuje wymagania dotyczące wersji sepolicy. Odpowiada manifest.sepolicy.version. Każda instancja elementu definiuje zakres wersji polityki bezpieczeństwa.
compatibility-matrix.sepolicy.kernel-sepolicy-version
Wymagane. Określa wersję policydb, z którą współpracuje framework.
compatibility-matrix.avb.vbmeta-version
Opcjonalny; używany tylko przez matrycę zgodności frameworka. Określa wersję AVB użytą do podpisania system.img. Wycofane w Androidzie 10.
compatibility-matrix.vendor-ndk
Opcjonalny; używany tylko przez tablicę zgodności urządzeń. Określa wymagania dotyczące snapshotu dostawcy VNDK. Jeśli brakuje, nie ma wymagań dotyczących VNDK w obrazie systemu.
compatibility-matrix.vendor-ndk.version
Wymagane. Dodatnia liczba całkowita określająca wersję VNDK wymaganą przez obraz dostawcy.
compatibility-matrix.vendor-ndk.library
Opcjonalnie, można powtórzyć. Deklaruje zestaw bibliotek VNDK wymaganych przez obraz dostawcy. Ta sama semantyka co manifest.vendor-ndk.library.
compatibility-matrix.system-sdk.version
Opcjonalne, można powtórzyć; używane tylko przez tablicę zgodności urządzeń. Określa wymagania dotyczące aplikacji dostawców w wersjach pakietu SDK systemu. Jeśli go brakuje, nie ma wymagań dotyczących System SDK w przypadku obrazu systemu.