Android Automotive OS позволяет пользователям устанавливать приложения в автомобиле. Чтобы охватить пользователей на этой платформе, вам необходимо распространить оптимизированное для водителя приложение, совместимое с Android Automotive OS. Вы можете повторно использовать почти весь код и ресурсы в своем приложении Android Auto, но вы должны создать отдельную сборку, которая соответствует требованиям, описанным на этой странице.
Для запуска вашего автомобильного приложения на Android Automotive OS вам понадобится последняя версия Templates Host, которая поставляется как системное приложение.
Обзор развития
Добавление поддержки Android Automotive OS требует всего нескольких шагов, как описано в разделах на этой странице:
- Создать автомобильный модуль
- Объявить о поддержке Android Automotive OS
- Объявите
CarAppService
иCarAppActivity
- Обновите зависимости Gradle
Используйте Android Studio Bumblebee или более новую версию, чтобы убедиться, что все функции автомобильной ОС включены.
Создать автомобильный модуль
Некоторые компоненты Android Automotive OS, такие как манифест, имеют специфические требования к платформе. Создайте модуль, который может хранить код для этих компонентов отдельно от другого кода в вашем проекте, например, кода, используемого для вашего приложения для телефона.
Для существующего проекта выполните следующие действия, чтобы добавить в него автомобильный модуль:
- В Android Studio нажмите Файл > Создать > Новый модуль .
- Выберите «Автомобильный модуль» , затем нажмите «Далее» .
- Укажите имя приложения/библиотеки . Это имя, которое пользователи видят для вашего приложения на Android Automotive OS.
- Введите имя модуля .
- Измените имя пакета так, чтобы оно соответствовало вашему существующему приложению.
Выберите API 29: Android 10 (Q) для Minimum SDK , затем нажмите Next . Все автомобили, поддерживающие Car App Library на Android Automotive OS, работают на Android 10 API уровня 29 или выше, поэтому выбор этого значения нацелен на все совместимые автомобили.
Выберите Добавить без активности , затем нажмите Готово .
Если вы начинаете новый проект:
- В Android Studio нажмите Файл > Создать > Новый проект .
- Выберите «Автомобилестроение» в качестве типа проекта .
- Выберите «Нет активности» , затем нажмите «Далее» .
- Укажите Имя для вашего проекта. Это имя, которое пользователи видят для вашего приложения на Android Automotive OS.
- Введите имя пакета . Подробнее о выборе имени пакета см. в разделе Имена пакетов.
Выберите API 29: Android 10 (Q) для минимального SDK , затем нажмите Далее .
Все автомобили, поддерживающие библиотеку приложений 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
чтобы указать, что для правильной работы требуется хост шаблона:
<application ...>
...
<uses-feature
android:name="android.software.car.templates_host"
android:required="true" />
</application>
Кроме того, убедитесь, что ваше приложение соответствует требованиям к функциям 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') } }
Котлин
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, вам необходимо включить дополнительный компонент приложения, CarAppActivity
, который будет служить точкой входа для вашего приложения Android Automotive OS. Реализация этой активности включена в артефакт androidx.car.app:app-automotive
и отвечает за связь с шаблонным хост-приложением для визуализации пользовательского интерфейса вашего приложения. У вас должен быть только один экземпляр этой активности в вашем манифесте, и он должен быть объявлен следующим образом:
<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
, поскольку активность должна быть доступна для запуска другим приложением, а не только ею самой (а именно, средством запуска). -
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-адреса, отправленного с телефона с помощью Quick Share .
Добавить фильтры намерений глубоких ссылок
Чтобы сообщить ОС, что ваше приложение может обрабатывать глубокие ссылки, вам нужно добавить соответствующие фильтры намерений в элемент <activity>
для CarAppActivity
вашего приложения. Дополнительные указания см. в разделе Добавление фильтров намерений для входящих ссылок .
Для лучшего пользовательского опыта мы рекомендуем поддерживать все глубинные ссылки, поддерживаемые вашим мобильным приложением, которые могут быть разумно поддержаны вашим автомобильным приложением.
Обработка намерений глубоких ссылок
Для обработки намерений ваше приложение должно считывать данные из входящих намерений как при создании 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
}
override fun onNewIntent(intent: Intent) {
// Handle the intent when the app is already running
}
}
Другие соображения
При разработке приложения для Android Automotive OS учитывайте следующие моменты:
Названия пакетов
Поскольку вы распространяете отдельный Android Package Kit (APK) для Android Automotive OS, вы можете повторно использовать имя пакета из вашего мобильного приложения или создать новое имя пакета. Если вы используете другое имя пакета, ваше приложение будет иметь два отдельных листинга в Play Store. Если вы повторно используете текущее имя пакета, ваше приложение будет иметь один листинг на обеих платформах.
Это преимущественно бизнес-решение. Например, если у вас есть одна команда, работающая над мобильным приложением, и отдельная команда, работающая над приложением Android Automotive OS, то может иметь смысл иметь отдельные имена пакетов и позволить каждой команде управлять своим собственным списком в Play Store. Нет большой разницы в технических усилиях, необходимых для использования любого из подходов.
В следующей таблице приведены некоторые другие ключевые различия между сохранением текущего имени пакета и использованием нового имени пакета:
Особенность | То же имя пакета | Новое имя пакета |
---|---|---|
Список магазинов | Одинокий | Несколько |
Зеркальная установка | Да: быстрая переустановка приложения во время работы мастера установки | Нет |
Процесс проверки Play Store | Блокировка обзоров: если обзор одного APK не пройден, другие APK, представленные в том же выпуске, блокируются. | Индивидуальные обзоры |
Статистика, метрики и показатели | Комбинированный: вы можете фильтровать данные, относящиеся к автомобилям, по названию устройства. | Отдельный |
Индексирование и поисковый рейтинг | Опирайтесь на текущее положение | Нет переноса |
Интеграция с другими приложениями | Скорее всего, никаких изменений не потребуется, если предположить, что медиа-код является общим для обоих APK. | Возможно, придется обновить соответствующее приложение, например, для воспроизведения URI с помощью Google Assistant. |
Оффлайн контент
Если применимо, реализуйте поддержку офлайн в своем приложении. Автомобили с Android Automotive OS должны иметь собственное подключение к данным, то есть тарифный план включен в стоимость автомобиля или оплачивается пользователем. Однако ожидается, что автомобили также будут иметь более изменчивое подключение, чем мобильные устройства.
Вот несколько вещей, которые следует учитывать при выборе стратегии офлайн-поддержки:
- Лучшее время для загрузки контента — когда ваше приложение используется.
- Не думайте, что WiFi доступен. Автомобиль может никогда не попасть в зону действия WiFi, или производитель оригинального оборудования (OEM) мог отключить WiFi в пользу сотовой сети.
- Хотя разумное кэширование контента, который, как вы ожидаете, будут использовать пользователи, вполне допустимо, мы рекомендуем вам разрешить пользователю изменять это поведение.
- Объем дискового пространства на автомобилях различается, поэтому предоставьте пользователям возможность удалять офлайн-контент.
Часто задаваемые вопросы
В следующих разделах приведены ответы на некоторые часто задаваемые вопросы об Android Automotive OS.
Существуют ли какие-либо ограничения или рекомендации по использованию сторонних 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
.