Manifesta

Un oggetto VINTF aggrega i dati dal manifesto del dispositivo e dai file del manifesto del framework (XML). Entrambi i manifest condividono un formato, sebbene non tutti gli elementi si applichino a entrambi (per i dettagli sullo schema, vedere Schema del file manifest ).

Manifesto del dispositivo

Il manifesto del dispositivo (fornito dal dispositivo) è costituito dal manifesto del fornitore e dal manifesto ODM.

  • Il manifest del fornitore specifica gli HAL, le versioni della policy SELinux, ecc. Comuni a un SoC. Si consiglia di posizionarlo nella struttura ad albero dei sorgenti di Android in device/ VENDOR / DEVICE /manifest.xml , ma è possibile utilizzare più file di frammento. Per i dettagli, vedere Frammenti manifest e Generare DM da frammenti .
  • Il manifest ODM elenca gli HAL specifici del prodotto nella partizione ODM . L'oggetto VINTF carica il manifest ODM in questo ordine:
    1. Se SKU è definito (dove SKU è il valore della 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 manifesto del fornitore elenca gli HAL specifici del prodotto nella partizione del fornitore. L'oggetto VINTF carica il manifest del fornitore in questo ordine:
    1. Se SKU è definito (dove SKU è il valore della proprietà ro.boot.product.vendor.sku ), /vendor/etc/vintf/manifest_ SKU .xml
    2. /vendor/etc/vintf/manifest.xml
  • L'oggetto VINTF carica il manifesto del dispositivo in questo ordine:
    1. Se il manifesto del fornitore esiste, combina quanto segue:
      1. Il manifesto del fornitore
      2. Frammenti di manifesto del fornitore facoltativi
      3. Manifest ODM facoltativo
      4. Frammenti di manifesto ODM facoltativi
    2. In caso contrario, se esiste il manifest ODM, combinare il manifest ODM con i frammenti di manifest ODM facoltativi.
    3. /vendor/manifest.xml (legacy, nessun frammento)

    Notare che:

    • Sui dispositivi legacy, vengono utilizzati il ​​manifest del fornitore legacy e il manifest ODM. Il manifest ODM può sostituire completamente il manifest del fornitore legacy.
    • Sui dispositivi avviati con Android 9, il manifest ODM viene combinato con il manifest del fornitore.
    • Quando si combina un elenco di manifesti, i manifesti che compaiono più avanti nell'elenco possono sostituire i tag nei manifesti che compaiono prima nell'elenco, a condizione che i tag nel manifesto successivo abbiano l'attributo override="true" . Ad esempio, il manifest ODM può sovrascrivere alcuni tag <hal> dal manifest del fornitore. Vedere la documentazione per l' override attributi di seguito.

Questa configurazione consente a più prodotti con la stessa scheda di condividere la stessa immagine del fornitore (che fornisce HAL comuni) ma avere immagini ODM diverse (che specificano HAL specifici del prodotto).

Ecco un esempio di manifesto 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>

Ecco un esempio di manifesto del 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 ulteriori dettagli, vedere Sviluppo del manifesto del dispositivo .

Manifesto del framework

Il file manifest del framework è costituito dal manifest del sistema, dal manifest del prodotto e dal manifest system_ext.

  • Il manifest di sistema (fornito da Google) viene generato manualmente e risiede nell'albero dei sorgenti di Android in /system/libhidl/manifest.xml .
  • Il manifest del prodotto (fornito dal dispositivo) elenca gli HAL serviti dai moduli installati sulla partizione del prodotto.
  • Il manifest system_ext (fornito dal dispositivo) elenca quanto segue:
    • HAL serviti da moduli installati sulla partizione system_ext;
    • Versioni VNDK;
    • Versione dell'SDK di sistema.

Analogamente al manifesto del dispositivo, è possibile utilizzare più file di frammento. Per i dettagli, vedere Frammenti di manifesto .

Ecco un manifesto del framework di esempio.

<?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>
    <vendor-ndk>
        <version>27</version>
    </vendor-ndk>
    <system-sdk>
        <version>27</version>
    </system-sdk>
</manifest>

Frammenti manifesti

In Android 10 e versioni successive, puoi associare una voce manifest a un modulo HAL nel sistema di compilazione. Ciò semplifica l'inclusione condizionale del modulo HAL nel sistema di compilazione.

Esempio

Nel tuo file Android.bp o Android.mk , aggiungi vintf_fragments a qualsiasi modulo. Ad esempio, puoi modificare il modulo con la tua implementazione del tuo HAL ( my.package.foo@1.0-service-bar ).

... {
    ...
    vintf_fragments: ["manifest_foo.xml"],
    ...
}
LOCAL_MODULE := ...
LOCAL_VINTF_FRAGMENTS := manifest_foo.xml

In un file chiamato manifest_foo.xml , crea il manifest per questo modulo. In fase di compilazione, questo manifest viene aggiunto al dispositivo. L'aggiunta di una voce qui equivale all'aggiunta di una voce nel manifest principale del dispositivo. Ciò consente ai client di utilizzare l'interfaccia e consente a VTS di identificare quali implementazioni HAL si trovano sul dispositivo. Qualunque cosa faccia un manifesto regolare, lo fa anche questo manifesto.

L'esempio seguente implementa android.hardware.foo@1.0::IFoo/default , che viene installato nella partizione del vendor o odm . Se è installato nel system , nel product o system_ext partizione system_ext , utilizza il tipo framework anziché il 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>

Schema del file manifest

Questa sezione descrive il significato di questi tag XML. Alcuni tag "obbligatori" potrebbero non essere presenti nel file sorgente nell'albero dei sorgenti di Android e scritti da assemble_vintf in fase di compilazione. I tag richiesti devono essere presenti nei file corrispondenti sul dispositivo.

?xml
Opzionale. Fornisce informazioni solo al parser XML.
manifest.version
Necessario. Meta-versione di questo manifesto. Descrive gli elementi previsti nel manifest. Non correlato alla versione XML.
manifest.type
Necessario. Tipo di questo manifesto. Ha il valore device per il file manifest del dispositivo e framework per il file manifest del framework.
manifest.target-level
Obbligatorio per il manifesto del dispositivo. Specifica la versione della matrice di compatibilità del framework (FCM) con cui questo manifesto del dispositivo deve essere compatibile. Questa è anche chiamata versione FCM di spedizione del dispositivo.
manifest.hal
Facoltativo, può ripetere. Un singolo HAL (HIDL o nativo, come GL), a seconda dell'attributo di format .
manifest.hal.format
Opzionale. Il valore può essere uno tra:
  • hidl : HIDL HAL. Questa è l'impostazione predefinita.
  • aidl : AIDL HALs . Valido solo a manifest meta-versione 2.0 e successive.
  • native : HAL nativi.
manifest.hal.override
Opzionale. Il valore può essere uno tra:
  • true : sovrascrive altri elementi <hal> con lo stesso <name> e la versione principale. Se in questo elemento <hal> non sono presenti <version> o <fqname> , l'elemento <hal> dichiara che questo HAL è disabilitato.
  • false : non sovrascrivere altri elementi <hal> con lo stesso <name> e la versione principale.
manifest.hal.name
Necessario. Nome completo del pacchetto dell'HAL. Più voci HAL possono utilizzare lo stesso nome. Esempi:
  • android.hardware.camera (HIDL o AIDL HAL)
  • GLES (HAL nativo, richiede solo il nome)
manifest.hal.transport
Richiesto quando manifest.hal.format == "hidl" . NON deve essere presente altrimenti. Indica quale trasporto viene utilizzato quando un'interfaccia di questo pacchetto viene interrogata dal gestore del servizio. Il valore può essere uno tra:
  • hwbinder : modalità binderized
  • passthrough : modalità passthrough
manifest.hal.transport.arch
Necessario per il passthrough e non deve essere presente per hwbinder . Descrive la testimonianza del servizio passthrough fornito. Il valore può essere uno tra:
  • 32 : modalità a 32 bit
  • 64 : modalità a 64 bit
  • 32+64 : entrambi
manifest.hal.version
Facoltativo, può ripetere. Una versione per i tag hal in un manifest.

Per HIDL e HAL nativi, il formato è MAJOR . MINOR . Per esempi, fare riferimento a hardware/interfaces , vendor/${VENDOR}/interfaces , framework/hardware/interfaces o system/hardware/interfaces .

HIDL e gli HAL nativi possono utilizzare più campi di versione purché rappresentino versioni principali distinte , con una sola versione secondaria per versione principale fornita. Ad esempio, 3.1 e 3.2 non possono coesistere, ma 1.0 e 3.4 possono. Questo si applica a tutti gli elementi hal con lo stesso nome, a meno che override="true" . I valori di <version> non sono associati a <fqname> perché <fqname> contiene una versione.

Per gli HAL AIDL, <version> non deve essere presente sui dispositivi con Android 11 e <version> . <version> deve essere un numero intero singolo sui dispositivi con Android 12 e versioni successive. Deve essere presente al massimo una <version> per ogni tupla (package, interface, instance) . Se non presente, il valore predefinito è 1 . Il valore di <version> è associato a tutti i <fqname> nello stesso <hal> perché <fqname> non ha una versione.
manifest.hal.interface
Obbligatorio, può essere ripetuto senza duplicati. Indicare un'interfaccia nel pacchetto che ha un nome di istanza. Possono esserci più elementi <interface> in un <hal> ; i nomi devono essere distinti.
manifest.hal.interface.name
Necessario. Nome dell'interfaccia.
manifest.hal.interface.instance
Obbligatorio, può ripetere. Nome istanza dell'interfaccia. Può avere più istanze per un'interfaccia ma nessun elemento <instance> duplicato.
manifest.hal.fqname
Facoltativo, può ripetere. Un modo alternativo per specificare un'istanza per l'HAL con il nome manifest.hal.name .
  • Per HIDL HAL, il formato è @ MAJOR . MINOR :: INTERFACE / INSTANCE .
  • Per gli HAL AIDL, il formato è INTERFACE / INSTANCE .
manifest.sepolicy
Necessario. Contiene tutte le voci relative a sepolicy.
manifest.sepolicy.version
Obbligatorio per il manifesto del dispositivo. Dichiara la versione di SELinux. Ha il formato SDK_INT . PLAT_INT .
manifest.vendor-ndk
Richiesto, può ripetere; richiesto per il manifesto del framework. Non deve essere presente nel manifest del dispositivo. Più voci <vendor-ndk> devono avere <version> diverse. Descrive una serie di istantanee VNDK fornite dal framework.
manifest.vendor-ndk.version
Necessario. Questo è un numero intero positivo che rappresenta la versione dello snapshot VNDK.
manifest.vendor-ndk.library
Facoltativo, può ripetere, senza duplicati. Descrive una serie di librerie VNDK fornite dal framework per questa istantanea del fornitore VNDK. Il valore è il nome del file di una libreria, ad esempio libjpeg.so , incluso il prefisso lib e il suffisso .so . Non sono consentiti componenti di percorso.
manifest.system-sdk.version
Facoltativo, può ripetere, senza duplicati; utilizzato solo dal manifesto del framework. Descrive un set di versioni dell'SDK di sistema fornite dal framework alle app del fornitore.
manifest.kernel
Opzionale. Descrive le informazioni statiche sul kernel.
manifest.kernel.target-level
Opzionale. Descrive il ramo del kernel. Il suo valore predefinito è manifest.target-level se non è presente. Deve essere maggiore o uguale a manifest.target-level . Vedi le regole di corrispondenza del kernel per i dettagli.