Compatibilidade com telas de carro

A compatibilidade com telas de carro permite que apps para smartphones e tablets funcionem bem em dispositivos automotivos.

Os recursos incluem:

  • Escalonamento de DPI:dimensione os elementos da interface do app com base no DPI da tela.
  • Área segura para renderização de apps:contenha o conteúdo do app em uma área segura, evitando o escurecimento por elementos da interface do sistema.
  • Lógica de classificação de apps:identifica apps que exigem compatibilidade com telas de carro.

Recursos de compatibilidade

A plataforma oferece vários mecanismos para otimizar a renderização e o dimensionamento de apps em telas automotivas.

Escalonamento de DPI

Com o recurso de escalonamento de DPI, os fabricantes de dispositivos podem ajustar a densidade de DPI de apps individuais ou de todos os apps que exigem compatibilidade com a tela do carro.

Para configurar o ajuste de escala de densidade dos apps:

  1. Adicione um arquivo de configuração /product/etc/display_compat_config.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <!--
        Each scale factor can have the following attributes
    
        display     (required) Specifies the displayId to which this scale factor will be applied.
        packageName (optional) Specifies the packageName to which the scale factor will be applied.
                    If omitted, the scaling will apply to all packages.
    
        For example:
        <scale display="0" packageName="com.android.car.media.localmediaplayer">0.5</scale>
    
        This means that only package `com.android.car.media.localmediaplayer` on display `0` will be scaled.
    -->
    <config>
    <scale display="0">1.0</scale>
    </config>
    
  2. Para definir um valor de escala padrão para todos os apps que exigem compatibilidade com a tela do carro, mude a escala padrão da tela 0 para <scale display="0">1.0</scale>. O valor é o valor de escala inversa. Por exemplo, para dimensionar apps que exigem compatibilidade com o visor do carro em 1,5x, defina o valor de escala como (1 / 1.5) = 0.67:

    <config>
        <scale display="0">0.67</scale>
    </config>
    
  3. Para definir um valor de escala para um app específico, adicione um novo elemento scale à configuração. Neste exemplo, o YouTube Automotive é dimensionado para 1,43x (por exemplo, (1 / 1.43) = 0.7).

    <config>
        <scale display="0">0.67</scale>
        <scale display="0" packageName="com.google.android.apps.automotive.youtube">0.7</scale>
    </config>
    

Se o sistema estava em execução quando você mudou /product/etc/display_compat_config.xml, limpe o cache para que a nova configuração entre em vigor. Use esta macro para limpar o cache:

SECURE_SETTING_KEY="android.software.car.display_compatibility:settings:secure"
USER_ID_LIST=$(adb shell cmd user list -v | grep 'id=' | cut -d'=' -f2 | cut -d',' -f1)
for USER_ID in $USER_ID_LIST; do
    echo "Deleting Display Compat config for user: $USER_ID"
    adb shell settings delete secure --user $USER_ID $SECURE_SETTING_KEY
    sleep 1
    echo
done
  1. Adicione o arquivo de configuração e a declaração de recurso a um build do AAOS, por exemplo, em vendor/OEM_NAME/products/displaycompat:

    # File: vendor/OEM_NAME/products/displaycompat/Android.bp
    
    prebuilt_etc {
        name: "display_compat_config",
        filename: "display_compat_config.xml",
        src: "display_compat_config.xml",
        product_specific: true,
    }
    

Área de apps seguros

Os apps para smartphones e tablets geralmente não são criados para as grandes barras de sistema encontradas no Automotive. Esses apps não podem mostrar conteúdo abaixo das barras de sistema ou das sobreposições do sistema. Caso contrário, eles podem renderizar elementos interativos em uma área obscurecida do usuário final.

A área de app segura é implementada usando a interface escalonável SafeBounds.

Lógica de classificação de apps

Você pode usar CarPackageManager.requiresDisplayCompat(..) para criar mais funcionalidades que melhoram a compatibilidade do app. Por exemplo, é possível usar essa funcionalidade para adicionar um botão "Voltar" ou outra interface.

Os desenvolvedores de apps podem ativar a compatibilidade com telas de carro incluindo metadados no manifesto do app:

<meta-data
    android:name="android.software.car.display_compatibility"
    android:value="true" />

O sistema avalia se um app exige recursos de compatibilidade com telas de carro usando a seguinte lógica (avaliada em ordem):

  1. Metadados do manifesto android.software.car.display_compatibility:
    • Se android:value="true"O app exige compatibilidade
    • Se android:value="false"O app não exige compatibilidade
    • Se os metadados estiverem faltando, prossiga para a próxima verificação.
  2. Usa o recurso android.hardware.type.automotive:
    • Se o recurso for declarado (independente de android:required ser true ou false) → O app não exige compatibilidade
    • Se o recurso não estiver disponível, passe para a próxima verificação.
  3. Atividades em apps:
    • Se o app não tiver atividades (como RROs, apps headless ou serviços) → O app não exige compatibilidade
    • Se o app tiver atividades, siga para a próxima verificação.
  4. Informações sobre a inscrição:
    • Se o app for privilegiado → O app não exige compatibilidade
    • Se o app for um app do sistema (FLAG_SYSTEM) → O app não exige compatibilidade
    • Caso contrário, avance para a próxima verificação.
  5. Informações da assinatura:
    • Se o app for assinado pela plataforma (com a mesma assinatura do framework do Android) → O app não exige compatibilidade
    • Caso contrário, avance para a próxima verificação.
  6. Decisão de fallback:
    • Se todas as verificações forem aprovadas sem desativação → O app exige compatibilidade

Consulte CarDisplayCompatScaleProviderUpdatableImpl.requiresDisplayCompatNotCachedLocked.

Suporte do dispositivo

Os dispositivos que oferecem suporte à compatibilidade com telas de carro precisam declarar esse suporte usando a declaração de recurso:

<feature name="android.software.car.display_compatibility" />