Manifest

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:
    1. Se SKU è definito (dove SKU è il valore di la proprietà ro.boot.product.hardware.sku), /odm/etc/vintf/manifest_SKU.xml
    2. /odm/etc/vintf/manifest.xml
    3. Se SKU è definito, /odm/etc/manifest_SKU.xml
    4. /odm/etc/manifest.xml
  • 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:
    1. Se SKU è definito (dove SKU è il valore di la proprietà ro.boot.product.vendor.sku), /vendor/etc/vintf/manifest_SKU.xml
    2. /vendor/etc/vintf/manifest.xml
  • L'oggetto VINTF carica il manifest del dispositivo nel seguente ordine:
    1. Se il file manifest del fornitore esiste, combina quanto segue:
      1. Il file manifest del fornitore
      2. Frammenti manifest facoltativi del fornitore
      3. Manifest ODM facoltativo
      4. Frammenti di manifest ODM facoltativi
    2. In caso contrario, se esiste il manifest ODM, combinalo con quello facoltativo del file manifest.
    3. /vendor/manifest.xml (legacy, senza frammenti)
    4. 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'attributo override di seguito.

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 e framework 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à Binderizzata
  • passthrough: modalità passthrough
di Gemini Advanced.
.
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
di Gemini Advanced. manifest.hal.transport.ip e manifest.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 per hwbinder. Descrive il livello di bit del servizio passthrough che è fornito. Il valore può essere uno dei seguenti:
  • 32: modalità a 32 bit
  • 64: modalità a 64 bit
  • 32+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 a hardware/interfaces, vendor/${VENDOR}/interfaces, frameworks/hardware/interfaces, oppure system/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 elementi hal con lo stesso nome, a meno che override="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.
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 prefisso lib 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 a manifest.target-level. Consulta regole di corrispondenza del kernel per maggiori dettagli.