Ein VINTF-Objekt aggregiert Daten aus Device Manifest- und Framework Manifest-Dateien (XML). Beide Manifeste haben dasselbe Format, aber nicht alle Elemente gelten für beide. Weitere Informationen zum Schema findest du unter Manifestdateischema.
Gerätemanifest
Das Gerätemanifest (vom Gerät bereitgestellt) besteht aus dem Anbietermanifest und dem ODM-Manifest.
- Im Anbietermanifest werden HALs, SELinux-Richtlinienversionen usw. für ein SoC angegeben. Es wird empfohlen, es im Android-Quellbaum unter
device/VENDOR/DEVICE/manifest.xml
zu platzieren. Es können jedoch mehrere Fragmentdateien verwendet werden. Weitere Informationen finden Sie unter Manifest-Fragmente und DM aus Fragmenten generieren. - Das ODM-Manifest enthält produktspezifische HALs in der ODM-Partition.
Das VINTF-Objekt lädt das ODM-Manifest in dieser Reihenfolge:
- Wenn
SKU
definiert ist (SKU
ist der Wert der Propertyro.boot.product.hardware.sku
),/odm/etc/vintf/manifest_SKU.xml
/odm/etc/vintf/manifest.xml
- Wenn
SKU
definiert ist,/odm/etc/manifest_SKU.xml
/odm/etc/manifest.xml
- Wenn
- Das Anbietermanifest enthält produktspezifische HALs in der Anbieterpartition.
Das VINTF-Objekt lädt das Anbietermanifest in dieser Reihenfolge:
- Wenn
SKU
definiert ist (SKU
ist der Wert der Propertyro.boot.product.vendor.sku
),/vendor/etc/vintf/manifest_SKU.xml
/vendor/etc/vintf/manifest.xml
- Wenn
- Das VINTF-Objekt lädt das Gerätemanifest in dieser Reihenfolge:
- Wenn das Anbietermanifest vorhanden ist, kombinieren Sie Folgendes:
- Das Anbietermanifest
- Optionale Manifestfragmente von Anbietern
- Optionales ODM-Manifest
- Optionale ODM-Manifest-Fragmente
- Andernfalls, wenn das ODM-Manifest vorhanden ist, kombinieren Sie das ODM-Manifest mit den optionalen ODM-Manifest-Fragmenten.
/vendor/manifest.xml
(alt, keine Fragmente)- Kombinieren Sie abschließend Manifestfragmente aus allen APEX-Dateien der Anbieter. Manifestfragmente werden aus dem
etc/vintf
-Verzeichnis jedes APEX-Objekts (z.B./apex/<apex name>/etc/vintf
) geladen.
Hinweise:
- Auf Legacy-Geräten werden das Legacy-Anbietermanifest und das ODM-Manifest verwendet. Das ODM-Manifest kann das alte Anbietermanifest vollständig überschreiben.
- Auf Geräten, die mit Android 9 eingeführt wurden, wird das ODM-Manifest mit dem Anbietermanifest kombiniert.
- Wenn du eine Liste von Manifesten kombinierst, können Manifeste, die später in der Liste erscheinen, Tags in Manifesten überschreiben, die früher in der Liste erscheinen, sofern die Tags im späteren Manifest das Attribut
override="true"
haben. So können im ODM-Manifest beispielsweise einige<hal>
-Tags aus dem Anbietermanifest überschrieben werden. Weitere Informationen finden Sie unten in der Dokumentation zum Attributoverride
.
- Wenn das Anbietermanifest vorhanden ist, kombinieren Sie Folgendes:
Mit dieser Konfiguration können mehrere Produkte mit demselben Board dasselbe Anbieter-Image (mit gemeinsamen HALs) verwenden, aber unterschiedliche ODM-Images (mit produktspezifischen HALs) haben.
Hier ein Beispiel für ein Anbietermanifest.
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="2.0" type="device" target-level="1"> <hal> <name>android.hardware.camera</name> <transport>hwbinder</transport> <version>3.4</version> <interface> <name>ICameraProvider</name> <instance>legacy/0</instance> <instance>proprietary/0</instance> </interface> </hal> <hal> <name>android.hardware.nfc</name> <transport>hwbinder</transport> <version>1.0</version> <version>2.0</version> <interface> <name>INfc</name> <instance>nfc_nci</instance> </interface> </hal> <hal> <name>android.hardware.nfc</name> <transport>hwbinder</transport> <fqname>@2.0::INfc/default</fqname> </hal> <hal> <name>android.hardware.drm</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ICryptoFactory</name> <instance>default</instance> </interface> <interface> <name>IDrmFactory</name> <instance>default</instance> </interface> <fqname>@1.1::ICryptoFactory/clearkey</fqname> <fqname>@1.1::IDrmFactory/clearkey</fqname> </hal> <hal format="aidl"> <name>android.hardware.light</name> <version>1</version> <fqname>ILights/default</fqname> </hal> <hal format="aidl"> <name>android.hardware.power</name> <version>2</version> <interface> <name>IPower</name> <instance>default</instance> </interface> </hal> <hal format="native"> <name>EGL</name> <version>1.1</version> </hal> <hal format="native"> <name>GLES</name> <version>1.1</version> <version>2.0</version> <version>3.0</version> </hal> <sepolicy> <version>25.0</version> </sepolicy> </manifest>
Hier ein Beispiel für ein ODM-Manifest.
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="1.0" type="device"> <!-- camera 3.4 in vendor manifest is ignored --> <hal override="true"> <name>android.hardware.camera</name> <transport>hwbinder</transport> <version>3.5</version> <interface> <name>ICameraProvider</name> <instance>legacy/0</instance> </interface> </hal> <!-- NFC is declared to be disabled --> <hal override="true"> <name>android.hardware.nfc</name> <transport>hwbinder</transport> </hal> <hal> <name>android.hardware.power</name> <transport>hwbinder</transport> <version>1.1</version> <interface> <name>IPower</name> <instance>default</instance> </interface> </hal> </manifest>
Hier ein Beispiel für ein Gerätemanifest in einem OTA-Paket.
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="1.0" type="device" target-level="1"> <!-- hals ommited --> <kernel version="4.4.176"> <config> <key>CONFIG_ANDROID</key> <value>y</value> </config> <config> <key>CONFIG_ARM64</key> <value>y</value> </config> <!-- other configs ommited --> </kernel> </manifest>
Weitere Informationen finden Sie unter Entwicklung des Gerätemanifests.
Framework-Manifest
Die Manifestdatei des Frameworks besteht aus dem Systemmanifest, dem Produktmanifest und dem Manifest „system_ext“.
-
Das Systemmanifest (von Google bereitgestellt) wird manuell generiert und befindet sich im Android-Quellbaum unter
/system/libhidl/manifest.xml
. - Das vom Gerät bereitgestellte Produktmanifest enthält HALs, die von Modulen bereitgestellt werden, die in der Produktpartition installiert sind.
-
Das vom Gerät bereitgestellte Manifest „system_ext“ enthält Folgendes:
- HALs, die von Modulen auf der Partition „system_ext“ verwaltet werden;
- VNDK-Versionen;
- System-SDK-Version.
Ähnlich wie beim Gerätemanifest können mehrere Fragmentdateien verwendet werden. Weitere Informationen finden Sie unter Manifest-Fragmente.
Hier ein Beispiel für ein Framework-Manifest.
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="1.0" type="framework"> <hal> <name>android.hidl.allocator</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>IAllocator</name> <instance>ashmem</instance> </interface> </hal> <hal> <name>android.hidl.memory</name> <transport arch="32+64">passthrough</transport> <version>1.0</version> <interface> <name>IMapper</name> <instance>ashmem</instance> </interface> </hal> <hal> <name>android.hidl.manager</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>IServiceManager</name> <instance>default</instance> </interface> </hal> <hal> <name>android.frameworks.sensorservice</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ISensorManager</name> <instance>default</instance> </interface> </hal> <hal max-level="5"> <name>android.frameworks.schedulerservice</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ISchedulingPolicyService</name> <instance>default</instance> </interface> </hal> <vendor-ndk> <version>27</version> </vendor-ndk> <system-sdk> <version>27</version> </system-sdk> </manifest>
Manifestfragmente
Unter Android 10 und höher können Sie einen Manifesteintrag einem HAL-Modul im Build-System zuordnen. So lässt sich das HAL-Modul einfacher bedingt in das Build-System einbinden.
Verwendungsbeispiele
Fügen Sie in der Datei Android.bp
oder Android.mk
jedem Modul, das explizit auf dem Gerät installiert ist, z. B. cc_binary
oder rust_binary
, vintf_fragments
hinzu.
Sie können das Modul beispielsweise mit Ihrer HAL-Implementierung (my.package.foo@1.0-service-bar
) ändern.
... { ... vintf_fragments: ["manifest_foo.xml"], ... }
LOCAL_MODULE := ... LOCAL_VINTF_FRAGMENTS := manifest_foo.xml
Erstellen Sie in einer Datei mit dem Namen manifest_foo.xml
das Manifest für dieses Modul. Dieses Manifest wird dem Gerät während der Buildzeit hinzugefügt. Das Hinzufügen eines Eintrags hier entspricht dem Hinzufügen eines Eintrags im Hauptmanifest des Geräts.
So können Clients die Oberfläche verwenden und VTS kann ermitteln, welche HAL-Implementierungen auf dem Gerät vorhanden sind. Dieses Manifest bietet alle Funktionen eines regulären Manifests.
Im folgenden Beispiel wird android.hardware.foo@1.0::IFoo/default
implementiert, das in der Partition vendor
oder odm
installiert wird. Wenn es auf der Partition system
, product
oder system_ext
installiert ist, verwenden Sie den Typ framework
anstelle des Typs device
.
<manifest version="1.0" type="device"> <hal format="hidl"> <name>android.hardware.foo</name> <transport>hwbinder</transport> <fqname>@1.0::IFoo/default</fqname> </hal> </manifest>
Wenn ein HAL-Modul in einem APEX des Anbieters verpackt ist, verpacken Sie die zugehörigen VINTF-Fragmente im selben APEX mit prebuilt_etc
, wie unter VINTF-Fragmente beschrieben.
Manifestdateischema
In diesem Abschnitt wird die Bedeutung dieser XML-Tags beschrieben. Einige „erforderliche“ Tags können in der Quelldatei im Android-Quellbaum fehlen und werden bei der Buildzeit von assemble_vintf
geschrieben. Die erforderlichen Tags müssen in den entsprechenden Dateien auf dem Gerät vorhanden sein.
?xml
- Optional. Bietet nur Informationen für den XML-Parser.
manifest.version
- Erforderlich. Metaversion dieses Manifests. Hier werden die Elemente beschrieben, die im Manifest erwartet werden. Hat nichts mit der XML-Version zu tun.
manifest.type
- Erforderlich. Der Typ dieses Manifests. Er hat den Wert
device
für die Gerätemanifestdatei undframework
für die Framework-Manifestdatei. manifest.target-level
- Erforderlich für das Gerätemanifest. Gibt die Version der Framework Compatibility Matrix (FCM) an, mit der dieses Gerätemanifest kompatibel sein soll. Diese Version wird auch als „ausgelieferte FCM-Version des Geräts“ bezeichnet.
manifest.hal
- Optional, kann wiederholt werden. Eine einzelne HAL (HIDL oder nativ, z. B. GL), je nach
format
-Attribut. manifest.hal.format
- Optional. Folgende Werte sind möglich:
hidl
: HIDL HALs. Das ist die Standardeinstellung.aidl
: AIDL HALs Nur gültig bei Manifest-Metaversion 2.0 und höher.native
: Native HALs.
manifest.hal.max-level
- Optional. Nur für Framework-Manifeste gültig. Wenn diese Option festgelegt ist, werden HALs mit einer maximalen Ebene, die niedriger als die Ziel-FCM-Version im Framework-Manifest ist, deaktiviert.
manifest.hal.override
- Optional. Folgende Werte sind möglich:
true
: Andere<hal>
-Elemente mit derselben<name>
- und Hauptversion überschreiben. Wenn dieses<hal>
-Element weder<version>
noch<fqname>
enthält, wird mit dem<hal>
-Element angegeben, dass diese HAL deaktiviert ist.false
: Überschreiben Sie keine anderen<hal>
-Elemente mit derselben<name>
und Hauptversion.
manifest.hal.name
- Erforderlich. Vollständig qualifizierter Paketname der HAL. Mehrere HAL-Einträge können denselben Namen verwenden. Beispiele:
android.hardware.camera
(HIDL- oder AIDL-HAL)GLES
(native HAL, nur Name erforderlich)
manifest.hal.transport
- Erforderlich, wenn
manifest.hal.format == "hidl"
. Andernfalls darf sie NICHT vorhanden sein. Gibt an, welcher Transport verwendet wird, wenn eine Schnittstelle aus diesem Paket vom Dienstmanager abgefragt wird. Folgende Werte sind möglich:hwbinder
: Binderized-Moduspassthrough
: Passthrough-Modus
- Optional bei
manifest.hal.format == "aidl"
. Andernfalls darf sie NICHT vorhanden sein. Gibt an, welcher Transport verwendet wird, wenn eine Benutzeroberfläche aus der Ferne bereitgestellt wird. Der Wert muss folgende Anforderungen erfüllen:inet
: Inet-Socket
manifest.hal.transport.ip
undmanifest.hal.transport.port
müssen verwendet werden, um die Inet-Verbindungsinformationen weiter anzugeben. manifest.hal.transport.arch
- Erforderlich für
passthrough
und darf fürhwbinder
nicht vorhanden sein. Beschreibt die Bitanzahl des bereitgestellten Passthrough-Dienstes. Folgende Werte sind möglich:32
: 32-Bit-Modus64
: 64-Bit-Modus32+64
: Beides
manifest.hal.transport.ip
- Erforderlich für
inet
und darf andernfalls NICHT vorhanden sein. Die IP-Adresse, von der aus die Remote-Benutzeroberfläche bereitgestellt wird. manifest.hal.transport.port
- Erforderlich für
inet
und darf andernfalls NICHT vorhanden sein. Beschreibt den Port, über den die Remote-Benutzeroberfläche bereitgestellt wird. manifest.hal.version
- Optional, kann wiederholt werden. Eine Version für die
hal
-Tags in einem Manifest.
Für HIDL- und native HALs ist das FormatMAJOR.MINOR
. Beispiele:hardware/interfaces
,vendor/${VENDOR}/interfaces
,frameworks/hardware/interfaces
odersystem/hardware/interfaces
.
HIDL- und native HALs können mehrere Versionsfelder verwenden, solange sie unterschiedliche Hauptversionen darstellen. Es darf nur eine Nebenversion pro Hauptversion angegeben werden. Beispielsweise können 3.1 und 3.2 nicht gleichzeitig verwendet werden, aber 1.0 und 3.4 schon. Dies gilt für allehal
-Elemente mit demselben Namen, sofern nichtoverride="true"
. Die Werte von<version>
sind nicht mit<fqname>
verknüpft, da<fqname>
eine Version hat.
Bei AIDL HALs darf<version>
auf Geräten mit Android 11 oder niedriger nicht vorhanden sein.<version>
muss auf Geräten mit Android 12 und höher eine einzelne Ganzzahl sein. Für jedes(package, interface, instance)
-Tupel darf es höchstens ein<version>
geben. Wenn nicht vorhanden, ist der Standardwert1
. Der Wert von<version>
ist allen<fqname>
in derselben<hal>
zugeordnet, da ein<fqname>
keine Version hat. manifest.hal.interface
- Erforderlich, kann wiederholt werden, ohne dass Duplikate entstehen. Geben Sie im Paket eine Schnittstelle mit einem Instanznamen an. Ein
<hal>
kann mehrere<interface>
-Elemente enthalten. Die Namen müssen eindeutig sein. manifest.hal.interface.name
- Erforderlich. Name der Schnittstelle.
manifest.hal.interface.instance
- Erforderlich, kann wiederholt werden. Instanzname der Schnittstelle. Es können mehrere Instanzen für eine Benutzeroberfläche vorhanden sein, aber keine duplizierten
<instance>
-Elemente. manifest.hal.fqname
- Optional, kann wiederholt werden. Eine alternative Möglichkeit, eine Instanz für die HAL mit dem Namen
manifest.hal.name
anzugeben.- Für HIDL HALs lautet das Format
@MAJOR.MINOR::INTERFACE/INSTANCE
. - Für AIDL HALs ist das Format
INTERFACE/INSTANCE
.
- Für HIDL HALs lautet das Format
manifest.sepolicy
- Erforderlich. Enthält alle sepolicy-bezogenen Einträge.
manifest.sepolicy.version
- Erforderlich für das Gerätemanifest. Gibt die SELinux-Version an. Sie hat das Format
SDK_INT.PLAT_INT
. manifest.vendor-ndk
- Erforderlich, kann wiederholt werden; erforderlich für das Framework-Manifest. Darf nicht im Gerätemanifest vorhanden sein. Mehrere
<vendor-ndk>
-Einträge müssen unterschiedliche<version>
s haben. Beschreibt eine Reihe von VNDK-Snapshots, die vom Framework bereitgestellt werden. manifest.vendor-ndk.version
- Erforderlich. Eine positive Ganzzahl, die die Version des VNDK-Snapshots darstellt.
manifest.vendor-ndk.library
- Optional, kann wiederholt werden, ohne Duplikate. Beschreibt eine Reihe von VNDK-Bibliotheken, die vom Framework für diesen VNDK-Anbieter-Snapshot bereitgestellt werden. Der Wert ist der Dateiname einer Bibliothek, z.B.
libjpeg.so
, einschließlich des Präfixeslib
und des Suffixes.so
. Pfadkomponenten sind nicht zulässig. manifest.system-sdk.version
- Optional, kann wiederholt werden, ohne Duplikate; wird nur vom Framework-Manifest verwendet. Beschreibt eine Reihe von System-SDK-Versionen, die vom Framework für Anbieter-Apps bereitgestellt werden.
manifest.kernel
- Optional. Hier werden statische Informationen zum Kernel beschrieben.
manifest.kernel.target-level
- Optional. Beschreibt den Kernel-Branch. Wenn der Wert nicht vorhanden ist, wird standardmäßig
manifest.target-level
verwendet. Muss größer oder gleichmanifest.target-level
sein. Weitere Informationen finden Sie unter Kernel-Abgleichsregeln.