Kompatibilitätsmatrizen

In diesem Abschnitt werden die Framework- und Gerätekompatibilitätsmatrizen sowie das Kompatibilitätsmatrixschema beschrieben. Informationen zu Match-Regeln finden Sie unter Matching-Regeln .

Framework-Kompatibilitätsmatrix (FCM)

Die Framework-Kompatibilitätsmatrix (FCM) beschreibt die Anforderungen des Frameworks an das Gerät, auf dem es läuft. Die Framework-Kompatibilitätsmatrix besteht aus der Systemkompatibilitätsmatrix, der Produktkompatibilitätsmatrix und der system_ext-Kompatibilitätsmatrix . Die Anforderungen des FCM müssen durch das Gerätemanifest erfüllt werden (Anforderungen, die zur Build-Zeit, zur Laufzeit und in VTS erzwungen werden).

Der system_ext-FCM und der Produkt-FCM sind Ergänzungen des gerätespezifischen FCM (in der Systempartition installiert).

  • Der Geräte-FCM sollte die Anforderungen der Module in der Systempartition widerspiegeln.
  • Der system_ext-FCM sollte die Anforderungen der Module in der system_ext-Partition widerspiegeln.
  • Der Produkt-FCM sollte die Anforderungen der Module in der Produktpartition widerspiegeln.

Alle FCMs sollten mit den Änderungen eines OEM am Framework in den System-, Produkt- und system_ext-Partitionen übereinstimmen. Wenn beispielsweise eine in der Produktpartition installierte App eine Herstellererweiterung einer HAL-Schnittstelle verwendet, sollte die HAL-Schnittstellenanforderung im Produkt-FCM deklariert werden.

Beispiel einer Systemkompatibilitätsmatrixdatei:

<?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>

Weitere Einzelheiten finden Sie unter FCM-Lebenszyklus .

Produktkompatibilitätsmatrix

Das Produkt-FCM ist eine Framework-Kompatibilitätsmatrixdatei in der Produktpartition. Das VINTF-Objekt verbindet den Produkt-FCM zur Laufzeit mit FCMs in den System- und system_ext-Partitionen.

Beispiel einer Produkt-FCM-Datei:

<?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>

System_ext-Kompatibilitätsmatrix

Der system_ext FCM ist eine Framework-Kompatibilitätsmatrixdatei in der system_ext-Partition. Das VINTF-Objekt verbindet den system_ext FCM mit FCMs in den System- und Produktpartitionen zur Laufzeit. Eine Beispieldatei für system_ext FCM finden Sie in der Produktkompatibilitätsmatrix .

Gerätekompatibilitätsmatrix (DCM)

Die Gerätekompatibilitätsmatrix beschreibt eine Reihe von Anforderungen, die das Gerät vom Framework erwartet (Anforderungen, die beim Start und zum OTA-Zeitpunkt durchgesetzt werden).

Beispiel-DCM-Datei:

<?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>

Kompatibilitätsmatrixschema

In diesem Abschnitt wird die Bedeutung dieser XML-Tags beschrieben. Einige „erforderliche“ Tags können in der Quelldatei im Android-Quellbaum fehlen und von assemble_vintf zur Erstellungszeit geschrieben werden. „Erforderliche“ Tags müssen in den entsprechenden Dateien auf dem Gerät vorhanden sein.

?xml
Optional. Es stellt lediglich Informationen für den XML-Parser bereit.
compatibility-matrix.version
Erforderlich. Metaversion dieser Kompatibilitätsmatrix. Beschreibt die in der Kompatibilitätsmatrix erwarteten Elemente. Hat nichts mit der XML-Version zu tun.
compatibility-matrix.type
Erforderlich. Typ dieser Kompatibilitätsmatrix:
  • "device" : Gerätekompatibilitätsmatrix.
  • "framework" : Framework-Kompatibilitätsmatrix.
manifest.level
Erforderlich für die Framework-Kompatibilitätsmatrix. In Android 12 und höher sind Framework-Kompatibilitätsmatrixdateien in den Partitionen „product“ und „system_ext“ zulässig. Gibt die Framework-Kompatibilitätsmatrix-Version (FCM-Version) dieser Datei an. Deklarieren Sie dies nicht in der gerätespezifischen Framework-Kompatibilitätsmatrix (z. B. DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE ).
compatibility-matrix.hal
Optional und kann wiederholt werden. Listet einen einzelnen HAL (HIDL oder nativ) auf, der vom Eigentümer der Kompatibilitätsmatrix (Framework oder Gerät) vorhanden sein muss. HAL-Einträge werden durch ein <name> -Element unterschieden; Es können mehrere HAL-Einträge mit demselben Namen vorhanden sein (impliziert „und“-Bedingung).
compatibility-matrix.hal.format
Optional. Der Wert kann einer der folgenden sein:
  • "hidl" : HIDL-HALs. Dies ist die Standardeinstellung.
  • "aidl" : AIDL-HALs . Nur gültig für Kompatibilitätsmatrix-Metaversion 2.0.
  • "native" : native HALs.
compatibility-matrix.hal.optional
Das Attribut ist optional und hat standardmäßig den Wert „false“. Gibt an, ob dieser HAL für den Eigentümer der Kompatibilitätsmatrix (Framework oder Gerät) optional ist. Wenn ein <hal> -Eintrag als optional markiert ist, bedeutet dies, dass der Eigentümer mit diesem HAL arbeiten kann, sofern vorhanden, es aber nicht erforderlich ist, dass es vorhanden ist.
compatibility-matrix.hal.name
Erforderlich. Vollständiger Paketname dieser HAL. Beispiele:
  • android.hardware.camera (HIDL oder AIDL HAL)
  • GLES (natives HAL, erfordert nur Namen)
compatibility-matrix.hal.version
Eine Liste von Versionsbereichen (siehe HAL-Matches ), die definiert, welche Versionen der Besitzer der Kompatibilitätsmatrix (Framework oder Gerät) erwartet.

Für HIDL und native HALs erforderlich, kann ohne Duplikate wiederholt werden. Das Format ist eines der folgenden:
  • MAJOR . MINOR_MIN - MINOR_MAX
  • MAJOR . MINOR (entspricht MAJOR . MINOR - MINOR )

Für AIDL-HALs darf auf Geräten mit Android 11 und niedriger nicht vorhanden sein. Optional auf Geräten mit späteren Versionen. Falls angegeben, ist das Format eines der folgenden:
  • VERSION_MIN - VERSION_MAX
  • VERSION (entspricht VERSION - VERSION )
Wenn keine Angabe erfolgt, ist der Wert standardmäßig 1 .
compatibility-matrix.hal.interface
Optional, kann wiederholt werden. Eine Liste der erforderlichen Schnittstellen dieser HAL.
compatibility-matrix.hal.interface.name
Erforderlich. Name der Schnittstelle.
compatibility-matrix.hal.interface.instance
Optional, kann wiederholt werden. Eine Liste der erforderlichen Instanzen dieser Schnittstelle.
compatibility-matrix.hal.interface.regex-instance
Optional, kann wiederholt werden. Eine Liste der erforderlichen Instanznamenmuster auf dieser Schnittstelle. Verwenden Sie das erweiterte reguläre Ausdrucksformat .
compatibility-matrix.kernel
Optional, kann wiederholt werden. Geben Sie eine Liste der Kernelkonfigurationen an, die das Framework für jede Kernelversion benötigt.
Es können mehrere <kernel> mit derselben <version> vorhanden sein, um eine „und“-Beziehung zu implizieren. Jeder <kernel> ist ein „Fragment“ der Anforderungen, die nur aktiviert werden, wenn <conditions> erfüllt sind.
compatibility-matrix.kernel.version
Erforderlich. Kernelversion. Format ist VERSION . MAJOR_REVISION . MINOR_REVISION . Version und Hauptrevision müssen genau übereinstimmen. Die Nebenrevision definiert die minimale LTS-Version des Kernels, die das Framework erwartet.
compatibility-matrix.kernel.condition
Optional. Darf nicht für den ersten <kernel> jeder Version vorhanden sein. Gibt eine Liste von Bedingungen an. Wenn die Bedingungen erfüllt sind, werden die in diesem <kernel> -Fragment genannten Anforderungen aktiviert.
compatibility-matrix.kernel.config
Optional, kann wiederholt werden. Listet CONFIG Elemente auf, die für diese Kernel-Version übereinstimmen müssen. Jedes CONFIG Element ist ein Schlüssel-Wert-Paar; Konfigurationselemente werden nach Schlüssel unterschieden.
compatibility-matrix.kernel.config.key
Erforderlich. Schlüsselname des CONFIG Elements. Beginnt mit CONFIG_ .
compatibility-matrix.kernel.config.value
Erforderlich. Wert des CONFIG Elements. Das Format hängt vom Typ ab:
  • string . Zitate werden weggelassen.
  • int . Es werden dezimale und hexadezimale Werte (müssen mit 0x oder 0X) akzeptiert. Wird als 64-Bit-Ganzzahl interpretiert; Überläufe führen zu einer Kürzung. (Der Parser akzeptiert Werte von -2 64 + 1 bis 2 64 - 1, das 65. Bit wird abgeschnitten; Einzelheiten finden Sie in der Strtoull-Manpage .)
  • range . Das Format ist [int]-[int] , z. B. 10-20 . Hexadezimale Werte werden akzeptiert und müssen mit 0x oder 0X beginnen. Zwei Grenzen müssen eine vorzeichenlose 64-Bit-Ganzzahl sein.
  • tristate . Gültige Werte sind y , m und n .
compatibility-matrix.kernel.config.value.type
Erforderlich. Typ des Werts des CONFIG Elements, einer von:
  • string
  • int
  • range
  • tristate
compatibility-matrix.sepolicy
Erforderlich. Enthält alle Sepolicy-bezogenen Einträge. Wird nur von der Framework-Kompatibilitätsmatrix verwendet.
compatibility-matrix.sepolicy.sepolicy-version
Erforderlich, kann wiederholt werden. Beschreibt die Anforderung an die Sepolicy-Version. Entspricht manifest.sepolicy.version . Jede Instanz eines Elements definiert einen Bereich von Sepolicy-Versionen.
compatibility-matrix.sepolicy.kernel-sepolicy-version
Erforderlich. Deklariert die policydb Version, mit der das Framework arbeitet.
compatibility-matrix.avb.vbmeta-version
Optional; Wird nur von der Framework-Kompatibilitätsmatrix verwendet. Deklariert die AVB-Version, die zum Signieren system.img verwendet wird. In Android 10 veraltet.
compatibility-matrix.vendor-ndk
Optional; Wird nur von der Gerätekompatibilitätsmatrix verwendet. Deklariert die Anforderung des VNDK-Anbieter-Snapshots. Wenn es fehlt, wird für das Systemabbild keine VNDK-Anforderung gestellt.
compatibility-matrix.vendor-ndk.version
Erforderlich. Eine positive Ganzzahl, die eine VNDK-Version deklariert, die für das Anbieter-Image erforderlich ist.
compatibility-matrix.vendor-ndk.library
Optional, kann wiederholt werden. Deklariert eine Reihe von VNDK-Bibliotheken, die für das Anbieter-Image erforderlich sind. Gleiche Semantik wie manifest.vendor-ndk.library .
compatibility-matrix.system-sdk.version
Optional, kann wiederholt werden; Wird nur von der Gerätekompatibilitätsmatrix verwendet. Deklariert die Anforderung von Anbieter-Apps für System-SDK-Versionen. Wenn es fehlt, wird für das System-Image keine System-SDK-Anforderung gestellt.