Как добавить поддержку Android Automotive OS в шаблон приложения

Android Automotive OS позволяет устанавливать приложения в информационно-развлекательной системе автомобиля. Чтобы ваш продукт был доступен пользователям платформы, опубликуйте безопасную для водителя версию приложения, совместимую с Android Automotive OS. Вы можете использовать код и ресурсы приложения Android Auto практически без изменений. Однако нужно будет создать отдельную сборку, которая соответствует требованиям, описанным на этой странице.

Чтобы запустить автомобильное приложение в Android Automotive OS, вам понадобится последняя версия хоста шаблонов, который поставляется как системное приложение.

Обзор разработки

Чтобы добавить поддержку Android Automotive OS, выполните несколько действий, описанных в разделах ниже.

  1. Как создать автомобильный модуль
  2. Как заявить о поддержке Android Automotive OS
  3. Объявите CarAppService и CarAppActivity
  4. Как обновить зависимости Gradle

Чтобы все функции Automotive OS были включены, используйте Android Studio Bumblebee или более новую версию.

Как создать автомобильный модуль

Некоторые компоненты Android Automotive OS, например манифест, имеют требования, относящиеся к платформе. Создайте модуль, в котором код для этих компонентов будет отделен от другого кода в проекте, например кода, используемого для приложения для телефона.

Чтобы добавить автомобильный модуль в существующий проект, выполните следующие действия:

  1. В Android Studio нажмите File > New > New Module (Файл > Создать > Новый модуль).
  2. Выберите Модуль для автомобилей и нажмите Далее.
  3. Укажите название приложения или библиотеки. Это название будет показываться пользователям в Android Automotive OS.
  4. Укажите название модуля.
  5. Измените название пакета, чтобы оно совпадало с названием существующего приложения.
  6. В качестве минимальной версии SDK выберите API 29: Android 10 (Q) и нажмите Далее. Все автомобили, поддерживающие библиотеку Car App Library в Android Automotive OS, работают на Android 10 (уровень API 29) или более поздних версиях, поэтому выбор этого значения позволит охватить все совместимые автомобили.

  7. Выберите Добавить отсутствие действий и нажмите Готово.

Если вы начинаете новый проект:

  1. В Android Studio нажмите File > New > New Project (Файл > Создать > Новый проект).
  2. В разделе Тип проекта выберите Автомобили.
  3. Выберите No Activity (Без объекта activity) и нажмите Next (Далее).
  4. Укажите название проекта. Это название будет показываться пользователям в Android Automotive OS.
  5. Укажите название пакета. Подробнее о том, как выбрать название пакета, рассказывается в разделе Названия пакетов.
  6. В качестве минимальной версии SDK выберите API 29: Android 10 (Q) и нажмите Далее.

    Все автомобили, поддерживающие библиотеку Car App Library в Android Automotive OS, работают на Android 10 (уровень API 29) или более поздних версиях, поэтому выбор этого значения позволит охватить все совместимые автомобили.

После того как вы создадите модуль в Android Studio, откройте файл AndroidManifest.xml в новом автомобильном модуле:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.car.app">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" />

    <uses-feature
        android:name="android.hardware.type.automotive"
        android:required="true" />

</manifest>

Элемент <application> содержит стандартную информацию о приложении, а также элемент <uses-feature>, в котором объявлена поддержка Android Automotive OS. Обратите внимание, что в манифесте не объявлены действия.

Как заявлять требования к функциям

Затем добавьте в манифест следующий элемент uses-feature, чтобы указать, что для правильной работы требуется хост шаблона:

<manifest ...>
  ...
  <uses-feature
      android:name="android.software.car.templates_host"
      android:required="true" />
  ...
</manifest>

Кроме того, убедитесь, что ваше приложение соответствует требованиям Google Play, которые применяются ко всем приложениям, созданным для Android Automotive OS.

Как обновить зависимости Gradle

В автомобильный модуль необходимо добавить зависимость от артефакта androidx.car.app:app-automotive, который включает реализацию CarAppActivity, необходимую для работы приложения в Android Automotive OS.

Если вы разрабатываете приложение для Android Auto и Android Automotive OS, мы рекомендуем хранить CarAppService в отдельном модуле, который можно использовать в мобильном и автомобильном модулях. Если вы используете этот подход, вам нужно обновить автомобильный модуль, чтобы включить в него общий модуль с помощью зависимостей проекта Gradle, как показано в следующем фрагменте кода:

Яркий

buildscript {
    ...
    dependencies {
        ...
        implementation "androidx.car.app:app-automotive:car_app_library_version"
        implementation project(':shared_module_name')
    }
}

Kotlin

buildscript {
    ...
    dependencies {
        ...
        implementation("androidx.car.app:app-automotive:car_app_library_version")
        implementation(project(":shared_module_name"))
    }
}

Как заявить о поддержке Android Automotive OS

Чтобы указать, что ваше приложение поддерживает Android Automotive OS, добавьте в манифест следующую запись:

<application>
    ...
    <meta-data android:name="com.android.automotive"
        android:resource="@xml/automotive_app_desc"/>
    ...
</application>

Эта запись в манифесте относится к XML-файлу, в котором перечислены автомобильные функции, поддерживаемые вашим приложением.

Чтобы указать, что у вас есть приложение Car App Library, добавьте XML-файл с названием automotive_app_desc.xml в каталог res/xml/ в модуле Android Automotive OS. Этот файл должен содержать следующие данные:

<automotiveApp>
    <uses name="template"/>
</automotiveApp>

Как объявлять CarAppService и CarAppActivity

Как и в случае с Android Auto, в Android Automotive OS для запуска приложения используется реализация CarAppService. Инструкции по реализации и объявлению CarAppService приведены в статьях Как создать CarAppService и сеанс и Как объявить CarAppService.

В отличие от Android Auto, в Android Automotive OS вам нужно добавить ещё один компонент приложения – CarAppActivity, который будет точкой входа в ваше приложение. Реализация этого компонента включена в объект androidx.car.app:app-automotive и отвечает за взаимодействие с приложением хоста шаблонов для отрисовки интерфейса вашего приложения. В манифесте должен быть только один экземпляр этого объекта Activity, объявленный следующим образом:

<activity
    android:exported="true"
    android:theme="@android:style/Theme.DeviceDefault.NoActionBar"
    android:name="androidx.car.app.activity.CarAppActivity"
    android:launchMode="singleTask"
    android:label="Your app name">

    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

    <meta-data android:name="distractionOptimized" android:value="true" />

</activity>
  • android:name задано как полное имя класса CarAppActivity из артефакта app-automotive.
  • android:exported имеет значение true, поскольку объект activity должен запускаться не самим приложением, а другим приложением (средством запуска).
  • Для параметра android:launchMode задано значение singleTask, чтобы пользователь мог вернуться к тому же экземпляру действия из панели запуска, если он перейдет на другой экран.
  • android:theme имеет значение @android:style/Theme.DeviceDefault.NoActionBar, поэтому приложение занимает все доступное ему пространство на экране.
  • Фильтр интентов указывает, что это действие запуска приложения.
  • Элемент <meta-data> указывает ОС, что приложение можно использовать при действующих ограничениях UX, например когда автомобиль находится в движении.

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

<activity
    android:exported="true"
    android:theme="@android:style/Theme.DeviceDefault.NoActionBar"
    android:name="androidx.car.app.activity.CarAppActivity"
    android:launchMode="singleTask"
    android:label="Your app name">

    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <!-- Include the category below ONLY for navigation apps -->
        <category android:name="android.intent.category.APP_MAPS" />
    </intent-filter>

    <!-- Include the intent-filter below ONLY for navigation apps -->
    <intent-filter>
        <action android:name="androidx.car.app.action.NAVIGATE" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="geo" />
    </intent-filter>

    <meta-data android:name="distractionOptimized" android:value="true" />

</activity>
  • Дополнительная категория android.intent.category.APP_MAPS сообщает системе, что ваше приложение может показывать местоположение пользователя.
  • androidx.car.app.action.NAVIGATE Фильтр интентов позволяет пользователям выбирать ваше приложение при обработке неявного интента навигации из другого автомобильного приложения.

Чтобы улучшить работу приложения на основе шаблона на устройствах с Android Automotive OS, вы можете добавить поддержку ссылок на контент в файл CarAppActivity. Например, это позволяет пользователям открывать ваше приложение прямо из браузера или при получении URL, которым поделились с телефона с помощью Быстрой отправки.

Как добавить фильтры intent для ссылок на контент

Чтобы сообщить ОС, что ваше приложение может обрабатывать ссылки на контент, добавьте подходящие фильтры intent в элемент <activity> для CarAppActivity приложения. Дополнительные инструкции можно найти в разделе Добавьте фильтры intent для входящих ссылок.

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

Чтобы обрабатывать намерения, ваше приложение должно считывать данные из входящих намерений как при создании Session приложения для автомобиля во время onCreateScreen(), так и при получении нового намерения во время onNewIntent():

class MySession : Session() {
    // ...
    override fun onCreateScreen(intent: Intent): Screen {
        // Handle the intent when the app is being started for the first time
        return MyStartScreen(carContext)
    }

    override fun onNewIntent(intent: Intent) {
        // Handle the intent when the app is already running
    }
}

О чем ещё нужно помнить

При разработке приложения для Android Automotive OS учитывайте следующие факторы:

Названия пакетов

Поскольку вы распространяете отдельный пакет Android (APK) для Android Automotive OS, вы можете использовать название пакета из мобильного приложения или создать новое. Если вы используете другое название пакета, у вашего приложения будет две страницы в Google Play. Если вы используете то же название пакета, что и раньше, у вашего приложения будет одна страница для обеих платформ.

Это в первую очередь бизнес-решение. Например, если одна команда работает над мобильным приложением, а другая – над приложением для Android Automotive OS, то имеет смысл использовать разные названия пакетов и позволить каждой команде управлять своей страницей приложения в Google Play. Оба подхода требуют примерно одинаковых технических усилий.

В таблице ниже описаны основные различия между сохранением текущего названия пакета и использованием нового.

Функция Одинаковое название пакета Новое название пакета
Страница приложения в Google Play Одиночный Несколько
Зеркальная установка Да: быстрая переустановка приложений во время работы мастера настройки. Нет
Процесс проверки в Google Play Блокировка отзывов. Если проверка одного APK не пройдена, другие APK, отправленные в том же выпуске, блокируются. Отдельные отзывы
Статистика, показатели и жизненные показатели Комбинированный: вы можете фильтровать данные, относящиеся к автомобилям, по названию устройства. Разделить
Индексирование и ранжирование в поиске Как использовать текущий статус Не переносится
Интеграция с другими приложениями Скорее всего, ничего менять не нужно, если код медиаконтента используется в обоих APK-файлах. Может потребоваться обновить соответствующее приложение, например для воспроизведения URI с помощью Google Ассистента.

Офлайн-контент

Если это необходимо, добавьте в приложение поддержку офлайн-режима. Автомобили с Android Automotive OS должны иметь собственное подключение к интернету, то есть тарифный план на мобильный интернет включен в стоимость автомобиля или оплачивается пользователем. Однако подключение автомобилей к интернету может быть более нестабильным, чем подключение мобильных устройств.

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

  • Лучше всего скачивать контент, когда приложение открыто.
  • Не предполагайте, что Wi-Fi доступен. Автомобиль может никогда не оказаться в зоне действия сети Wi-Fi, или производитель оригинального оборудования (OEM) мог отключить Wi-Fi в пользу мобильной сети.
  • Хотя кэширование контента, который, как вы ожидаете, будут использовать пользователи, допустимо, мы рекомендуем разрешить пользователям изменять это поведение.
  • Объем памяти в автомобилях различается, поэтому предоставьте пользователям возможность удалять офлайн-контент.

Часто задаваемые вопросы

Ниже приведены ответы на часто задаваемые вопросы об ОС Android Automotive.

Есть ли ограничения или рекомендации по использованию сторонних SDK и библиотек?

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

Как опубликовать приложение для Android Automotive OS в Google Play Console?

Подробнее о том, как публиковать приложения для Android Automotive OS в Google Play Console…

Устранение неполадок

Ниже приведены распространенные сценарии устранения неполадок в Android Automotive OS.

  • Даже после удаления приложения Car App Library из системных настроек при попытке установить новую версию возникает ошибка.

    Чтобы убедиться, что приложение удалено, используйте команду adb uninstall app.package.name.