Совместимость с автомобильными дисплеями

Совместимость с автомобильными дисплеями позволяет приложениям для телефонов и планшетов хорошо работать на автомобильных устройствах.

В число функций входят:

  • Масштабирование DPI: Масштабирование элементов пользовательского интерфейса приложения в зависимости от разрешения экрана (DPI).
  • Безопасная область для отрисовки приложения: Разместите содержимое приложения в безопасной области, избегая его заслонения элементами пользовательского интерфейса системы.
  • Логика классификации приложений: Выявление приложений, требующих совместимости с автомобильными дисплеями.

Функции совместимости

Платформа предоставляет несколько механизмов для оптимизации отрисовки и масштабирования приложений на автомобильных дисплеях.

масштабирование DPI

Функция масштабирования DPI позволяет производителям устройств масштабировать плотность DPI отдельных приложений или всех приложений, требующих совместимости с автомобильным дисплеем.

Чтобы настроить масштабирование плотности приложений:

  1. Добавьте конфигурационный файл /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. Чтобы установить значение масштабирования по умолчанию для всех приложений, требующих совместимости с автомобильным дисплеем, измените значение масштабирования по умолчанию для дисплея 0 на <scale display="0">1.0</scale> . Это значение является обратным значением масштабирования . Например, чтобы масштабировать приложения, требующие совместимости с автомобильным дисплеем, до 1,5x, установите значение масштабирования равным (1 / 1.5) = 0.67 :

    <config>
        <scale display="0">0.67</scale>
    </config>
    
  3. Чтобы задать значение масштаба для конкретного приложения, добавьте новый элемент scale в конфигурацию. В этом примере масштаб YouTube Automotive составляет 1,43x (например, (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>
    

Если система работала во время внесения изменений в файл /product/etc/display_compat_config.xml , необходимо очистить кэш, чтобы новые настройки вступили в силу. Используйте этот макрос для очистки кэша:

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. Добавьте файл конфигурации и объявление функции в сборку AAOS, например, в 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,
    }
    

Безопасная область приложения

Приложения для телефонов и планшетов часто не предназначены для больших системных панелей, характерных для автомобильной тематики. Необходимо ограничить отображение контента под системными панелями или системными наложениями. В противном случае интерактивные элементы могут отображаться в области, скрытой от конечного пользователя.

Безопасная область приложения реализована с использованием функции Scalable UI SafeBounds .

Логика классификации приложений

Вы можете использовать CarPackageManager.requiresDisplayCompat(..) для создания дополнительной функциональности, повышающей совместимость приложения. Например, вы можете использовать эту функциональность для добавления кнопки «Назад» или дополнительного пользовательского интерфейса.

Разработчики приложений могут включить совместимость с автомобильными дисплеями, добавив метаданные в манифест приложения:

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

Система определяет, требуются ли приложению функции совместимости с автомобильным дисплеем, используя следующую логику (оценка производится по порядку):

  1. Метаданные манифеста android.software.car.display_compatibility :
    • Если android:value="true"Приложение требует совместимости
    • Если android:value="false"Приложение не требует совместимости
    • Если метаданные отсутствуют, перейдите к следующей проверке.
  2. Использует функцию android.hardware.type.automotive :
    • Если функция объявлена ​​(независимо от того, имеет ли android:required значение true или false ) → Приложению не требуется совместимость.
    • Если функция отсутствует, перейдите к следующей проверке.
  3. Действия в приложении:
    • Если приложение не содержит никаких действий (например, RRO, безголовых приложений или сервисов) → Приложение не требует совместимости
    • Если в приложении есть раздел "Активность", переходите к следующей проверке.
  4. Информация о приложении:
    • Если приложение имеет привилегированные права доступа → Приложение не требует совместимости
    • Если приложение является системным ( FLAG_SYSTEM ) → Приложение не требует совместимости
    • В противном случае переходите к следующей проверке.
  5. Подпись:
    • Если приложение подписано с использованием той же платформенной подписи (что и структура Android), то приложению не требуется совместимость.
    • В противном случае переходите к следующей проверке.
  6. Резервное решение:
    • Если все проверки пройдут без отказа от участия → Приложение требует совместимости

См. CarDisplayCompatScaleProviderUpdatableImpl.requiresDisplayCompatNotCachedLocked .

Поддержка устройств

Устройства, поддерживающие совместимость с автомобильными дисплеями, должны заявить о поддержке с помощью объявления функции:

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