Compatibilidad de la pantalla del vehículo

La compatibilidad con pantallas de vehículos permite que las apps para teléfonos y tablets funcionen bien en dispositivos automotrices.

Se incluyen las siguientes funciones:

  • Escalamiento de DPI: Ajusta los elementos de la IU de la app según el DPI de la pantalla.
  • Área segura para la renderización de apps: Contiene el contenido de la app dentro de un área segura, lo que evita que los elementos de la IU del sistema lo oculten.
  • Lógica de clasificación de apps: Identifica las apps que requieren compatibilidad con pantallas de vehículos.

Funciones de compatibilidad

La plataforma proporciona varios mecanismos para optimizar la renderización y el escalamiento de apps en pantallas automotrices.

Escalamiento de DPI

La función de escalamiento de DPI permite que los fabricantes de dispositivos ajusten el DPI de densidad de apps individuales o de todas las apps que requieren compatibilidad con pantallas de vehículos.

Para configurar el escalamiento de densidad de las apps, haz lo siguiente:

  1. Agrega un archivo de configuración /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 establecer un valor de escala predeterminado para todas las apps que requieren compatibilidad con pantallas de vehículos, cambia la escala predeterminada para la pantalla 0 a <scale display="0">1.0</scale>. El valor es el valor de escala inversa. Por ejemplo, para escalar apps que requieren compatibilidad con pantallas de vehículos a 1.5x, establece el valor de escala en (1 / 1.5) = 0.67:

    <config>
        <scale display="0">0.67</scale>
    </config>
    
  3. Para establecer un valor de escala para una app específica, agrega un nuevo elemento scale a la configuración. En este ejemplo, YouTube Automotive se escala a 1.43x (por ejemplo, (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>
    

Si el sistema se estaba ejecutando cuando cambiaste /product/etc/display_compat_config.xml, debes borrar la caché para que la nueva configuración surta efecto. Usa esta macro para borrar la caché:

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. Agrega el archivo de configuración y la declaración de funciones a una compilación de AAOS, por ejemplo, en 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 segura de la app

Las apps para teléfonos y tablets no suelen estar diseñadas para las barras grandes del sistema que se encuentran en Automotive. Se debe restringir que estas apps dibujen contenido debajo de las barras del sistema o las superposiciones del sistema. De lo contrario, podrían renderizar elementos interactivos en un área oculta para el usuario final.

El área segura de la app se implementa con la IU escalable SafeBounds.

Lógica de clasificación de apps

Puedes usar CarPackageManager.requiresDisplayCompat(..) para compilar funciones adicionales que mejoren la compatibilidad de las apps. Por ejemplo, puedes usar esta función para agregar un botón Atrás o una IU adicional.

Los desarrolladores de apps pueden habilitar la compatibilidad con pantallas de vehículos si incluyen metadatos en el manifiesto de la app:

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

El sistema evalúa si una app requiere funciones de compatibilidad con pantallas de vehículos con la siguiente lógica (evaluada en orden):

  1. Metadatos del manifiesto android.software.car.display_compatibility:
    • Si android:value="true"La app requiere compatibilidad
    • Si android:value="false"La app no requiere compatibilidad
    • Si faltan metadatos, continúa con la comprobación siguiente.
  2. Usa la función android.hardware.type.automotive:
    • Si se declara la función (independientemente de si android:required es true o false) → La app no requiere compatibilidad
    • Si falta la función, continúa con la comprobación siguiente.
  3. Actividades de la app:
    • Si la app no tiene actividades (como RRO, apps sin interfaz gráfica o servicios) → La app no requiere compatibilidad
    • Si la app tiene actividades, continúa con la comprobación siguiente.
  4. Información de la aplicación:
    • Si la app tiene privilegios → La app no requiere compatibilidad
    • Si la app es una app del sistema (FLAG_SYSTEM) → La app no requiere compatibilidad
    • De lo contrario, continúa con la comprobación siguiente.
  5. Información de la firma:
    • Si la app está firmada por la plataforma (firmada con la misma firma que el framework de Android) → La app no requiere compatibilidad
    • De lo contrario, continúa con la comprobación siguiente.
  6. Decisión de resguardo:
    • Si todas las verificaciones se aprueban sin inhabilitar la función → La app requiere compatibilidad

Consulta CarDisplayCompatScaleProviderUpdatableImpl.requiresDisplayCompatNotCachedLocked.

Dispositivos compatibles

Los dispositivos que admiten la compatibilidad con pantallas de vehículos deben declarar la compatibilidad con la declaración de funciones:

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