Matrizes de compatibilidade

Esta seção descreve as matrizes de compatibilidade do framework e do dispositivo e o esquema da matriz de compatibilidade. Para regras de correspondência, consulte Regras de correspondência.

Matriz de compatibilidade do framework (FCM, na sigla em inglês)

A matriz de compatibilidade do framework (FCM, na sigla em inglês) descreve os requisitos do framework no dispositivo em que ele é executado. A matriz de compatibilidade do framework consiste na matriz de compatibilidade do sistema, na matriz de compatibilidade do produto e na matriz de compatibilidade do system_ext. Os requisitos do FCM precisam ser atendidos pelo manifesto do dispositivo (requisitos aplicados no momento do build, no ambiente de execução e no VTS).

O FCM system_ext e o FCM do produto são complementos do FCM específico do dispositivo (instalado na partição do sistema).

  • O FCM do dispositivo precisa refletir os requisitos dos módulos na partição do sistema.
  • O FCM system_ext precisa refletir os requisitos por módulos na partição system_ext.
  • O FCM do produto precisa refletir os requisitos por módulos na partição do produto.

Todos os FCMs precisam estar alinhados com as modificações de um OEM no framework nas partições do sistema, do produto e do system_ext. Por exemplo, se um app instalado na partição do produto usar uma extensão do fornecedor de uma interface HAL, o requisito da interface HAL precisará ser declarado no FCM do produto.

Exemplo de arquivo de matriz de compatibilidade do sistema:

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

Para mais detalhes, consulte Ciclo de vida do FCM.

Matriz de compatibilidade de produtos

O FCM do produto é um arquivo de matriz de compatibilidade do framework na partição do produto. O objeto VINTF une o FCM do produto com os FCMs nas partições do sistema e do system_ext no momento da execução.

Exemplo de arquivo FCM do produto:

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

Matriz de compatibilidade do system_ext

O FCM system_ext é um arquivo de matriz de compatibilidade do framework na partição system_ext. O objeto VINTF une o FCM system_ext com FCMs nas partições do sistema e do produto no momento de execução. Consulte a matriz de compatibilidade de produtos para conferir um exemplo de arquivo system_ext do FCM.

Matriz de compatibilidade do dispositivo (DCM)

A matriz de compatibilidade do dispositivo descreve um conjunto de requisitos que o dispositivo espera do framework (requisitos aplicados no lançamento e no tempo de OTA).

Exemplo de arquivo DCM:

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

Esquema da matriz de compatibilidade

Esta seção descreve o significado dessas tags XML. Algumas tags "required" podem estar ausentes do arquivo de origem na árvore de origem do Android e serem gravadas por assemble_vintf no momento da build. As tags "Required" precisam estar presentes nos arquivos correspondentes no dispositivo.

?xml
Opcional. Ele só fornece informações para o analisador de XML.
compatibility-matrix.version
Obrigatório. Metaversão desta matriz de compatibilidade. Descreve os elementos esperados na matriz de compatibilidade. Não está relacionado à versão do XML.
compatibility-matrix.type
Obrigatório. Tipo desta matriz de compatibilidade:
  • "device": matriz de compatibilidade do dispositivo.
  • "framework": matriz de compatibilidade do framework.
manifest.level
Obrigatório para a matriz de compatibilidade do framework. No Android 12 e versões mais recentes, permitido em arquivos de matriz de compatibilidade do framework nas partições do produto e do system_ext. Especifica a versão da matriz de compatibilidade do framework (FCM) deste arquivo. Não declare isso na matriz de compatibilidade do framework específica do dispositivo (ou seja, DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE).
compatibility-matrix.hal
Opcional e pode ser repetido. Lista um único HAL (HIDL ou nativo) que é necessário que o proprietário da matriz de compatibilidade (framework ou dispositivo) esteja presente. As entradas HAL são distinguidas por um elemento <name>. Pode haver várias entradas HAL com o mesmo nome (implica a condição "e").
compatibility-matrix.hal.format
Opcional. O valor pode ser um destes:
  • "hidl": HALs do HIDL. Esse é o padrão.
  • "aidl": HALs AIDL. Válido apenas na metaversão 2.0 da matriz de compatibilidade.
  • "native": HALs nativos.
compatibility-matrix.hal.optional (Android 15 ou versões anteriores)
O atributo
é opcional e tem o padrão falso. Indica se essa HAL é opcional para o proprietário da matriz de compatibilidade (framework ou dispositivo). Se uma entrada <hal> estiver marcada como opcional, significa que o proprietário pode trabalhar com esse HAL, se ele estiver presente, mas não exige que ele esteja presente.
Aviso: esse atributo foi descontinuado após o Android 15 e não tem mais efeito. Se algum HAL precisar ser instalado, esse requisito será aplicado nos testes.
compatibility-matrix.hal.name
Obrigatório. Nome completo do pacote deste HAL. Exemplos:
  • android.hardware.camera (HAL de HIDL ou AIDL)
  • GLES (HAL nativo, requer apenas o nome)
compatibility-matrix.hal.version
Uma lista de intervalos de versões (consulte Correspondências de HAL) que define quais versões o proprietário da matriz de compatibilidade (framework ou dispositivo) espera.

Para HIDL e HALs nativos, obrigatório, pode ser repetido sem duplicações. O formato é um dos seguintes:
  • MAJOR.MINOR_MIN-MINOR_MAX
  • MAJOR.MINOR (equivalente a MAJOR.MINOR-MINOR)

Para HALs AIDL, não pode estar presente em dispositivos com o Android 11 e versões anteriores. Opcional em dispositivos com versões mais recentes. Se especificado, o formato é um dos seguintes:
  • VERSION_MIN-VERSION_MAX
  • VERSION (equivalente a VERSION-VERSION)
Se não for especificado, o valor padrão será 1.
compatibility-matrix.hal.interface
Opcional, pode repetir. Uma lista de interfaces obrigatórias deste HAL.
compatibility-matrix.hal.interface.name
Obrigatório. Nome da interface.
compatibility-matrix.hal.interface.instance
Opcional, pode repetir. Uma lista de instâncias necessárias desta interface.
compatibility-matrix.hal.interface.regex-instance
Opcional, pode repetir. Uma lista de padrões de nome de instância obrigatórios nesta interface. Use o formato de expressão regular estendida.
compatibility-matrix.kernel
Opcional, pode repetir. Especifique uma lista de configurações do kernel que o framework requer em cada versão do kernel.
Vários <kernel> com o mesmo <version> podem existir para implicar uma relação "e". Cada <kernel> é um "fragmento" dos requisitos que são ativados somente quando <conditions> são atendidos.
compatibility-matrix.kernel.version
Obrigatório. Versão do kernel. O formato é VERSION.MAJOR_REVISION.MINOR_REVISION. A versão e a revisão principal precisam ser exatamente iguais. A revisão secundária define a versão mínima do LTS do kernel que o framework espera.
compatibility-matrix.kernel.condition
Opcional. Não pode existir para o primeiro <kernel> de cada versão. Especifica uma lista de condições. Quando as condições são atendidas, os requisitos indicados neste fragmento <kernel> são ativados.
compatibility-matrix.kernel.config
Opcional, pode repetir. Lista os itens CONFIG que precisam ser correspondidos para essa versão do kernel. Cada item CONFIG é um par de chave-valor. Os itens de configuração são diferenciados por chave.
compatibility-matrix.kernel.config.key
Obrigatório. Nome da chave do item CONFIG. Começa com CONFIG_.
compatibility-matrix.kernel.config.value
Obrigatório. Valor do item CONFIG. O formato depende do tipo:
  • string. Aspas são omitidas.
  • int. Valores decimais e hexadecimais (precisam começar com 0x ou 0X) são aceitos. Interpretado como um número inteiro de 64 bits; os estouros resultam em truncamento. O analisador aceita valores de -264 + 1 a 264 - 1, o 65º bit é truncado. Para mais detalhes, consulte a página de manual strtoull.
  • range. O formato é [int]-[int], por exemplo, 10-20. Os valores hexadecimais são aceitos e precisam começar com 0x ou 0X. Dois limites precisam ser um número inteiro não assinado de 64 bits.
  • tristate. Os valores válidos são y, m e n.
compatibility-matrix.kernel.config.value.type
Obrigatório. Tipo do valor do item CONFIG:
  • string
  • int
  • range
  • tristate
compatibility-matrix.sepolicy
Obrigatório. Contém todas as entradas relacionadas à política de segurança. Usado apenas pela matriz de compatibilidade do framework.
compatibility-matrix.sepolicy.sepolicy-version
Obrigatório, pode ser repetido. Descreve o requisito na versão da sepolicy. Corresponde a manifest.sepolicy.version. Cada instância de um elemento define um intervalo de versões de política de segurança.
compatibility-matrix.sepolicy.kernel-sepolicy-version
Obrigatório. Declara a versão do policydb com que o framework funciona.
compatibility-matrix.avb.vbmeta-version
Opcional, usado apenas pela matriz de compatibilidade do framework. Declara a versão AVB usada para assinar system.img. Descontinuado no Android 10.
compatibility-matrix.vendor-ndk
Opcional, usado apenas pela matriz de compatibilidade do dispositivo. Declara o requisito do snapshot do fornecedor do VNDK. Se estiver ausente, nenhum requisito do VNDK será feito na imagem do sistema.
compatibility-matrix.vendor-ndk.version
Obrigatório. Um número inteiro positivo que declara uma versão do VNDK exigida pela imagem do fornecedor.
compatibility-matrix.vendor-ndk.library
Opcional, pode repetir. Declara um conjunto de bibliotecas do VNDK exigidas pela imagem do fornecedor. Mesma semântica que manifest.vendor-ndk.library.
compatibility-matrix.system-sdk.version
Opcional, pode ser repetido; usado apenas pela matriz de compatibilidade do dispositivo. Declara o requisito por apps do fornecedor nas versões do SDK do sistema. Se estiver ausente, nenhum requisito do SDK do sistema será feito na imagem do sistema.