Un oggetto VINTF aggrega i dati dal device file manifest e manifest del framework (XML). Entrambi I file manifest condividono un formato, anche se non tutti gli elementi si applicano a entrambi (per i dettagli sullo schema, vedi Schema del file manifest).
Manifest del dispositivo
Il file manifest del dispositivo (fornito dal dispositivo) è il file manifest del fornitore e il manifest ODM.
- Il file manifest del fornitore specifica gli HAL, le versioni dei criteri SELinux e così via comuni a un SoC. it
si consiglia di posizionarlo nella struttura di origine Android all'indirizzo
device/VENDOR/DEVICE/manifest.xml
, ma più frammenti è possibile usare diversi file. Per maggiori dettagli, vedi Frammenti di manifest e Genera messaggio diretto da frammenti. - Il file manifest ODM elenca gli HAL specifici per il prodotto nel
partizione ODM.
L'oggetto VINTF carica il manifest ODM nel seguente ordine:
- Se
SKU
è definito (doveSKU
è il valore di la proprietàro.boot.product.hardware.sku
),/odm/etc/vintf/manifest_SKU.xml
/odm/etc/vintf/manifest.xml
- Se
SKU
è definito,/odm/etc/manifest_SKU.xml
/odm/etc/manifest.xml
- Se
- Il file manifest del fornitore elenca gli HAL specifici per il prodotto nella partizione del fornitore.
L'oggetto VINTF carica il manifest del fornitore nel seguente ordine:
- Se
SKU
è definito (doveSKU
è il valore di la proprietàro.boot.product.vendor.sku
),/vendor/etc/vintf/manifest_SKU.xml
/vendor/etc/vintf/manifest.xml
- Se
- L'oggetto VINTF carica il manifest del dispositivo nel seguente ordine:
- Se il file manifest del fornitore esiste, combina quanto segue:
- Il file manifest del fornitore
- Frammenti manifest facoltativi del fornitore
- Manifest ODM facoltativo
- Frammenti di manifest ODM facoltativi
- In caso contrario, se esiste il manifest ODM, combinalo con quello facoltativo del file manifest.
/vendor/manifest.xml
(legacy, senza frammenti)- Infine, combina frammenti manifest degli APEX di qualsiasi fornitore.
Tieni presente che:
- Sui dispositivi legacy, vengono utilizzati il manifest del fornitore precedente e il manifest ODM. La Il file manifest ODM potrebbe sostituire completamente il manifest del fornitore precedente.
- Sui dispositivi lanciati con Android 9, il manifest ODM viene combinato con il manifest del fornitore.
- Quando combini un elenco di manifest, quelli che appaiono più avanti nell'elenco potrebbero avere la precedenza
nei file manifest visualizzati in precedenza nell'elenco, a condizione che i tag
hanno l'attributo
override="true"
. Ad esempio, il manifest ODM può eseguono l'override di alcuni tag<hal>
del file manifest del fornitore. Consulta la documentazione per l'attributooverride
di seguito.
- Se il file manifest del fornitore esiste, combina quanto segue:
Questa configurazione consente a più prodotti con la stessa lavagna di condividere lo stesso dell'immagine del fornitore (che offre gli HAL più comuni), ma hanno immagini ODM diverse (che specifica HAL specifici per il prodotto).
Di seguito è riportato un esempio di file manifest del fornitore.
<?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>
Ecco un esempio di manifest ODM.
<?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>
Di seguito è riportato un esempio di file manifest di un dispositivo in un pacchetto OTA.
<?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>
Per maggiori dettagli, vedi File manifest del dispositivo Sviluppo.
Manifest del framework
Il file manifest del framework è composto dal manifest di sistema, dal manifest del prodotto e manifest system_ext.
-
Il file manifest di sistema (fornito da Google) viene generato manualmente e
si trova nella struttura di origine Android all'indirizzo
/system/libhidl/manifest.xml
. - Il file manifest del prodotto (fornito dal dispositivo) elenca gli HAL serviti dai moduli installati partizione prodotto.
-
Il manifest system_ext (fornito dal dispositivo) elenca i seguenti elementi:
- HAL serviti da moduli installati sulla partizione system_ext;
- Versioni VNDK;
- Versione SDK di sistema.
Analogamente al file manifest del dispositivo, è possibile utilizzare più file di frammenti. Per maggiori dettagli, vedi Frammenti di manifest.
Di seguito è riportato un esempio di file manifest del framework.
<?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>
Frammenti manifest
In Android 10 e versioni successive, puoi associare un file manifest con un modulo HAL nel sistema di compilazione. In questo modo è più facile includere in modo condizionale il modulo HAL nel sistema di compilazione.
Esempio
Nel file Android.bp
o Android.mk
, aggiungi
vintf_fragments
a qualsiasi modulo. Ad esempio, puoi modificare
il modulo con la tua implementazione dell'HAL
(my.package.foo@1.0-service-bar
)
... { ... vintf_fragments: ["manifest_foo.xml"], ... }
LOCAL_MODULE := ... LOCAL_VINTF_FRAGMENTS := manifest_foo.xml
In un file denominato manifest_foo.xml
, crea il manifest per
in questo modulo. Questo manifest viene aggiunto al dispositivo in fase di creazione. Aggiunta in corso...
Una voce qui è come aggiungere una voce nel file manifest principale del dispositivo.
In questo modo i client possono utilizzare l'interfaccia e VTS può identificare quale HAL
le implementazioni sono disponibili sul dispositivo. Qualsiasi elemento che un normale manifest
lo stesso vale per il file manifest.
L'esempio riportato di seguito implementa
android.hardware.foo@1.0::IFoo/default
, che è installato in
la partizione vendor
o odm
. Se è installata
Partizione system
, product
o system_ext
, utilizza tipo
framework
anziché
tipo 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>
Se un modulo HAL viene pacchettizzato nell'APEX di un fornitore,
pacchettizzare i suoi frammenti VINTF associati all'interno dello stesso APEX con prebuilt_etc
come
è spiegato nei frammenti VINTF.
Schema del file manifest
Questa sezione descrive il significato di questi tag XML. Alcuni elementi "obbligatori" tag
potrebbe non essere presente nel file di origine nella struttura di origine Android ed essere scritto da
assemble_vintf
in fase di creazione. I tag obbligatori devono essere presenti nei file corrispondenti sulla
dispositivo.
?xml
- Facoltativo. Fornisce solo informazioni al parser XML.
manifest.version
- Obbligatorio. Meta-versione di questo manifest. Descrive il gli elementi previsti nel manifest. Non correlato alla versione XML.
manifest.type
- Obbligatorio. Tipo di manifest. Ha il valore
device
per il file manifest del dispositivo eframework
per il manifest del framework . manifest.target-level
- Obbligatorio per il file manifest del dispositivo. Specifica la matrice di compatibilità del framework (FCM) che deve essere compatibile con il file manifest di questo dispositivo con. Questa è anche chiamata versione FCM di spedizione del dispositivo.
manifest.hal
- Facoltativo, può essere ripetuto. Un singolo HAL (HIDL o nativo, ad esempio GL),
a seconda dell'attributo
format
. manifest.hal.format
- Facoltativo. Il valore può essere uno dei seguenti:
hidl
: HIDL HAL. Questa è l'impostazione predefinita.aidl
: AIDL HAL. Valido solo per la meta-versione manifest 2.0 e superiore.native
: HAL nativi.
manifest.hal.max-level
- Facoltativo. Valido solo sui manifest del framework. Se impostato, gli HAL con un livello massimo inferiore rispetto alla versione FCM di destinazione nel file manifest del framework.
manifest.hal.override
- Facoltativo. Il valore può essere uno dei seguenti:
true
: sostituisci altri elementi<hal>
con la stessa<name>
e la versione principale. In caso contrario<version>
o<fqname>
sono presenti<hal>
, poi l'elemento<hal>
dichiara che questo HAL è disabilitato.false
: non sostituire altri elementi<hal>
con lo stesso<name>
e la versione principale.
manifest.hal.name
- Obbligatorio. Nome completo del pacchetto dell'HAL. Più voci HAL possono utilizzare
con lo stesso nome. Esempi:
android.hardware.camera
(HIDL o AIDL HAL)GLES
(HAL nativo, richiede solo il nome)
manifest.hal.transport
- Obbligatorio quando
manifest.hal.format == "hidl"
. NON deve essere presenti in altri casi. Indica quale trasporto viene utilizzato quando un'interfaccia la query sul pacchetto viene inviata dal gestore del servizio. Il valore può essere uno dei seguenti:hwbinder
: modalità Binderizzatapassthrough
: modalità passthrough
.
- Facoltativo quando
manifest.hal.format == "aidl"
. NON deve essere presenti in altri casi. Indica quale trasporto viene utilizzato quando viene fornita un'interfaccia da remoto. Il valore deve essere:inet
: socket Inet
manifest.hal.transport.ip
emanifest.hal.transport.port
deve essere utilizzato per specificare ulteriormente le informazioni di connessione Inet. manifest.hal.transport.arch
- Obbligatorio per
passthrough
e non deve essere presente perhwbinder
. Descrive il livello di bit del servizio passthrough che è fornito. Il valore può essere uno dei seguenti:32
: modalità a 32 bit64
: modalità a 64 bit32+64
: entrambi
manifest.hal.transport.ip
- Obbligatorio per
inet
e NON deve essere presente in caso contrario. Descrive l'indirizzo IP da cui viene fornita l'interfaccia remota. manifest.hal.transport.port
- Obbligatorio per
inet
e NON deve essere presente in caso contrario. Descrive la porta da utilizzata dall'interfaccia remota. manifest.hal.version
- Facoltativo, può essere ripetuto. Una versione per i tag
hal
in un del file manifest.
Per HIDL e HAL nativi, il formato èMAJOR.MINOR
. Per esempi, fai riferimento ahardware/interfaces
,vendor/${VENDOR}/interfaces
,frameworks/hardware/interfaces
, oppuresystem/hardware/interfaces
.
Gli HAL HIDL e nativi possono utilizzare più campi di versione purché rappresentino versioni principali distinte, con una sola versione secondaria per maggiore la versione fornita. Ad esempio, 3.1 e 3.2 non possono coesistere, mentre 1.0 e 3.4 possono coesistere. Questo vale per tutti gli elementihal
con lo stesso nome, a meno cheoverride="true"
. I valori di<version>
non sono associata a<fqname>
perché<fqname>
porta una versione.
Per gli HAL AIDL,<version>
non deve essere presente sui dispositivi in esecuzione Android 11 e versioni precedenti.<version>
deve essere un numero intero singolo su dispositivi con Android 12 e versioni successive. Deve essere al massimo un<version>
per ciascuno Tupla(package, interface, instance)
. Se non è presente, il valore predefinito è1
. Il valore di<version>
è associato a tutti i<fqname>
in<hal>
perché un<fqname>
non dispone di una versione. manifest.hal.interface
- Obbligatorio, può essere ripetuto senza duplicati. Indica un'interfaccia nel
un pacchetto con un nome istanza. Possono esserci più
<interface>
elementi in un<hal>
; nomi devono essere distinti. manifest.hal.interface.name
- Obbligatorio. Nome dell'interfaccia.
manifest.hal.interface.instance
- Obbligatorio, può ripetersi. Nome istanza dell'interfaccia. Può avere più
per un'interfaccia, ma nessun elemento
<instance>
duplicato elementi. manifest.hal.fqname
- Facoltativo, può essere ripetuto. Un modo alternativo per specificare un'istanza per l'HAL
con nome
manifest.hal.name
.- Per gli HAL HIDL, il formato è
@MAJOR.MINOR::INTERFACE/INSTANCE
. - Per gli HAL AIDL, il formato è
INTERFACE/INSTANCE
.
- Per gli HAL HIDL, il formato è
manifest.sepolicy
- Obbligatorio. Contiene tutte le voci relative a sepolicy.
manifest.sepolicy.version
- Obbligatorio per il file manifest del dispositivo. Dichiara la versione SELinux. Ha
formato
SDK_INT.PLAT_INT
. manifest.vendor-ndk
- Obbligatorio, può ripetersi; richiesti per il manifest del framework. Non deve essere presente
nel manifest del dispositivo. Più voci
<vendor-ndk>
devono avere<version>
diversi. Descrive un insieme di snapshot VNDK forniti dal framework. manifest.vendor-ndk.version
- Obbligatorio. Si tratta di un numero intero positivo che rappresenta la versione del VNDK senza dover creare uno snapshot.
manifest.vendor-ndk.library
- Facoltativo, può ripetersi, senza duplicati. Descrive un insieme di librerie VNDK
forniti dal framework per lo snapshot del fornitore VNDK. Il valore corrisponde a
il nome file di una libreria, ad esempio
libjpeg.so
, incluso il prefissolib
e il suffisso.so
. Nessun componente del percorso è consentito. manifest.system-sdk.version
- Facoltativo, può ripetersi, senza duplicati; usata solo dal framework del file manifest. Descrive un insieme di versioni dell'SDK di sistema fornite dal framework per app dei fornitori.
manifest.kernel
- Facoltativo. Descrive le informazioni statiche sul kernel.
manifest.kernel.target-level
- Facoltativo. Descrive il ramo del kernel. Il valore predefinito è
manifest.target-level
se non presente. Deve essere maggiore di o uguale amanifest.target-level
. Consulta regole di corrispondenza del kernel per maggiori dettagli.